如何用Elasticsearch搜索給定字段的所有唯一值?用Elasticsearch查詢字段的所有唯一值
我有這樣的一種查詢,如select full_name from authors
,所以我可以顯示在窗體上的用戶列表。
如何用Elasticsearch搜索給定字段的所有唯一值?用Elasticsearch查詢字段的所有唯一值
我有這樣的一種查詢,如select full_name from authors
,所以我可以顯示在窗體上的用戶列表。
您可以在'full_name'字段中輸入terms facet。但爲了正確地做到這一點,您需要確保在索引時不要標記它,否則該方面中的每個條目都將成爲字段內容的一部分。您很可能需要在您的映射中將其配置爲'not_analyzed'。如果您也在搜索它並且您仍然想要標記它,您可以使用multi field以兩種不同的方式對其進行索引。
您還需要考慮到,根據作爲full_name字段一部分的特殊術語的數量,此操作可能很昂貴並且需要相當多的內存。
對於Elasticsearch 1.0和更高版本,您可以利用terms aggregation
要做到這一點,
查詢DSL:
{
"aggs": {
"NAME": {
"terms": {
"field": "",
"size": 10
}
}
}
}
一個真實的例子:
{
"aggs": {
"full_name": {
"terms": {
"field": "authors",
"size": 0
}
}
}
}
然後你就可以得到所有唯一值的authors
字段。 size = 0表示不限制術語的數量(這要求es爲1.1.0或更高版本)。
響應:
{
...
"aggregations" : {
"full_name" : {
"buckets" : [
{
"key" : "Ken",
"doc_count" : 10
},
{
"key" : "Jim Gray",
"doc_count" : 10
},
]
}
}
}
現有的答案並沒有爲我在Elasticsearch 5.X工作,有以下原因:
"size": 0
未能解析,因爲「[size]必須大於0」。full_name
字段。但是,未分析的keyword
字段可用於聚合。解決方案1 :使用Scroll API。它通過保持搜索上下文併發出多個請求來工作,每次返回後續批次的結果。如果您正在使用Python,那麼elasticsearch模塊會有scan()
helper function來處理您的滾動並返回所有結果。使用Search After API。它與Scroll類似,但提供了一個實時光標而不是保留搜索上下文。因此它對實時請求更有效。
我不確定這適用於「大小」:0問題,因爲默認情況下,據我所知,從文檔是10 ... – Trejkaz
@Trejkaz謝謝;我已經更新了我的答案。 –
適用於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個文件,我們不需要。
還要注意,根據this page,小面已被取代在Elasticsearch 1.0聚合,這是刻面的超集。
直覺: 在SQL的說法:
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"
}
]
}
}
什麼工作就像一個魅力:追加.keyword與現場
{
"aggs": {
"full_name": {
"terms": {
"field": "author.keyword"
}
}
}
}
和樣品輸出可能是:
{
"aggregations": {
"full_name": {
"buckets": [
{
"doc_count": 372,
"key": "Charles Dickens"
},
{
"doc_count": 283,
"key": "Brian Kernighan"
}
],
"doc_count": 1000
}
}
}
特別提示:
讓我們假設在que領域Stion的嵌套如下:
[{
"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
}
是什麼意思FULL_NAME? – neustart47
@ neustart47 full_name只是聚合的名稱 –