gpt4 book ai didi

elasticsearch - Elasticsearch在列表字段中查找唯一项

转载 作者:行者123 更新时间:2023-12-03 01:37:10 25 4
gpt4 key购买 nike

需要查找列表字段中的唯一字符串值。

问题类似于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"]

有没有办法进行这种搜索?

最佳答案

好消息!我们可以使用与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将fielddata设置为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
}
]
}
}
}

关于elasticsearch - Elasticsearch在列表字段中查找唯一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51455713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com