2013-07-30 8 views
7

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

{ 
    "from": 0, 
    "size": 20, 
    "query": { 
    "match_all": {} 
    }, 
    "filter": { 
     "range": { 
      "_id": { 
      "gt": "51f7b6b7710c42b136027581" 
      } 
     } 
    }, 
    "sort": { 
    "pubdate": { 
     "order": "desc" 
    } 
    } 
} 
+2

में एक काम उदाहरण देख सकते हैं मैं यह नहीं किया जा सकता है लगता है है। मुझे लगता है कि '_id' तेजी से लुकअप के लिए धोया गया है, एक बार जब आप कुछ ऐसा करते हैं तो आप इसके "मूल्य" की सभी समझ खो देते हैं। आपको दस्तावेज़ में आईडी को स्टोर करने की आवश्यकता है। – ramseykhalaf

+0

क्या आप भंडारण रैमसे के बारे में निश्चित हैं? आपको आईडी को इंडेक्स करना होगा (जो डिफ़ॉल्ट रूप से मामला नहीं है) क्योंकि श्रेणी क्वेरी उन फ़ील्ड वाले दस्तावेज़ों से मेल खाती है जिनमें परिभाषित सीमा में शर्तें हैं। – ThomasC

+0

क्या आप अपने दस्तावेज़ों को लोचदार द्वारा प्रदान किए गए डिफ़ॉल्ट _id के बजाय निर्दिष्ट (पूर्णांक) _id के साथ अनुक्रमणित कर सकते हैं? –

उत्तर

1

शायद यह देर से एक छोटे से है, लेकिन मैं जवाब देने की कोशिश और हो सकता है इस सवाल का जवाब अभी भी आपके लिए उपयोगी है।
देखा टिप्पणियां सहकर्मियों के लिए किया है, मुझे लगता है कि दो मुख्य विचारों निकाला जा सकता है:

    Elasticsearch द्वारा
  1. उत्पन्न ID फ़िल्टर या प्राप्त ओ आईडी खोज के अलावा अन्य किसी भी कार्रवाई करने के लिए नहीं किया जा सकता।
  2. सूचकांक कस्टम uid मूल्य अनुमान लगाया जाता है (और इस तरह मैं समस्या को हल करने की कोशिश करेंगे)

तो, मैं अगर समाधान 2 संभव है की जाँच करने के लिए एक उदाहरण कोड जोड़ने के बाद। प्रमुख भागों ये हैं:

#cluster node to query 
es = Elasticsearch(['localhost:9200',]) 
records = [ 
    #some custom data 
] 
for idx,r in enumerate(records): 
    _index_config = dict(index_config) 
    #set Elasticsearch uid 
    _index_config['_id'] = idx 
    #replicate in a document field to be able to filter for 
    r['id'] = idx 
    kwargs['body'].append({'index' : _index_config}) 
    kwargs['body'].append(r) 

_ = es.bulk(**kwargs) 

एक बार जब आप id क्षेत्र अनुक्रमित है, तो आप इसे आधार पर फ़िल्टर के रूप में आप चाहते हैं कर सकते हैं। range फिल्टर उनमें से एक

elasticsearch_query = { 
    "query": { 
     "filtered": { 
      "filter": { 
       "range": { 
        "id": { 
         "gte" : 3, 
         "lt" : 5 
        } 
       } 
      } 
     } 
    } 
} 

आप this notebook