【问题标题】:elasticsearch term aggregation with filtering带过滤的弹性搜索术语聚合
【发布时间】:2020-11-07 19:34:45
【问题描述】:

我在foo 索引中有这样的实体:

{ids: ["aa", "bb"]}
{ids: ["aa", "cc"]}
{ids: ["ee"]}
{ids: ["ff" , "cc"]}

基本上我想知道是否有 ID 为 aaee 的文档。 我试图用术语聚合来做到这一点

{
    "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,但是它们有很多而且会非常昂贵。

【问题讨论】:

    标签: elasticsearch elasticsearch-query


    【解决方案1】:

    基于聊天,发现没有包含id的文档是不需要的,因此不需要聚合,现在搜索结果中是否存在特定的id是主要问题。

    有几种方法:

    1. 使用multi_search with a single id in each sub-request
    2. 使用包含所有 ID 的单个搜索请求,但使用脚本或 source_filtering 进行后处理并在响应中搜索 ID。

    【讨论】:

    • 我需要分别知道每个 id 的存在。
    • @ЕгорЛебедев 请查看我更新的答案,我不明白每个 id 的存在是什么意思?如果您能提供您的预期输出,那就太好了
    • 请读到最后,真实案例中的 id 很多,术语聚合的大小限制可能会丢弃我感兴趣的 id。例如,如果我对 aazz 身份证。从查询响应中,我应该明白aa 有一些文档,但zz 没有文档,从简单的搜索中我无法理解
    • @ЕгорЛебедев,您可以在聚合中提供 size 属性,以便返回所有结果,但是是的,存在性能惩罚
    • @ЕгорЛебедев 同样使用elastic.co/guide/en/elasticsearch/reference/6.8/…源过滤,你可以知道哪个id,你的搜索结果conatins
    猜你喜欢
    • 1970-01-01
    • 2021-07-03
    • 2019-09-10
    • 2020-06-20
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    相关资源
    最近更新 更多