elasticsearch 返回从ID开始的文档,按时间戳排序

uoifb46i  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(234)

假设我有一个包含以下文档的索引:

{
    "id": "8e8e3c0c-5d1d-4a3c-a78a-1bd2d206b39e",
    "timestamp": "2022-10-18T00:00:02"
}
{
    "id": "0ebeb7b1-dcd0-4b37-a70d-fa7377f07f8c",
    "timestamp": "2022-10-18T00:00:03"
}
{
    "id": "ea779299-1781-4465-b8a1-53f7b14fbe0c",
    "timestamp": "2022-10-18T00:00:01"
}
{
    "id": "3624a119-4830-4ec2-a840-f656c048fc5c",
    "timestamp": "2022-10-18T00:00:04"
}

我需要一个搜索查询,它返回指定id中的文档,按timestamp排序,最多不超过100个。因此,给定8e8e3c0c-5d1d-4a3c-a78a-1bd2d206b39eid,将返回以下文档(请注意,按此顺序,缺少具有idea779299-1781-4465-b8a1-53f7b14fbe0c的文档,因为它的时间戳早于我正在查找的文档):

{
    "id": "8e8e3c0c-5d1d-4a3c-a78a-1bd2d206b39e",
    "timestamp": "2022-10-18T00:00:02"
}
{
    "id": "0ebeb7b1-dcd0-4b37-a70d-fa7377f07f8c",
    "timestamp": "2022-10-18T00:00:03"
}
{
    "id": "3624a119-4830-4ec2-a840-f656c048fc5c",
    "timestamp": "2022-10-18T00:00:04"
}

我知道如何在两个查询中完成此操作,首先通过id获取文档,然后通过另一个查询获取该文档的timestamp“之后”的所有文档,但我希望有一种更有效的方法使用一个查询来完成此操作。
请注意,该索引预计将包含数千万/数亿个文档,因此性能问题是一个因素(我不确定ES在幕后做了什么“工作”,例如首先排序,然后访问每个文档以检查id),但群集的大小将适当。

vbopmzt1

vbopmzt11#

您可以使用下面的bool查询,该查询将给出您预期的结果。must中的match_all将返回所有文档,should子句中的term将提升ID匹配的文档。
如果id字段定义为keyword类型,则仅在术语查询中使用id,如果它同时定义为textkeyword,则使用id.keyword

{
  "size": 100,
  "sort": [
    {
      "_score": "desc"
    },
    {
      "timestamp": {
        "order": "asc"
      }
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "should": [
        {
          "term": {
            "id.keyword": {
              "value": "8e8e3c0c-5d1d-4a3c-a78a-1bd2d206b39e"
            }
          }
        }
      ]
    }
  }
}

相关问题