Elasticsearch: поиск / порядок по общему весу тега
Я должен решить проблему, которая превосходит мои самые базовые знания в области эластичного поиска.
У меня есть набор объектов - у каждого есть набор тегов. Подобно:
obj_1 = ["a", "b", "c"]
obj_2 = ["a", "b"]
obj_3 = ["c", "b"]
Я хочу искать объекты, используявзвешенные метки, Например:
search_tags = {'a': 1.0, 'c': 1.5}
Я хочу, чтобы поисковые теги были запросом OR. То есть - я нене хочу исключать документы, которые нене иметь все запрашиваемые теги. Но я хочу, чтобы их упорядочивал тот, который имеет наибольший вес (вроде: каждый соответствующий тег умножается на его вес).
Используя приведенный выше пример, порядок возвращаемых герцогств будет:
obj_1 (оценка: 1,0 + 1,5)obj_3 (оценка: 1,5)obj_2 (оценка: 1,0)Каков наилучший подход к этому документу?S структура и правильный способ запроса ES?
Здесь есть похожий вопрос:Эластичный поиск - сила тегов (усиление вложенных / дочерних документов) Единственное, что я не хочу указывать вес при индексации - я хочу это сделать при поиске.
Моя текущая настройка выглядит следующим образом.
Объекты:
[
"title":"1", "tags" : ["a", "b", "c"],
"title":"2", "tags" : ["a", "b"],
"title":"3", "tags" : ["c", "b"],
"title":"4", "tags" : ["b"]
]
И мой запрос:
{
"query": {
"custom_filters_score": {
"query": {
"terms": {
"tags": ["a", "c"],
"minimum_match": 1
}
},
"filters": [
{"filter":{"term":{"tags":"a"}}, "boost":1.0},
{"filter":{"term":{"tags":"c"}}, "boost":1.5}
],
"score_mode": "total"
}
}
}
Проблема в том, что он возвращает только объекты 1 и 3. Он должен соответствовать объекту 2 (имеет тег «a») ну или я что то не так делаю?
ОБНОВЛЕНИЕ, КАК ПРЕДЛАГАЕТСЯ
Хорошо. Изменен буст в скрипте для расчета минимума. Убрано минимальное совпадение. Мой запрос:
{
"query": {
"custom_filters_score": {
"query": {
"terms": {
"tags": ["a", "c"]
}
},
"filters": [
{"filter":{"term":{"tags":"a"}}, "script":"1.0"},
{"filter":{"term":{"tags":"c"}}, "script":"1.5"}
],
"score_mode": "total"
}
}
}
Отклик:
{
"_shards": {
"failed": 0,
"successful": 5,
"total": 5
},
"hits": {
"hits": [
{
"_id": "3",
"_index": "test",
"_score": 0.23837921,
"_source": {
"tags": [
"c",
"b"
],
"title": "3"
},
"_type": "bit"
},
{
"_id": "1",
"_index": "test",
"_score": 0.042195037,
"_source": {
"tags": [
"a",
"b",
"c"
],
"title": "1"
},
"_type": "bit"
}
],
"max_score": 0.23837921,
"total": 2
},
"timed_out": false,
"took": 3
}
По-прежнему получаю неправильный заказ и один результат отсутствует. obj_1 должен быть перед obj_3 (потому что он имеет оба тега), а obj_2 по-прежнему полностью отсутствует. Как это может быть?