2014-04-02 15 views
11

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

तो छद्म एसक्यूएल में लिखा यह होगा:

SELECT * FROM Documents WHERE (CategoryA = 'A') AND (CategoryB = 'B' OR CategoryB = 'C') 

मैं बहुत तरह नेस्ट फिल्टर की कोशिश की है:

{ 
    "sort": [{ 
     "orderDate": "desc" 
    }], 
    "size": 25, 
    "query": { 
     "match_all": {} 
    }, 
    "filter": { 
     "and": [{ 
      "nested": { 
       "path":"hits._source", 
       "filter": { 
        "or": [{ 
         "term": { 
          "progress": "incomplete" 
         } 
        }, { 
         "term": { 
          "progress": "completed" 
         } 
        }] 
       } 
      } 
     }, { 
      "nested": { 
       "path":"hits._source", 
       "filter": { 
        "or": [{ 
         "term": { 
          "paid": "yes" 
         } 
        }, { 
         "term": { 
          "paid": "no" 
         } 
        }] 
       } 
      } 
     }] 
    } 
} 

लेकिन जाहिर है मैं काफी ES वाक्य रचना समझ में नहीं आता। क्या यह सही रास्ते पर है या क्या मुझे एक और फ़िल्टर का उपयोग करने की आवश्यकता है?

+0

जवाब पर छानने से संबंधित प्रश्न के लिए: 'टर्म' के साथ '' '' '' '' '' '' '' '' के साथ आसान किया जा सकता है (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-terms- filter.html)। और [बूल] के लिए डिफ़ॉल्ट (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-filter.html) '' और '' है। 'filter.bool.must के साथ कुछ: [{शर्तें: प्रगति: [" अपूर्ण "," पूर्ण "]}। {शर्तें: भुगतान: ["हाँ", "नहीं"]}] '' काम कर सकता है? – cfrick

+0

नेस्टेड प्रश्न/फ़िल्टर का उपयोग सरणी/सूचियों के लिए किया जाता है (निर्भर करता है कि आप किस भाषा से परिचित हैं उदा। 'ए = [{' बी ': 1}, {' c ': 2}])। क्या आप अपने दस्तावेज़ों में से एक का उदाहरण लिख सकते हैं? इससे – Diolor

+0

सीएफरिक ने मुझे सही रास्ते में ले जाया है। मैंने 'और' फ़िल्टर के अंदर 'नियम' फ़िल्टर का एक गुच्छा घोंसला, और यह मेरी आवश्यकताओं को पूरा करता प्रतीत होता है। – MHTri

उत्तर

3

हालांकि मैं पूरी तरह से आपकी संरचना को समझ नहीं पा रहा हूं, यह आपको चाहिए जो आपको चाहिए।

आपको पेड़ के अनुसार सोचना है। आप एक बूल बनाते हैं जहां आपको एम्बेडेड बूल को पूरा करना होगा (= और)। प्रत्येक एम्बेडेड चेक यदि फ़ील्ड मौजूद नहीं है या अन्यथा (यहां आवश्यकतानुसार उपयोग करना चाहिए) फ़ील्ड को (यहां शर्तें) सूची में मानों में से एक होना चाहिए।

सुनिश्चित नहीं है कि कोई बेहतर तरीका है, और प्रदर्शन को नहीं जानते हैं।

{ 
    "sort": [ 
     { 
      "orderDate": "desc" 
     } 
    ], 
    "size": 25, 
    "query": { 
     "query": {   # 
      "match_all": {} # These three lines are not necessary 
     },     # 
     "filtered": { 
      "filter": { 
       "bool": { 
        "must": [ 
         { 
          "bool": { 
           "should": [ 
            { 
             "not": { 
              "exists": { 
               "field": "progress" 
              } 
             } 
            }, 
            { 
             "terms": { 
              "progress": [ 
               "incomplete", 
               "complete" 
              ] 
             } 
            } 
           ] 
          } 
         }, 
         { 
          "bool": { 
           "should": [ 
            { 
             "not": { 
              "exists": { 
               "field": "paid" 
              } 
             } 
            }, 
            { 
             "terms": { 
              "paid": [ 
               "yes", 
               "no" 
              ] 
             } 
            } 
           ] 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 
+2

यह गलत है। 'must' और' चाहिए' 'और' और' या' के लिए उपनाम नहीं हैं। उनके पास अलग-अलग कार्यक्षमता है (हालांकि समानताएं समान रूप से हैं) –

8

यह यह होना चाहिए (दिए गए छद्म एसक्यूएल से अनुवाद)

{ 
    "sort": [ 
     { 
     "orderDate": "desc" 
     } 
    ], 
    "size": 25, 
    "query": 
    { 
     "filtered": 
     { 
      "filter": 
      { 
       "and": 
       [ 
        { "term": { "CategoryA":"A" } }, 
        { 
         "or": 
         [ 
          { "term": { "CategoryB":"B" } }, 
          { "term": { "CategoryB":"C" } } 
         ] 
        } 
       ] 
      } 
     } 
    } 
} 

मुझे पता है आप पहलुओं का उल्लेख नहीं कर रहे हैं लेकिन सिर्फ पूर्णता के लिए के लिए:

तुम भी इस्तेमाल कर सकते हैं एक filterfiltered query (जैसे मैंने किया) के बजाय आधार (जैसे आपने किया) के आधार पर। जिसके परिणामस्वरूप json अंतर किया जा रहा है के साथ लगभग समान है:

  • फ़िल्टर किए गए क्वेरी फिल्टर करेगा दोनों मुख्य परिणामों के साथ ही पहलुओं
  • एक फिल्टर केवल मुख्य परिणाम नहीं पहलुओं फ़िल्टर करेगा।

अन्त में, नेस्टेड फिल्टर (आप उपयोग करने की कोशिश करता है) की तरह आपको लगता है कि लग रहा था 'घोंसले फिल्टर' से संबंधित नहीं है, लेकिन नेस्टेड-दस्तावेजों (अभिभावक-बच्चे)

नहीं
संबंधित मुद्दे