2013-03-08 4 views
20

Elasticsearch प्राप्त करने के लिए इसी तरह के दो विशेषताएं है "समान" दस्तावेज:Elasticsearch "अधिक लाइक दिस" एपीआई बनाम more_like_this क्वेरी

"More Like This API" नहीं है। यह मुझे किसी दिए गए दस्तावेज के समान दस्तावेज देता है। हालांकि मैं इसे अधिक जटिल अभिव्यक्तियों में उपयोग नहीं कर सकता।

"more_like_this" query for use in the Search API भी है, मैं इसे बूल या अभिव्यक्तियों को बढ़ाने में उपयोग कर सकता हूं, लेकिन मैं इसे किसी दस्तावेज़ की आईडी नहीं दे सकता। मुझे "like_text" पैरामीटर प्रदान करना होगा।

मेरे पास टैग और सामग्री के साथ दस्तावेज़ हैं। कुछ दस्तावेज़ों में अच्छे टैग होंगे और कुछ में कोई भी नहीं होगा। मुझे एक "समान दस्तावेज" सुविधा चाहिए जो हर बार काम करेगी लेकिन मिलान करने वाले पाठ वाले दस्तावेज़ों से मेल खाने वाले टैग वाले दस्तावेज़ों को रैंक करेगा। मेरा विचार था:

{ 
    "boosting" : { 
     "positive" : { 
      "more_like_this" : { 
       "fields" : ["tag"], 
       "id" : "23452", 
       "min_term_freq" : 1 
      } 
     }, 
     "negative" : { 
      "more_like_this" : { 
       "fields" : ["tag"], 
       "id" : "23452", 
      } 
     }, 
     "negative_boost" : 0.2 
    } 
} 

जाहिर है इस वजह से वहाँ "more_like_this" में कोई "id" काम नहीं करता। विकल्प क्या हैं?

उत्तर

41

सबसे पहले इस कार्यक्षमता की तरह और यह कैसे काम करता है, इस बारे में थोड़ा सा परिचय। विचार यह है कि आपके पास एक विशिष्ट दस्तावेज़ है और आप कुछ अन्य चाहते हैं जो इसके समान हैं।

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

more like this query आपको यह कहने के लिए अनुमति देता है कि आप इसे कहां से प्राप्त कर चुके हैं। उस पाठ का उपयोग उन फ़ील्ड से पूछने के लिए किया जाएगा जिन्हें आप चुनते हैं और समान दस्तावेजों को वापस प्राप्त करते हैं। पाठ का पूरी तरह से उपयोग नहीं किया जाएगा, लेकिन पुन: विश्लेषण किया जाएगा, और केवल max_query_terms (डिफ़ॉल्ट 25) अधिकतम शर्तों को उन शर्तों में से रखा जाएगा जिनमें कम से कम प्रदत्त min_term_freq (न्यूनतम अवधि आवृत्ति, डिफ़ॉल्ट 2) और min_doc_freq के बीच दस्तावेज़ आवृत्ति है और max_doc_freq। ऐसे कई पैरामीटर भी हैं जो जेनरेट की गई क्वेरी को प्रभावित कर सकते हैं।

more like this api एक कदम आगे जाता है, जो दस्तावेज़ की आईडी प्रदान करता है और फिर, फ़ील्ड की एक सूची प्रदान करता है। उन फ़ील्ड की सामग्री उस विशिष्ट दस्तावेज़ से निकाली जाएगी और उसी क्वेरी पर इस क्वेरी की तरह अधिक उपयोग करने के लिए उपयोग की जाएगी। इसका अर्थ यह है कि इस क्वेरी की तरह जेनरेट किए गए प्रॉपर्टी टेक्स्ट में पहले से निकाले गए टेक्स्ट वाले प्रॉपर्टी टेक्स्ट होंगे और उसी फ़ील्ड पर किया जाएगा। जैसा कि आप देख सकते हैं कि इस एपीआई की तरह अधिक जानकारी इस हुड के नीचे है।

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

