如何在Elasticsearch上查询根字段上的值和嵌套数组字段上的范围?

xxls0lw8  于 2023-06-21  发布在  ElasticSearch
关注(0)|答案(1)|浏览(108)

我有一个clients索引,其结构如下:

{
  client_id: uuid,
  name.keyword: keyword,
  events: [
    { created_at: date, id: uuid},
    { created_at: date, id: uuid}
  ]
}

每个客户端记录下都有多个events
如何查询此索引以获取client_id = 123events.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": []
    }
  }
}

这将返回无命中。

m2xkgtsf

m2xkgtsf1#

在@瓦尔的帮助下,我把这个查询组合在一起:

GET /clients/_search
{
  "_source": ["name.keyword","events.created_at"], 
  "query": {
    "bool": {
      "must": [],
      "filter": [
        {
          "term": {
            "name.keyword": "ACME Inc."
          }
        },
        {
          "nested": {
            "path": "events",
            "query": {
              "range": {
                "events.created_at": {
                  "gte": "2021-06-20T00:00:00Z",
                  "lte": "2021-09-20T00:00:00Z"
                }
              }
            }
          }
        }
      ]
    }
  }
}

相关问题