2011-08-25 8 views
15

मैं पिछले कुछ महीनों से लोचदार खोज के साथ काम कर रहा हूं, लेकिन मुझे जटिल जटिलता उत्तीर्ण होने पर अभी भी जटिल लग रहा है।कई प्रकार के लिए लोचदार खोज क्वेरी पैराम्स (डीएसएल क्वेरी) का उपयोग कैसे करें?

मैं क्वेरी जो एकाधिक "प्रकार" खोज करने के लिए होगा चलाना चाहते हैं और प्रत्येक प्रकार के अपने स्वयं के "फिल्टर" के साथ की खोज की जानी है, लेकिन संयुक्त की है, "खोज परिणाम"

उदाहरण के लिए की जरूरत है:

मुझे "उपयोगकर्ता प्रकार" दस्तावेज़ को खोजने की ज़रूरत है जो मेरे मित्र हैं और साथ ही मुझे प्रदान किए गए कीवर्ड के अनुसार "ऑब्जेक्ट टाइप" दस्तावेज़ को भी खोजना है।

या

क्वेरी है कि दोनों "और" और "नहीं" खंड

उदाहरण क्वेरी:

$options['query'] = array(
     'query' => array(
      'filtered' => array(
       'query' => array(
        'query_string' => array(
         'default_field' => 'name', 
         'query' => $this->search_term . '*', 
        ), 
       ), 
       'filter' => array(
        'and' => array(
         array(
          'term' => array(
           'access_id' => 2, 
          ), 
         ), 
        ), 

        'not' => array(
         array(
          'term' => array(
           'follower' => 32, 
          ), 
         ), 

         array(
          'term' => array(
           'fan' => 36, 
          ), 
         ), 
        ), 
       ), 
      ), 
     ), 
    ); 

के रूप में इस क्वेरी access_id = 2 के साथ उपयोगकर्ता खोज करने के लिए है , लेकिन आईडी 32 के अनुयायी और आईडी 36

के प्रशंसक नहीं होना चाहिए लेकिन यह काम नहीं कर रहा है ..

संपादित करें: संशोधित क्वेरी

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "and": [ 
      { 
      "not": { 
       "filter": { 
       "and": [ 
        { 
        "query": { 
         "query_string": { 
         "default_field": "fan", 
         "query": "*510*" 
         } 
        } 
        }, 
        { 
        "query": { 
         "query_string": { 
         "default_field": "follower", 
         "query": "*510*" 
         } 
        } 
        } 
       ] 
       } 
      } 
      }, 
      { 
      "term": { 
       "access_id": 2 
      } 
      } 
     ] 
     }, 
     "query": { 
     "field": { 
      "name": "xyz*" 
     } 
     } 
    } 
    } 
} 

अब इस क्वेरी चलाने के बाद, मैं हो रही है दो परिणाम, अनुयायी के साथ एक: "34,518" & प्रशंसक: "510" और दूसरा प्रशंसक के साथ: "34", लेकिन यह परिणाम में केवल दूसरा नहीं होना चाहिए।

कोई विचार?

उत्तर

14

आप एक प्रस्तुति है कि मैं इस महीने दे दी है, जो कैसे क्वेरी डीएसएल काम करता है की मूल बातें बताते हैं की स्लाइड को देखने के लिए चाहते हो सकता है:

Terms of endearment - the ElasticSearch Query DSL explained

आपकी क्वेरी के साथ समस्या यह है कि आपके फ़िल्टर गलत तरीके से घोंसला कर रहे हैं। and और not फिल्टर एक ही स्तर पर हैं, लेकिन not फिल्टर and के तहत होना चाहिए:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1' -d ' 
{ 
    "query" : { 
     "filtered" : { 
     "filter" : { 
      "and" : [ 
       { 
        "not" : { 
        "filter" : { 
         "and" : [ 
          { 
           "term" : { 
           "fan" : 36 
           } 
          }, 
          { 
           "term" : { 
           "follower" : 32 
           } 
          } 
         ] 
        } 
        } 
       }, 
       { 
        "term" : { 
        "access_id" : 2 
        } 
       } 
      ] 
     }, 
     "query" : { 
      "field" : { 
       "name" : "keywords to search" 
      } 
     } 
     } 
    } 
} 
' 
+0

क्या "नहीं" फ़िल्टर हमेशा "और" फ़िल्टर के अंतर्गत आता है, या यह केवल इस मामले में –

+0

हाय @ डीआरटेक है, मैंने अभी प्रश्न संपादित किया है कृपया जांचें। –

+1

आपका संपादित प्रश्न अन्य समस्याओं का परिचय देता है। मेरा सुझाव है कि आपके द्वारा प्रस्तुत प्रस्तुति के माध्यम से एक नज़र डालें - यह शब्दों और पाठ के बीच अंतर, और कहां उपयोग करने के लिए किस प्रकार के प्रश्न या फ़िल्टर के बीच अंतर बताता है। – DrTech

3

मैं सिर्फ "BOOL"

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "access_id": 2 
      } 
     }, 
     { 
      "wildcard": { 
      "name": "xyz*" 
      } 
     } 
     ], 
     "must_not": [ 
     { 
      "wildcard": { 
      "follower": "*510*" 
      } 
     }, 
     { 
      "wildcard": { 
      "fan": "*510*" 
      } 
     } 
     ] 
    } 
    } 
} 

यह सही जवाब देता है के साथ की कोशिश की।

लेकिन मुझे यकीन नहीं है कि इसका उपयोग इस तरह किया जाना चाहिए?

+2

यह काम करेगा, लेकिन बहुत अक्षम है। वाइल्डकार्ड खंडों को सभी शर्तों को लोड करना होगा, मिलान करने वाले सभी शब्द ढूंढें, फिर उन सभी शर्तों को शामिल करने के लिए क्वेरी को फिर से लिखें। वह वास्तव में उड़ सकता है। इंडेक्स समय पर अपने डेटा का सही ढंग से विश्लेषण करना बेहतर होता है, ताकि आप अपने मूल्यों को अलग-अलग शब्दों में विभाजित कर सकें, जिन्हें आप व्यक्तिगत रूप से मिलान कर सकते हैं। आपको ngram विश्लेषक का उपयोग करने की आवश्यकता हो सकती है, लेकिन यह वास्तव में आपके डेटा पर निर्भर करता है। उदाहरण के लिए इस धागे पर एक नज़र डालें http://elasticsearch-users.115913.n3.nabble.com/help-needed-with-the-query-tt3177477.html#a3178856 – DrTech

+1

धन्यवाद @ डीआरटेक, यह बहुत अच्छी तरह से समझाया गया है । +1। और मैं वास्तव में कहूंगा कि आपको लोचदार खोज पर एक पूर्ण ट्यूटोरियल लिखना चाहिए, क्योंकि किसी ने अभी तक यह नहीं किया है :) धन्यवाद –

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