需要查找列表字段中的唯一字符串值。
问题类似于ElasticSearch - Return Unique Values 但是现在字段值是列表
记录:
PUT items/1
{ "tags" : ["a", "b"] }
PUT items/2
{ "tags" : ["b", "c"] }
PUT items/3
{ "tags" : ["a" "d"] }
查询:
GET items/_search
{ ... }
# => Expected Response
["a", "b", "c", "d"]
有没有办法进行这种搜索?
答案 0 :(得分:1)
好消息!我们可以使用与the SO post you linked to in the description中使用的聚合完全相同的聚合。实际上,如果我们要提交数字值列表,那么我们的工作已经完成!但是,此问题与您引用的问题之间的主要区别在于您使用的是“字符串”类型。
知道在Elasticsearch的最新版本中有two ways to represent "strings" in elasticsearch并且实际上不再将该类型称为字符串是有用的。使用keyword类型会将整个文本视为单个标记,而使用text类型将应用分析器将文本分解为许多不同的标记,并使用这些标记建立索引。
例如,字符串“ Foxes is brown”可以在索引中表示为"foxes are brown"
或["foxes", "are", "brown"]
。在您的情况下,应将标签视为关键字,因此我们需要告诉elasticsearch该字段是keyword
而不是默认的text
。
注意::尽可能使用关键字类型将减轻需要允许Elasticsearch将字段数据设置为true的问题,如果使用这种聚合则uses up a lot of memory in your cluster。标签和顺序数据是关键字类型的理想选择。
无论如何,让我们开始了解真正的东西吧?
首先,您将要设置项目中标签的映射作为关键字类型。
curl --request PUT \
--url http://localhost:9200/items \
--header 'content-type: application/json' \
--data '{
"mappings": {
"item": {
"properties": {
"tags" : { "type": "keyword" }
}
}
}
}
'
然后,您将运行与您引用的帖子中的汇总类似的汇总。
curl --request POST \
--url http://localhost:9200/items/item/_search \
--header 'content-type: application/json' \
--data '{
"size": 0,
"aggregations": {
"tags_term_agg": {
"terms": {
"field": "tags"
}
}
}
}'
您的回复应如下所示。
{
"took": 24,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 0.0,
"hits": []
},
"aggregations": {
"tags_term_agg": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "a",
"doc_count": 2
},
{
"key": "b",
"doc_count": 2
},
{
"key": "c",
"doc_count": 1
},
{
"key": "d",
"doc_count": 1
}
]
}
}
}