我有一个clients
索引,其结构如下:
{
client_id: uuid,
name.keyword: keyword,
events: [
{ created_at: date, id: uuid},
{ created_at: date, id: uuid}
]
}
每个客户端记录下都有多个events
。
如何查询此索引以获取client_id = 123
和events.created_at
在“2021-01-01”和“2022-01-01”之间的记录?
我只需要包括至少有一个事件与范围匹配的客户端。我似乎总是得到响应的所有记录,因为当有多个事件时,其中一个将总是匹配范围检查中的一个。
- 更新7. Jun 2023:* 以下是我迄今为止尝试的:
nested
搜索的很多变化
GET /clients/_search
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "events",
"query": {
"range": {
"events.created_at": {
"gte": "2023-05-21T00:00:00Z",
"lte": "2023-06-21T00:00:00Z"
}
}
}
}
},
{
"term": {
"name.keyword": "ACME Inc."
}
}
]
}
}
}
这将返回无命中。
同上,但没有根级name.keyword
过滤器
GET /clients/_search
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "events",
"query": {
"range": {
"events.created_at": {
"gte": "2023-05-21T00:00:00Z",
"lte": "2023-06-21T00:00:00Z"
}
}
}
}
}
]
}
}
}
这将返回太多的命中。日期过滤器做了“一些事情”,但结果是比预期的多10倍。
没有nested
/path
,让我们看看…
GET /clients/_search
{ "query": {
"bool": {
"must": [],
"filter": [
{
"match_all": {}
},
{
"match_phrase": {
"name.keyword": "ACME Inc."
}
},
{
"range": {
"events.created_at": {
"gte": "2023-01-01T00:00:00.000+01:00",
"lt": "2023-01-02T00:00:00.000+01:00"
}
}
}
],
"should": [],
"must_not": []
}
}
}
这将返回无命中。
1条答案
按热度按时间m2xkgtsf1#
在@瓦尔的帮助下,我把这个查询组合在一起: