【问题标题】:Elastic Search Difficult Query with Grouping带分组的弹性搜索困难查询
【发布时间】:2015-12-02 12:05:55
【问题描述】:

我是 Elastic Search (1.7) 的新手。 我有一个客户端版本的 ES 索引。

每个客户端都有一个唯一的 ID (client_id)。

有很多版本的客户端可以在索引中。

每个版本的客户端都有一个唯一的客户端 ID (version_id)。

索引数据示例:

{
  “client_id”: "1",
  "version_id": "1",
  “versionCreationDate”: "2015-11-06T10:02:22.597Z",
  “clientName”: “FirstName LastName”
}
…,
{
  “client_id”: "1",
  "version_id": "n",
  “versionCreationDate”: …
  “clientName”: “FirstName LastName”
},
{
  “client_id”: "2",
  "version_id": "1",
  “versionCreationDate”: …
  “clientName”: “FirstName LastName”
},
…
{
  “client_id”: "2",
  "version_id": "n",
  “versionCreationDate”: …
  “clientName”: “FirstName LastName”
},
…
{
  “client_id”: "N",
  "version_id": "1",
  “versionCreationDate”: …
  “clientName”: “FirstName LastName”
},
…
{
  “client_id”: "N",
  "version_id": "n",
  “versionCreationDate”: …
    “clientName”: “FirstName LastName”
}

我需要通过输入参数找到客户端的版本进行查询:

clientName>, VersionCreationDateMax>.

客户端的版本应该匹配 clientName>(模糊=auto)。并且任何版本都必须具有此客户端的 versionCreationDate 最大值,但 VersionCreationDateMax>。所以每个客户端的唯一版本应该在搜索结果中(最新,但不超过 VersionCreationDateMax>)

请帮助我找到过滤器/查询来做到这一点

【问题讨论】:

    标签: search elasticsearch filter grouping fuzzy-search


    【解决方案1】:

    您可以通过以下查询实现此目的:

    • 一个range过滤器指定最大versionCreationDate
    • 然后在client_id 字段上添加一个terms 聚合
    • 最后,对于每个客户端存储桶,一个top_hits 子聚合在versionCreationDate 字段上按desc 顺序排序,并且只返回一个文档(即size: 1

    这里是查询:

    {
      "query": {
        "filtered": {
          "filter": {
            "range": {
              "versionCreationDate": {
                "lt": "2015-12-02T00:00:00.000Z"
              }
            }
          }
        }
      },
      "aggs": {
        "clients": {
          "terms": {
            "field": "client_id"
          },
          "aggs": {
            "latest": {
              "top_hits": {
                "sort": [
                  {
                    "versionCreationDate": {
                      "order": "desc"
                    }
                  }
                ],
                "size": 1
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 很好,很高兴我能帮上忙!
    • Val,这可行,但 _score 仅在结果的“命中”部分。在“聚合”部分它是 ==null 。为什么?如何让 ES 在聚合部分返回分数?
    • 默认情况下,top hits 聚合中的分数默认为主查询的分数。由于您的查询仅包含过滤器,因此不涉及评分。
    • 感谢您的帮助!看看我的查询和结果:非常常见的带有聚合且没有过滤器的查询。 hits 部分有一个 _score,aggregations 部分有一个 null。 link
    • 我在您的问题中没有看到任何查询,只有一些示例文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多