KombinierenElasticsearch Bool Abfrage mit Bereich Boost
Ich habe eine komplexe bool
Abfrage wie folgt Elasticsearch Bool Abfrage mit Bereich Boost Kombinieren. Ich verwende einen falschen Suchbegriff dgbdrtgndgfndrtgb
um mein Beispiel zu fabrizieren, das mit nichts übereinstimmen sollte.
{
"from": 0,
"size": 10,
"query": {
"function_score": {
"boost_mode": "replace",
"query": {
"filtered": {
"filter": {
# ...
},
"query": {
"bool": {
"should": [
{
"match": {
"name.suggest_ngrams": {
"query": "dgbdrtgndgfndrtgb",
"fuzziness": "AUTO",
"prefix_length": 1,
"operator": "AND",
"boost": 10
}
}
},
{
"multi_match": {
"query": "dgbdrtgndgfndrtgb",
"fields": [
"name.untouched_lowercase"
],
"boost": 5
}
},
{
"query_string": {
"fields": [
"name.suggest"
],
"query": "dgbdrtgndgfndrtgb*",
"boost": 10
}
},
{
"query_string": {
"fields": [
"name.suggest"
],
"query": "dgbdrtgndgfndrtgb",
"boost": 10
}
},
{
"match": {
"first_word": {
"query": "dgbdrtgndgfndrtgb",
"operator": "AND",
"boost": 10
}
}
},
{
"match": {
"name": {
"query": "dgbdrtgndgfndrtgb",
"operator": "AND",
"boost": 5
}
}
}
]
}
}
}
}
}
}
}
Das funktioniert gut. Nun möchte ich für jedes dieser Übereinstimmungen ein boost
hinzufügen, wobei das Feld name
weniger als 2 Wörter enthält. Mit anderen Worten: Erhöhen Sie Übereinstimmungen mit einem Wort oder sortieren Sie sie an den Anfang der Ergebnismenge.
Also habe ich versucht, einen range
Schub wie folgt ergänzt:
{
"from": 0,
"size": 10,
"query": {
"function_score": {
"boost_mode": "replace",
"query": {
"filtered": {
"filter": {
# ...
},
"query": {
"bool": {
"should": [
{
"match": {
"name.suggest_ngrams": {
"query": "dgbdrtgndgfndrtgb",
"fuzziness": "AUTO",
"prefix_length": 1,
"operator": "AND",
"boost": 10
}
}
},
{
"multi_match": {
"query": "dgbdrtgndgfndrtgb",
"fields": [
"name.untouched_lowercase"
],
"boost": 5
}
},
{
"query_string": {
"fields": [
"name.suggest"
],
"query": "dgbdrtgndgfndrtgb*",
"boost": 10
}
},
{
"query_string": {
"fields": [
"name.suggest"
],
"query": "dgbdrtgndgfndrtgb",
"boost": 10
}
},
{
"match": {
"first_word": {
"query": "dgbdrtgndgfndrtgb",
"operator": "AND",
"boost": 10
}
}
},
{
"match": {
"name": {
"query": "dgbdrtgndgfndrtgb",
"operator": "AND",
"boost": 5
}
}
},
{
"range": {
"name.word_count": {
"lt": 2,
"boost": 40
}
}
}
]
}
}
}
}
}
}
}
Diese Dinge sortiert wie ich will, aber es gibt auch Einzelwort Spiele, die die Suche nicht dgbdrtgndgfndrtgb
Begriff entsprechen.
Gibt es eine Möglichkeit, nur Einzelwort-Treffer zu erhöhen, die auch dem Suchbegriff entsprechen? Ich habe versucht, die boost
Wert zu senken, die die gewünschte Sortierung bei Verwendung eines gültigen (gefundenen) Suchbegriffs bricht.
Es scheint, als ob es eine Möglichkeit geben sollte AND
die gesamte bool
Abfrage mit der range
Boost. Ich habe verschiedene Permutationen versucht, um dies ohne Glück zu erreichen und die Dokumente sind weniger als hilfreich.
Ein Vorbehalt: Ich kann nicht Skripting verwenden, da der Index auf AWS gehostet wird, die es nicht unterstützt.
Jeder Rat wird geschätzt.