2015-08-27 5 views
5

जब मैं किसी फ़ील्ड पर खोज करता हूं तो स्कोरिंग क्षेत्र की लंबाई को ध्यान में रखती नहीं है (यानी लंबे पाठ वाले दस्तावेज कम के समान होते हैं और किसी कारण से पहले रखा जाता है)। यकीन नहीं है कि मैं क्या गलत कर रहा हूँ।Elasticsearch EdgeNgram कम परिणाम लौटने से पहले

अनुक्रमण क्षेत्रों के लिए इस प्रकार है:

"name": { 
     "type": "string", 
     "analyzer": "autocomplete" 
     }, 
"_alias": { 
     "type": "string", 
     "analyzer": "autocomplete" 
     } 

विश्लेषक:

"autocomplete": { 
     "char_filter": [ 
      "special_character_mapping" 
     ], 
     "filter": [ 
      "lowercase", 
      "autocomplete_filter" 
     ], 
     "tokenizer": "whitespace" 
     } 

फिल्टर:

"autocomplete_filter": { 
       "type": "edge_ngram", 
       "min_gram": 1, 
       "max_gram": 20 
       } 

क्वेरी 1:

{ 
    "query": { 
     "multi_match": { 
      "query": "brown fo", 
      "type": "most_fields", 
      "fields": [ 
       "name", 
       "_alias" 
      ], 
      "use_dis_max": true, 
      "tie_breaker": 1, 
      "minimum_should_match": "100%", 
      "analyzer": "standard" 
     } 
    } 
} 

इस दस्तावेज की तरह कर रहे हैं की एक बहुत कुछ देता है:

  • ढंग से लोमड़ी
  • भूरा लोमड़ियों
  • के लिए

Browny और 10 वें स्थान पर या तो नहीं है अंत में:

  • ब्राउन लोमड़ी

नहीं 15 वें स्थान पर एक दस्तावेज़ (ब्राउन लोमड़ी पेड़) या तो भी एक उपनाम "ब्राउन" जाता है कि पर ध्यान नहीं दिया गया है कि है कि वहाँ का उल्लेख।

क्वेरी 2:

  • ब्राउन लोमड़ी पेड़
  • भूरा लोमड़ियों
  • ब्राउन लोमड़ी
  • :

    { 
        "query": { 
         "multi_match": { 
          "query": "brown fo", 
          "type": "cross_fields", 
          "fields": [ 
           "name", 
           "_alias" 
          ], 
          "use_dis_max": true, 
          "tie_breaker": 1, 
          "minimum_should_match": "100%", 
          "analyzer": "standard" 
         } 
        } 
    } 
    

    यह कुछ हद तक बेहतर परिणाम देता है

जहां दूसरे और 3 डी दस्तावेज़ हमेशा समान होते हैं। पहले व्यक्ति के पास उपनाम "ब्राउन" होता है और ठीक से सामने आता है।

मैंने सभी प्रकार के multi_match प्रकारों और query_string की कोशिश की है लेकिन परिणाम समान थे।

छोटे पाठ वाले दस्तावेज़ों को कैसे प्राप्त करें (ल्यूसीन इसे स्वयं ही करना चाहिए?) बाकी के सामने?

+0

मेरे पास दो बिंदु हैं: 1) आप अपनी क्वेरी में 'मानक' विश्लेषक क्यों निर्दिष्ट करते हैं भले ही आपने 'autocomplete' को आपके द्वारा खोजे जाने वाले फ़ील्ड के लिए खोज और अनुक्रमणिका विश्लेषक के रूप में निर्दिष्ट किया हो और 2) आप' 'प्रकार' गायब हैं ":" कस्टम "' आपके 'स्वत: पूर्ण' विश्लेषक में। खोज समय पर – Val

+0

मानक का उपयोग किया जाना चाहिए (https://www.elastic.co/guide/en/elasticsearch/guide/current/_index_time_search_as_you_type.html)। हालांकि इस प्रकार के बारे में पता नहीं है, कोड में कैसे खो गया है। इसका मतलब क्या है यदि आप टाइप नहीं करते हैं: "कस्टम"? –

+0

क्या आपने स्कोरिंग की गणना कैसे की है यह देखने के लिए आपने '? Expl = true' जोड़ने का प्रयास किया है? – Val

उत्तर

0

अपने क्षेत्रों name के बाद से और _aliasautocomplete विश्लेषक (ध्यान दें कि जब से तुम केवल अनुक्रमण समय में है कि विश्लेषक का उपयोग कर रहे हैं, तो आप analyzer के बजाय index_analyzer निर्दिष्ट करना चाहिए) के साथ निर्दिष्ट किया गया है, आपके इनपुट होने जा रहा है:

  1. चरण 1 से
  2. टोकन सफेद रिक्तियों से अलग
  3. चरण 2 से लोवरकेस टोकन उपसर्गों में विभाजित किया जा जा रहे हैं लोवरकेस में करने जा रहे हैं

तो सभी इनपुट पाठ आप ऊपर दिया है के लिए, यह इस प्रकार है:

ढंग से लोमड़ी =>b, br, bro, brow, brown, browne, browned, f, fo, fox

भूरा लोमड़ियों =>b, br, bro, brow, brown, browni, brownis, brownish, f, fo, fox, foxe, foxes

=>b, br, bro, brow, brown, browny, f, fo, for

के लिए Browny ब्राउन लोमड़ी =>b, br, bro, brow, brown, f, fo, fox

ब्राउन लोमड़ी पेड़ =>b, br, bro, brow, brown, f, fo, fox, t, tr, tre, tree

अब, जब आप को standard विश्लेषक का उपयोग करके खोजते हैं, तो खोज टोकन होंगे: brown और fo

आप देख सकते हैं, टोकन brown और foखोज उपरोक्त शर्तों के सभी में मौजूद हैं, इसलिए वे मूल रूप से बराबर हैं। स्कोरिंग (और इस तरह सॉर्ट ऑर्डर) को प्रभावित करने वाली एकमात्र चीज यह है कि क्या शर्तें name या _alias फ़ील्ड (या दोनों) में मिली हैं और फ़ील्ड मिलान के type क्या हैं। कंक्रीट दस्तावेज़ को देखे बिना यह कहना मुश्किल है, लेकिन स्कोरिंग की गणना कैसे की जा रही है, इस बारे में अधिक अंतर्दृष्टि प्राप्त करने के लिए आपको अपनी क्वेरी में ?explain=true जोड़ने का प्रयास करना चाहिए।

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