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 по-прежнему полностью отсутствует. Как это может быть?

Ответы на вопрос(1)

Ваш ответ на вопрос