2013-01-22 15 views
25

के साथ किसी फ़ील्ड के सभी अद्वितीय मानों को क्वेरी करें Elasticsearch के साथ दिए गए फ़ील्ड के सभी अद्वितीय मूल्यों को मैं कैसे खोजूं?Elasticsearch

मेरे पास ऐसी तरह की क्वेरी है जैसे select full_name from authors, इसलिए मैं एक फॉर्म पर उपयोगकर्ताओं को सूची प्रदर्शित कर सकता हूं।

उत्तर

18

आप अपने 'full_name' फ़ील्ड पर terms facet बना सकते हैं। लेकिन इसे सही तरीके से करने के लिए आपको यह सुनिश्चित करने की ज़रूरत है कि आप अनुक्रमण के दौरान इसे टोकननाइज़ नहीं कर रहे हैं, अन्यथा पहलू में प्रत्येक प्रविष्टि एक अलग शब्द होगी जो फ़ील्ड सामग्री का हिस्सा है। आपको अपने मानचित्रण में इसे 'not_analyzed' के रूप में कॉन्फ़िगर करने की अधिक संभावना है। यदि आप इसे भी खोज रहे हैं और आप अभी भी इसे टोकननाइज़ करना चाहते हैं तो आप multi field का उपयोग करके इसे दो अलग-अलग तरीकों से अनुक्रमित कर सकते हैं।

आपको यह भी ध्यान रखना होगा कि पूर्ण_नाम फ़ील्ड का हिस्सा होने वाले अद्वितीय शब्दों की संख्या के आधार पर, यह ऑपरेशन महंगा हो सकता है और इसकी कुछ मेमोरी की आवश्यकता होती है।

12
Elasticsearch 1.0 के लिए

और बाद में, आप terms aggregation यह करने के लिए लाभ उठा सकते हैं,

क्वेरी डीएसएल:

{ 
    "aggs": { 
    "NAME": { 
     "terms": { 
     "field": "", 
     "size": 10 
     } 
    } 
    } 
} 

एक वास्तविक उदाहरण:

{ 
    "aggs": { 
    "full_name": { 
     "terms": { 
     "field": "authors", 
     "size": 0 
     } 
    } 
    } 
} 

तो फिर तुम मिल सकता है सभी अनन्य मानों authors फ़ील्ड का। आकार = 0 का अर्थ शर्तों की संख्या को सीमित नहीं करता है (इसके लिए एएस 1.1.0 या बाद में होना आवश्यक है)।

प्रतिक्रिया:

{ 
    ... 

    "aggregations" : { 
     "full_name" : { 
      "buckets" : [ 
       { 
        "key" : "Ken", 
        "doc_count" : 10 
       }, 
       { 
        "key" : "Jim Gray", 
        "doc_count" : 10 
       }, 
      ] 
     } 
    } 
} 

Elasticsearch terms aggregations देखते हैं।

+0

FULL_NAME क्या मतलब है stion इस प्रकार नीडिंत है? – neustart47

+2

@ neustart47 full_name सिर्फ समेकन का नाम है –

4

मौजूदा जवाब Elasticsearch 5.X में मेरे लिए काम नहीं किया, निम्नलिखित कारणों के लिए:

  • मैं अपने इनपुट जबकि अनुक्रमण tokenize की जरूरत है।
  • "size": 0 विश्लेषण करने में विफल रहा क्योंकि "[आकार] 0 से अधिक होना चाहिए"
  • "Fielddata is disabled on text fields by default." इसका मतलब डिफ़ॉल्ट रूप से आप full_name फ़ील्ड पर नहीं खोज सकते हैं। हालांकि, एक unanalyzed keyword फ़ील्ड एकत्रीकरण के लिए इस्तेमाल किया जा सकता है।

समाधान 1: Scroll API का उपयोग करें। यह एक खोज संदर्भ रखने और कई अनुरोध करने के द्वारा काम करता है, हर बार परिणाम के बाद के बैचों को लौटता है। यदि आप पाइथन का उपयोग कर रहे हैं, तो लोचदार खोज मॉड्यूल में आपके लिए स्क्रॉलिंग को संभालने और सभी परिणामों को वापस करने के लिए scan() helper function है।

