我是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 >)
请帮我找到过滤器/查询来执行该操作
答案 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
}
}
}
}
}
}