elasticsearch 术语聚合与过滤
elasticsearch term aggregation with filtering
我在 foo
索引中有这样的实体:
{ids: ["aa", "bb"]}
{ids: ["aa", "cc"]}
{ids: ["ee"]}
{ids: ["ff" , "cc"]}
基本上我想知道是否有 ids aa
和 ee
的文档。
我试着用术语聚合来做到这一点
{
"size": 0,
"query": {
"bool": {
"should": [
{
"terms": {
"ids": [
"aa", "ee"
],
"boost": 1
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"aggregations": {
"byid": {
"terms": {
"field": "ids",
"min_doc_count": 1
}
}
}
}
但是这里的问题是,作为响应,我也得到了与所选实体具有的其他 ids
的聚合,并且在实际情况中有很多,所以我对 ids
的聚合有兴趣无法回复,我会认为没有适合他们的项目(但实际上有,但由于字数限制而没有回复)
我可以为每个 id
单独做,没有 aggs 就得到一个 count
,但是有很多,而且会非常昂贵。
根据聊天,发现没有不需要包含id的文档,因此不需要聚合,现在搜索结果中是否存在特定id是主要问题。
有几种方法:
- 使用multi_search with a single id in each sub-request
- 使用包含所有 ID 的单个搜索请求,但 post-processing 使用脚本或 source_filtering 并在响应中搜索 ID。
我在 foo
索引中有这样的实体:
{ids: ["aa", "bb"]}
{ids: ["aa", "cc"]}
{ids: ["ee"]}
{ids: ["ff" , "cc"]}
基本上我想知道是否有 ids aa
和 ee
的文档。
我试着用术语聚合来做到这一点
{
"size": 0,
"query": {
"bool": {
"should": [
{
"terms": {
"ids": [
"aa", "ee"
],
"boost": 1
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"aggregations": {
"byid": {
"terms": {
"field": "ids",
"min_doc_count": 1
}
}
}
}
但是这里的问题是,作为响应,我也得到了与所选实体具有的其他 ids
的聚合,并且在实际情况中有很多,所以我对 ids
的聚合有兴趣无法回复,我会认为没有适合他们的项目(但实际上有,但由于字数限制而没有回复)
我可以为每个 id
单独做,没有 aggs 就得到一个 count
,但是有很多,而且会非常昂贵。
根据聊天,发现没有不需要包含id的文档,因此不需要聚合,现在搜索结果中是否存在特定id是主要问题。
有几种方法:
- 使用multi_search with a single id in each sub-request
- 使用包含所有 ID 的单个搜索请求,但 post-processing 使用脚本或 source_filtering 并在响应中搜索 ID。