समाधान 2: Search After API का उपयोग करें। यह स्क्रॉल के समान है, लेकिन एक खोज संदर्भ रखने के बजाय एक लाइव कर्सर प्रदान करता है। इस प्रकार यह वास्तविक समय के अनुरोधों के लिए अधिक कुशल है।

+0

मुझे यकीन नहीं है कि यह "आकार": 0 समस्या के आसपास काम करता है, क्योंकि जहां तक ​​मैं दस्तावेज़ों से देख सकता हूं डिफ़ॉल्ट है 10 ... – Trejkaz

+0

@Trejkaz धन्यवाद; मैंने अपना जवाब अपडेट कर लिया है। –

0

Elasticsearch 5.2 के लिए काम करना।2

curl -XGET http://localhost:9200/articles/_search?pretty -d ' 
{ 
    "aggs" : { 
     "whatever" : { 
      "terms" : { "field" : "yourfield", "size":10000 } 
     } 
    }, 
    "size" : 0 
}' 

"size":10000 साधन (अधिकतम) 10000 अनन्य मानों मिलता है। इसके बिना, यदि आपके पास 10 से अधिक अद्वितीय मान हैं, तो केवल 10 मान लौटाए जाते हैं।

"size":0 का अर्थ है कि परिणामस्वरूप, "hits" में कोई दस्तावेज़ नहीं होगा। डिफ़ॉल्ट रूप से, 10 दस्तावेज़ लौटाए जाते हैं, जिन्हें हमें आवश्यकता नहीं होती है।


संदर्भ: bucket terms aggregation

यह भी ध्यान रखें, this page के अनुसार, पहलुओं Elasticsearch 1.0 में एकत्रित, जो पहलुओं का सुपरसेट हैं ने ले ली है।

0

अंतर्ज्ञान: एसक्यूएल भाषा में:

Select distinct full_name from authors;

बराबर है

Select full_name from authors group by full_name;

तो करने के लिए, हम अलग प्रविष्टियाँ खोजने के लिए ElasticSearch में समूहीकरण/कुल सिंटैक्स का उपयोग कर सकते हैं ।

मान लें निम्नलिखित संरचना लोचदार खोज में जमा हो जाती है:

[{ 
    "author": "Brian Kernighan" 
    }, 
    { 
    "author": "Charles Dickens" 
    }] 

क्या काम नहीं किया: सादा एकत्रीकरण

{ 
    "aggs": { 
    "full_name": { 
     "terms": { 
     "field": "author" 
     } 
    } 
    } 
} 

मैं निम्नलिखित त्रुटि मिली:

{ 
    "error": { 
    "root_cause": [ 
     { 
     "reason": "Fielddata is disabled on text fields by default...", 
     "type": "illegal_argument_exception" 
     } 
    ] 
    } 
} 

क्या एक आकर्षण की तरह काम किया: क्षेत्र

{ 
    "aggs": { 
    "full_name": { 
     "terms": { 
     "field": "author.keyword" 
     } 
    } 
    } 
} 

और नमूना उत्पादन के साथ जोड़ .keyword हो सकता है:

{ 
    "aggregations": { 
    "full_name": { 
     "buckets": [ 
     { 
      "doc_count": 372, 
      "key": "Charles Dickens" 
     }, 
     { 
      "doc_count": 283, 
      "key": "Brian Kernighan" 
     } 
     ], 
     "doc_count": 1000 
    } 
    } 
} 

बोनस टिप:

आइए हम क्यू में फ़ील्ड मान लें

[{ 
    "authors": [{ 
     "details": [{ 
      "name": "Brian Kernighan" 
      }] 
     }] 
    }, 
    { 
    "authors": [{ 
     "details": [{ 
      "name": "Charles Dickens" 
      }] 
     }] 
    } 
] 

अब सही क्वेरी हो जाता है::

{ 
    "aggregations": { 
    "full_name": { 
     "aggregations": { 
     "author_details": { 
      "terms": { 
      "field": "authors.details.name" 
      } 
     } 
     }, 
     "nested": { 
     "path": "authors.details" 
     } 
    } 
    }, 
    "size": 0 
}