2017-01-24 2 views
1

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.

Antwort

0

Nach dem Schlafen auf das Problem, es traf mich, dass es nur Boolesche Logik ist. Also, ich kam mit dieser Lösung, die perfekt funktioniert, wobei ich die Arbeitsabfrage-Logik in einem must-Tag und den range Boost in einem should-Tag verpackt.

{ 
    "from": 0, 
    "size": 10, 
    "query": { 
    "function_score": { 
     "boost_mode": "replace", 
     "query": { 
     "filtered": { 
      "filter": { 
      # ... 
      }, 
      "query": { 
      "bool": { 
       "must": { 
       "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 
         } 
         } 
        } 
        ] 
       } 
       }, 
       "should": { 
       "range": { 
        "name.word_count": { 
        "lt": 2, 
        "boost": 40 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Yay!

Verwandte Themen