आपके मामले में मैं एक साथ इस प्रश्न की तरह कुछ और जोड़ दूंगा, ताकि आप शक्तिशाली लोचदार खोज क्वेरी डीएसएल का उपयोग कर सकें, अलग-अलग प्रश्नों को बढ़ावा दे सकें। नकारात्मकता यह है कि आपको खुद को टेक्स्ट प्रदान करना होगा, क्योंकि आप इसे निकालने के लिए दस्तावेज़ की आईडी प्रदान नहीं कर सकते हैं।

आप जो चाहते हैं उसे हासिल करने के विभिन्न तरीके हैं।मैं एक प्रश्नोत्तरी में इन प्रश्नों की तरह दो और गठबंधन करने के लिए bool query का उपयोग करूंगा और उन्हें एक अलग वजन दूंगा। मैं इसके बजाय more like this field query का भी उपयोग करूंगा, क्योंकि आप एक समय में एक ही फ़ील्ड से पूछना चाहते हैं।

{ 
    "bool" : { 
     "must" : { 
      {"match_all" : { }} 
     }, 
     "should" : [ 
      { 
       "more_like_this_field" : { 
       "tags" : { 
        "like_text" : "here go the tags extracted from the current document!", 
        "boost" : 2.0 
       } 
       } 
      }, 
      { 
       "more_like_this_field" : { 
       "content" : { 
        "like_text" : "here goes the content extracted from the current document!" 
       } 
       } 
      } 
     ], 
     "minimum_number_should_match" : 1 
    } 
} 

इस तरह से कम से कम एक क्लॉज का मिलान होना चाहिए, और टैग पर एक मैच सामग्री पर एक मैच से अधिक महत्वपूर्ण है।

+0

जवाब के लिए धन्यवाद। इसलिए अस्तित्वहीन 'आईडी' 'JSON नाम का एकमात्र विकल्प पूर्ण पाठ प्राप्त करना और इसे "like_text" में रखना है। पूर्ण पाठ की राउंड-ट्रिप से बचने का कोई तरीका नहीं है। इसे कम करने का कोई तरीका नहीं है। जैसे दस्तावेज़ के वेक्टर शब्द तक पहुंचने का कोई तरीका नहीं है और केवल 25 "शीर्ष शब्द" प्राप्त करें, ताकि मैं उन्हें सीधे 'like_text' 'में रख सकूं और मुझे वही परिणाम मिल सकें जो मुझे पूर्ण पाठ के साथ मिलेंगे। कृपया पुष्टि करें। मैं एक लोचदार खोज प्लगइन लिखने के बारे में सोच रहा था जो मुझे दस्तावेज़ के लिए शीर्ष एन शर्तें देगा। क्या आपको लगता है यह कार्य करेगा? –

+0

जहां तक ​​मुझे पता है कि आप जो चाहते हैं उसे हासिल करने के लिए बॉक्स ऑफ आउट बॉक्स नहीं है। आप शायद एक प्लगइन लिख सकते हैं जो इस क्वेरी की तरह एक नए प्रकार का खुलासा करता है जो किसी दस्तावेज़ की आईडी को इनपुट के रूप में स्वीकार करता है और इससे टेक्स्ट प्राप्त करता है, यहां तक ​​कि जब उपलब्ध हो तो टर्म वैक्टर का उपयोग भी कर सकता है। – javanna

8

इस नए तरह वाक्य रचना के साथ अब संभव है:

{ 
    "more_like_this" : { 
     "fields" : ["title", "description"], 
     "like" : [ 
     { 
      "_index" : "imdb", 
      "_type" : "movies", 
      "_id" : "1" 
     }, 
     { 
      "_index" : "imdb", 
      "_type" : "movies", 
      "_id" : "2" 
     }], 
     "min_term_freq" : 1, 
     "max_query_terms" : 12 
    } 
} 

यहाँ देखें: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html

+1

हाल ही में लोचदार खोज संस्करणों में, 'docs' कीवर्ड को 'like' के पक्ष में बहिष्कृत कर दिया गया है। – cosimo

+0

@cosimo उत्तर अपडेट किया गया, धन्यवाद – Datageek

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