Elasticsearch 优先考虑特定的 _id 但不过滤?

Elasticsearch prioritize specific _ids but don't filter?

我正在尝试在 elasticsearch 中对我的查询进行排序,其中查询将优先显示具有特定 _id 的文档,但它不会根据 _id 过滤整个查询,它只是对它们进行优先排序。

这是我尝试过的示例:

{"query":{"constant_score":{"filter":{"terms":{"_id":[2,3,4]}},"boost":2}}}

因此上述内容将与其他查询一起包括在内,但是查询只是 returns 完全匹配而不是其余结果。

关于如何做到这一点的任何想法,以便它只优先考虑具有 ID 的文档而不过滤整个查询?

如果您需要 return 的确切顺序,请使用

 "sort": [
    {
      "_script": {
        "script": "doc['id'] != null ? sortOrder.indexOf(doc['id'].value.toInteger()) : 0",
        "type": "number",
        "params": {
          "sortOrder": [
            2,3,4
          ]
        },
        "order": "desc"
      }
    },
    "_score"
  ]

P.S。正如@Val 提到的 wityh _id 这将不起作用,因此您需要单独存储 id 字段。

如果您需要将文档移动到顶部,请查看function_score

试试这个(而不是那个 match_all() 你可以使用查询来实际过滤结果):

{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "filter": {
            "terms": {
              "_id": [
                2,
                3,
                4
              ]
            }
          },
          "weight": 2
        }
      ]
    }
  }
}