Elasticsearch: búsqueda / orden por peso total de la etiqueta

Tengo que resolver un problema que supera mi conocimiento básico de búsqueda de elastics.

Tengo un conjunto de objetos, cada uno tiene un conjunto de etiquetas. Me gusta:

obj_1 = ["a", "b", "c"]
obj_2 = ["a", "b"]
obj_3 = ["c", "b"]

Quiero buscar los objetos usandoetiquetas ponderadas. Por ejemplo:

search_tags = {'a': 1.0, 'c': 1.5}

Quiero que las etiquetas de búsqueda sean una consulta OR. Es decir, no quiero excluir documentos que no tengan todas las etiquetas consultadas. Pero quiero que sean ordenados por el que tenga más peso (más o menos: cada etiqueta combinada multiplicada por su peso).

Usando el ejemplo anterior, el orden de los ductos devueltos sería:

obj_1 (puntuación: 1.0 + 1.5)obj_3 (puntuación: 1.5)obj_2 (puntuación: 1.0)

¿Cuál sería el mejor enfoque para esto con respecto a la estructura del documento y la forma correcta de consultar ES?

Hay una pregunta similar aquí:Búsqueda elástica: fuerza de etiquetado (aumento de documentos anidados / secundarios) solo que no quiero especificar el peso al indexar, quiero que se haga al buscar.

Mi configuración actual es la siguiente.

Los objetos:

[
   "title":"1", "tags" : ["a", "b", "c"],
   "title":"2", "tags" : ["a", "b"],
   "title":"3", "tags" : ["c", "b"],
   "title":"4", "tags" : ["b"]
]

Y mi consulta:

{ 
    "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"
        }
    }
}

El problema es que solo devuelve el objeto 1 y 3. También debe coincidir con el objeto 2 (tiene la etiqueta "a") o ¿estoy haciendo algo mal?

ACTUALIZACIÓN SEGÚN SUGERIDO

De acuerdo. Se cambió el impulso al script para calcular el mínimo. Eliminado el mínimo partido. Mi petición:

{
    "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"
        }
    }
}

Respuesta:

{
    "_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
}

Sigo recibiendo mal orden y falta un resultado. obj_1 debe estar antes de obj_3 (porque tiene ambas etiquetas) y obj_2 aún falta por completo. ¿Cómo puede ser esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta