【问题标题】:Elasticsearch: Aggregate all unique values of a field and apply a condition or filter by another fieldElasticsearch:聚合一个字段的所有唯一值并按另一个字段应用条件或过滤器
【发布时间】:2020-02-07 13:30:29
【问题描述】:

我的文档如下所示:

{
    "ownID": "Val_123",
    "parentID": "Val_456",
    "someField": "Val_78",
    "otherField": "Val_90",
     ...
}

我正在尝试获取 ownID 值列表的所有(唯一,如在一个实例中)结果,同时按 parentID 值列表过滤,反之亦然反之亦然。

到目前为止我所做的是:

  • 获取(单独!)key1key2ownIDparentID 的唯一值
{
  "size": 0,
  "aggs": {
    "key1": {
      "terms": {
        "field": "ownID",
        "include": {
          "partition": 0,
          "num_partitions": 10
        },
        "size": 100
      }
    },
    "key2": {
      "terms": {
        "field": "parentID",
        "include": {
          "partition": 0,
          "num_partitions": 10
        },
        "size": 100
      }
    }
  }
}
  • 使用过滤器获取(某些)匹配 ownIDparentID 的结果
{
  "size": 0,
  "query": {
    "bool": {
      "should": [
        {
          "terms": {
            "ownID": ["Val_1","Val_2","Val_3"]
          }
        },
        {
          "terms": {
            "parentID": ["Val_8","Val_9"]
          }
        }
      ]
    }
  },
  "aggs": {
    "my_filter": {
      "top_hits": {
        "size": 30000,
        "_source": {
          "include": ["ownID", "parentID","otherField"]
        }
      }
    }
  }
}

但是,我需要为第二个查询中的每个过滤器获取单独结果,然后获取:

  • (1)ownID 的某个值匹配的文档的 parentID
  • (2)parentID 的某个值匹配的文档的 ownID

到目前为止,我设法使用两个类似的查询来做到这一点(请参阅下面的 (1)),但理想情况下,我希望将它们组合起来并只查询一次。

{
  "size": 0,
  "query": {
    "bool": {
      "should": [
        {
          "terms": {
            "ownID": [ "Val1", Val_2, Val_3 ]
          }
        }
      ]
    }
  },
  "aggs": {
    "my_filter": {
      "top_hits": {
        "size": 30000,
        "_source": {
          "include": "parentID"
        }
      }
    }
  }
}

我使用的是 Elasticsearch 5.2 版

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation elasticsearch-query


    【解决方案1】:

    如果我正确地回答了您的问题,那么无论过滤器查询如何,您都需要使所有聚合计数正确,但在搜索命中时您只需要过滤后的文档,因此对于此弹性搜索有另一种类型的过滤器:“后过滤器”:参考这个:https://www.elastic.co/guide/en/elasticsearch/reference/5.5/search-request-post-filter.html

    它真的很简单,它只会在计算聚合后过滤结果。

    【讨论】:

    • 感谢您的回答!我尝试实现它,但是 post_filter 应用于命中,而我的(选择性字段)结果为 aggs。此外,我无法使用筛选条件的值列表。我使用 Elasticsearch 的时间相对较短,因此在理解如何使用所有内容方面可能存在一些局限性。我希望不要问太多,但你能详细说明一下我的用例吗?
    • 您希望将术语聚合的结果用作过滤条件吗?如果是这种情况,那么最好先执行一个聚合查询,然后执行一个单独的过滤器查询,因为过滤器也会被缓存,这样也会带来性能优势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多