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