弹出搜索疑难查询与分组

时间:2015-12-02 12:05:56

标签: search elasticsearch filter grouping fuzzy-search

我是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 >匹配(模糊=自动)。并且任何版本必须具有此客户端的versionCreationDate的最大值,但是< =< VersionCreationDateMax >。因此,每个客户端的唯一版本应该在搜索结果中(最新,但不超过< VersionCreationDateMax >)

请帮我找到过滤器/查询来执行该操作

1 个答案:

答案 0 :(得分:0)

您可以使用以下查询来实现此目的:

  • 一个range过滤器,用于指定最大versionCreationDate
  • 然后terms字段
  • 上的一个client_id聚合
  • 最后,对于每个客户端存储区,在top_hits字段上以desc顺序排序的一个versionCreationDate子聚合,仅返回一个文档(即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
          }
        }
      }
    }
  }
}