2012-07-19 15 views
46

मेरे पास केवल एक शब्द फ़िल्टर के साथ निम्नलिखित लोचदार खोज क्वेरी है। मेरी क्वेरी बहुत जटिल है लेकिन मैं यहां इस मुद्दे को दिखाने की कोशिश कर रहा हूं।शब्द फ़िल्टर के साथ लोचदार खोज हाइफ़न समस्या

{ 
    "filter": { 
      "term": { 
        "field": "update-time" 
       } 
     } 
} 

जब मैं फ़िल्टर में एक हाइफेनेटेड मान में जाता हूं, तो मुझे शून्य परिणाम मिलते हैं। लेकिन अगर मैं एक निर्जलित मूल्य के बिना कोशिश करता हूं तो मुझे परिणाम मिलते हैं। मुझे यकीन नहीं है कि हाइफ़न यहां एक मुद्दा है लेकिन मेरा परिदृश्य मुझे विश्वास दिलाता है।

क्या हाइफ़न से बचने का कोई तरीका है ताकि फ़िल्टर परिणाम लौटाए? मैंने एक बैक स्लैश के साथ हाइफ़न से बचने की कोशिश की है जिसे मैंने ल्यूसीन मंचों से पढ़ा लेकिन इससे मदद नहीं मिली।

इसके अलावा, अगर मैं इस क्षेत्र में एक GUID मान में गुजरता हूं जो घुंघराले ब्रेसिज़ द्वारा हाइफेनेटेड और घिरा हुआ है, तो मुझे कुछ जैसे- {ASD23-34SD-DFE1-42FWW}, क्या मुझे वर्णमाला वर्णों को कम करने की आवश्यकता होगी और क्या मैं घुंघराले ब्रेसिज़ से बचने की जरूरत है?

धन्यवाद

+0

मैं एक दिन बर्बाद केवल यह पता लगाने की है कि वापस किसी भी दस्तावेज नहीं मिल रहा है की समस्या एक बुरा क्वेरी के लिए, लेकिन मेरे परीक्षण उदाहरण में कोई हाइफ़न के कारण की वजह से नहीं था ... –

उत्तर

79

मुझे लगता है कि होता है कि अपने क्षेत्र का विश्लेषण किया जाता है, जो elasticsearch में स्ट्रिंग क्षेत्रों के लिए डिफ़ॉल्ट सेटिंग है। नतीजतन, जब यह अनुक्रमित किया गया है तो इसे "अपडेट-टाइम" शब्द के रूप में अनुक्रमित नहीं किया गया है बल्कि इसके बजाय 2 शब्द: "अपडेट" और "टाइम" के रूप में सूचीबद्ध नहीं है। यही कारण है कि आपकी शब्द खोज इस शब्द को नहीं मिल सकती है। यदि आपके फ़ील्ड में हमेशा वे मान होंगे जो पूरी तरह से मिलान किए जाएंगे, तो विश्लेषण के रूप में मैपिंग में ऐसे फ़ील्ड को परिभाषित करना सबसे अच्छा होगा। आप नए मानचित्रण के साथ सूचकांक पुनः द्वारा यह कर सकते हैं:

curl -XPUT http://localhost:9200/your-index -d '{ 
    "mappings" : { 
     "your-type" : { 
      "properties" : { 
       "field" : { "type": "string", "index" : "not_analyzed" } 
      } 
     } 
    } 
}' 

curl -XPUT http://localhost:9200/your-index/your-type/1 -d '{ 
    "field" : "update-time" 
}' 

curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{ 
    "filter": { 
     "term": { 
       "field": "update-time" 
     } 
    } 
}' 

वैकल्पिक रूप से, अगर आप इस क्षेत्र के आधार पर रिकॉर्ड खोजने में कुछ लचीलापन चाहते हैं, तो आप इस क्षेत्र का विश्लेषण किया रखने के लिए और के बजाय पाठ प्रश्नों का उपयोग कर सकते हैं:

curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{ 
    "query": { 
     "text": { 
       "field": "update-time" 
     } 
    } 
}' 

कृपया ध्यान रखें कि यदि आपके क्षेत्र का विश्लेषण किया गया है तो यह रिकॉर्ड केवल "अपडेट" या शब्द "समय" शब्द खोजकर मिलेगा।

@Field(type = FieldType.String, index = FieldIndex.not_analyzed) 

बजाय

@Field(type = FieldType.String) 

समस्या आप की जरूरत है:

+0

मैं बस में जोड़ने के लिए जा रहा था एक जवाब के रूप में। विस्तार स्पष्टीकरण के लिए धन्यवाद। – Gabbar

+2

ग्रेट उत्तर। आप "टेक्स्ट" को "मैच" में बदलना चाहेंगे। Elasticsearch बहिष्कृत पाठ की तरह देखा और इसे मैच के साथ बदल दिया। – khuderm

0

आप spring-data-elasticsearch उपयोग कर रहे हैं @imotov द्वारा जवाब के आधार पर तो तुम सब करने की जरूरत है अपने क्षेत्र के रूप में चिह्नित है इंडेक्स को छोड़ दें और इसे नए मैपिंग के साथ फिर से चालू करें।

1

स्वीकार्य उत्तर मेरे लिए लोचदार 6.1 के साथ काम नहीं करता है। मैंने इसे "कीवर्ड" फ़ील्ड का उपयोग करके हल किया जो लोचदार स्ट्रिंग फ़ील्ड पर डिफ़ॉल्ट रूप से प्रदान करता है।

{ 
    "filter": { 
      "term": { 
        "field.keyword": "update-time" 
       } 
     } 
} 
संबंधित मुद्दे