Elasticsearch: szukaj / zamów według ogólnej wagi tagu
Muszę rozwiązać problem, który przekracza moje podstawowe umiejętności elasticsearch.
Mam zestaw obiektów - każdy z nich ma zestaw znaczników. Lubić:
obj_1 = ["a", "b", "c"]
obj_2 = ["a", "b"]
obj_3 = ["c", "b"]
Chcę przeszukiwać obiekty za pomocąważone znaczniki. Na przykład:
search_tags = {'a': 1.0, 'c': 1.5}
Chcę, aby tagi wyszukiwania były zapytaniem OR. To znaczy - nie chcę wykluczać dokumentów, które nie mają wszystkich zapytanych tagów. Ale chcę, żeby były uporządkowane według tego, który ma największą wagę (rodzaj: każdy dopasowany znacznik pomnożony przez jego wagę).
Używając powyższego przykładu, kolejność zwracanych dokumentów będzie:
obj_1 (wynik: 1,0 + 1,5)obj_3 (wynik: 1,5)obj_2 (wynik: 1,0)Jakie byłoby najlepsze podejście do tego w odniesieniu do struktury dokumentu i prawidłowego sposobu kwerendy ES?
Podobne pytanie jest tutaj:Wyszukiwanie elastyczne - siła tagowania (wzmacnianie dokumentu zagnieżdżonego / podrzędnego) tylko, że nie chcę określać wagi podczas indeksowania - chcę to zrobić podczas wyszukiwania.
Moja obecna konfiguracja jest następująca.
Obiekty:
[
"title":"1", "tags" : ["a", "b", "c"],
"title":"2", "tags" : ["a", "b"],
"title":"3", "tags" : ["c", "b"],
"title":"4", "tags" : ["b"]
]
A moje zapytanie:
{
"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"
}
}
}
Problem polega na tym, że zwraca tylko obiekt 1 i 3. Powinien również pasować do obiektu 2 (ma znacznik „a”), czy też robię coś złego?
AKTUALIZACJA JAKO SUGEROWANA
Dobrze. Zmieniono wzmocnienie skryptu, aby obliczyć minimum. Usunięto minimalny mecz. Moja prośba:
{
"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"
}
}
}
Odpowiedź:
{
"_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
}
Ciągle się mylę i brakuje jednego wyniku. obj_1 powinien znajdować się przed obj_3 (ponieważ ma oba znaczniki), a obj_2 nadal brakuje. Jak to może być?