Elasticsearch назначает приоритеты определенным _ids, но не фильтрует?

Я пытаюсь отсортировать свой запрос в asticsearch, где запрос будет расставлять приоритеты для документов с определенными _ids, чтобы они появлялись первыми, но он не будет фильтровать весь запрос на основе _ids, это просто расставляет приоритеты.

Вот пример того, что я попробовал как попытку:

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

Таким образом, вышеприведенное будет включено вместе с другими запросами, однако запрос просто возвращает точные совпадения, а не остальные результаты.

Любые идеи относительно того, как это можно сделать так, чтобы он просто расставил приоритеты документов с идентификаторами, но не отфильтровать весь запрос?

2 ответа

Решение

Попробуйте это (и вместо этого match_all() там вы можете использовать запрос для фактической фильтрации результатов):

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

Если вам нужно вернуть в точном порядке, как вам нужно пойти с

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

PS Как @Val упомянул wityh _id, это не будет работать, поэтому вам нужно будет хранить поле id как отдельное.

Если вам нужно переместить документы наверх, посмотрите на function_score

Другие вопросы по тегам