Я пытаюсь реализовать пользовательскую оценку в запросе ElasticSearch.
Прежде чем описывать проблему, я опишу свой вариант использования.
У меня есть объект Item
с несколькимиполя:
types
(ключевое слово): список типов themes
(ключевое слово): список типов location
:местонахождение предмета
Мой запрос состоит из:
- Сначала нацеливается на подмножество предметов. Элементы, которые имеют
TYPE1
, но не имеют TYPE2
и TYPE3
, например - Вторые определяющие правила для подсчета очков. Элементы с
TYPE4
должны быть увеличены на 2. Элементы с THEME1
должны быть увеличены на 3. Элементы в указанном многоугольнике должны быть увеличены на 4.
Вот запрос, который я пробовал:
{
"from": 0,
"size": 10,
"query": {
"function_score": {
"boost": 1,
"boost_mode": "multiply",
"query": {
"bool": {
"filter": [
{
"term": {
"types": {
"value": "TYPE1"
}
}
},
{
"not": {
"filter": {
"term": {
"types": {
"value": [
"TYPE2",
"TYPE3"
]
}
}
}
}
}
]
}
},
"functions": [
{
"filter": {
"term": {
"themes": "THEME1"
}
},
"weight": 3
},
{
"filter": {
"term": {
"types": "TYPE4"
}
},
"weight": 2
},
{
"filter": {
"geo_polygon": {
"location": {
"points": [ ... ]
}
}
},
"weight": 4
}
]
}
},
"sort": [
"_score"
]
}
По этому запросу я получил эту ошибку:
"type": "parsing_exception",
"reason": "no [query] registered for [not]",
Так что я думаю, что проблема на уровне блока not
...
Если я удалю этот блок, запрос будет успешным, но результаты не будут ожидаемыми (значение 0
для всех).
Я включил режим explain
и вижу:
"_explanation": {
"value": 0,
"description": "function score, product of:",
"details": [
{
"value": 0,
"description": "ConstantScore(types:TYPE1)^0.0",
"details": []
},
{
"value": 1,
"description": "min of:",
"details": [
{
"value": 1,
"description": "No function matched",
"details": []
},
{
"value": 3.4028235e+38,
"description": "maxBoost",
"details": []
}
]
}
]
Итак, мои вопросы:
- Как использовать блок
not
для этого запроса? - Как рассчитать оценку на основе
function_score
?
Спасибо за помощь, Тьерри