2014-06-14 13 views
10

के लिए मेल नहीं खाता है तो मुझे Elasticsearch के साथ एक अजीब समस्या का सामना करना पड़ रहा है। मेरा मैपिंग निर्दिष्ट करता है कि एक निश्चित फ़ील्ड long प्रकार है। अब गलती से मैं कुछ दस्तावेजों को इंडेक्स करने की कोशिश कर रहा था, जिसमें stringlong के बजाय उस फ़ील्ड के लिए टाइप किया गया था। मुझे Elasticsearch से कोई त्रुटि नहीं मिली लेकिन दस्तावेजों को कभी अनुक्रमित नहीं किया गया था। जब मैंने इस मुद्दे को ठीक किया तो दस्तावेज़ों को अनुक्रमित किया गया था।एलैस्टिकसेच चुपचाप विफल रहता है यदि दस्तावेज़

उदाहरण:

मेरे मानचित्रण:

{ 
    "field1": { 
     "type": "long" 
    } 
} 

जब मैं इस दस्तावेज़ भेजने यह चुपचाप विफल रहता है: के रूप में उम्मीद

{ 
    "field1": "this is a string" 
} 

जब मैं इस भेजने के काम करता है:

{ 
    "field1": 12345 
} 

क्या इस तरह की त्रुटियों का पता लगाने का कोई तरीका है?

+0

आप प्रतिक्रिया आप Elasticsearch से वापस हो रही है जब आप इस मूक सूचकांक विफलता है बता सकते हैं? –

+0

शायद आपके पास [ignore_malformed] है (https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html#mapping-settings) ध्वज वैश्विक स्तर पर सत्य पर सेट है। क्या आप एक उदाहरण दस्तावेज प्रदान कर सकते हैं जिसे आपने अनुक्रमित किया है जिसके कारण यह चुपचाप विफल हो गया है, यह भी elasticsearch का संस्करण है। – keety

+0

उदाहरण के लिए मेरा अद्यतन प्रश्न देखें। मुझे लगता है कि जिस ध्वज का आपने अभी उल्लेख किया है वह वह हो सकता है जो मैं ढूंढ रहा था। एकमात्र मुद्दा यह है कि यह केवल विकृत क्षेत्र को अनदेखा कर देगा, लेकिन फिर भी उस क्षेत्र के बाकी हिस्सों को अनुक्रमित करेगा जो उस क्षेत्र के लिए मेरे लिए अच्छा नहीं है। मैं इसे विफल करना चाहता हूं और एक त्रुटि लौटाता हूं अगर यह एक विकृत फ़ील्ड को इंडेक्स करने का प्रयास करता है। क्या ऐसा करने के लिए कोई रास्ता है? –

उत्तर

4

आप गलत पर ignore_malformed स्ट्रिंग सेट करते हैं। यह दस्तावेज़ को अनुक्रमित नहीं करेगा अगर यह विकृत है लेकिन अपवाद फेंकता है। कम से कम elasticsearch 1.6.0 में।

उदाहरण:

put test 

put test/test/_mapping 
{ 
    "properties" : { 
     "title" : {"type" : "string"}, 
     "data" : {"type": "long" ,"ignore_malformed":false} 

    } 
} 

put test/test/1 
{ 
    "data" : "1", 
    "title" : "valid coerce string to number" 
} 

put test/test/2 
{ 
    "data" : "hello", 
    "title" : "invalid number" 
} 

#Failed Response 
{ 
    "error": "MapperParsingException[failed to parse [data]]; nested: NumberFormatException[For input string: \"hello\"]; ", 
    "status": 400 
} 

Query with Get fails 

get test/test/2 


{ 
    "_index": "test", 
    "_type": "test", 
    "_id": "2", 
    "found": false 
} 
5

मुझे लगता है अपने मानचित्रण इस जैसा दिखता है:

{ 
    "long_field": { 
     "type": "long" 
    } 
} 

अगर ऐसी बात है, तो आप false को coerce ध्वज सेट कर सकते हैं के रूप में यह true by default है और हमेशा नंबर पर तार बदलने और के लिए अंशों काट-छांट करने की कोशिश करेंगे पूर्णांकों।

{ 
    "long_field": { 
     "type": "long", 
     "coerce": false 
    } 
} 

आप ऐसा करते हैं तो अगली बार जब आप एक स्ट्रिंग के रूप एक लंबे क्षेत्र सूचकांक करने के लिए प्रयास करते हैं, तो आप इस ES बता देंगे:

MapperParsingException[failed to parse [long_field]]; nested: IllegalArgumentException[Long value passed as String]; 
+1

उत्कृष्ट क्यू एंड ए +1 +1 दोनों से सीखा - धन्यवाद – Chris

+0

आपके उत्तर के लिए धन्यवाद। हां मेरा मैपिंग एक लंबा प्रकार निर्दिष्ट करता है (मेरा अद्यतन प्रश्न देखें) लेकिन मैं तारों को इंडेक्स करना चाहता हूं जिन्हें पूर्णांक में परिवर्तित नहीं किया जा सकता है। तो मुझे नहीं लगता कि यह इस मामले में काम करेगा लेकिन यह अन्य मामलों के लिए उपयोगी है। धन्यवाद! –

+0

बस यह सुनिश्चित करने के लिए: "कौन नहीं कर सकता" या "कौन सा कर सकता है"? जिस तरह से मैं समझता हूं कि आप सफल होने के लिए '123" '(स्ट्रिंग के रूप में संख्या) और '123' (लंबे समय तक संख्या) चाहते हैं, लेकिन विफल होने के लिए" संख्या नहीं "(खराब स्ट्रिंग)। क्या वो सही है? – Val

संबंधित मुद्दे