2013-08-28 3 views
18

Gibt es einen Weg in elasticsearch, um die Bedeutung der exakten Phrase im Dokument zu erhöhen?elasticsearch Boost Wichtigkeit der exakten Wortgruppe

Zum Beispiel, wenn ich nach dem Ausdruck "web developer" suchte und wenn die Wörter "web developer" zusammen auftraten, würden sie im Vergleich zu "web" und "developer" im gesamten Dokument um 5 erhöht werden. Dadurch würde jedes Dokument, das "Web-Entwickler" zusammen enthält, zuerst in den Ergebnissen erscheinen.

Antwort

24

Sie können verschiedene Abfragen zusammen mit einem kombinieren, und Sie können ihnen auch einen anderen Boost zuweisen. Nehmen wir an, Sie haben einen regulären match query für beide Begriffe, unabhängig von deren Positionen, und dann eine Phrasenabfrage mit einem höheren Boost.

Etwas wie folgt aus:

{ 
    "query": { 
    "bool": { 
     "must": { 
      "match": { 
      "field": "web developer", 
      "operator": "and" 
      } 
     }, 
     "should": { 
      "match_phrase": { 
      "field": "web developer" 
      } 
     } 
    } 
    } 
} 

Ungeprüfte:

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "field": "web developer" 
      } 
     }, 
     { 
      "match_phrase": { 
      "field": "web developer", 
      "boost": 5 
      } 
     } 
     ], 
     "minimum_number_should_match": 1 
    } 
    } 
} 
+1

Aber was passiert, wenn ich eine solche Abfrage über mehrere Indizes und einer variierenden Menge von Feldern ausführen möchten? Soweit ich weiß, funktioniert match_phrase nur mit einem bestimmten Feldnamen. In meinem Fall brauche ich (generisch gesprochen) etwas wie '{" query_string ": {" query ":" mein exakter Ausdruck "," fields ": [" typeA.fieldA "," typeB.fieldB "]}}' – leandroico

7

Als Alternative zu javanna ‚s Antwort, könnten Sie etwas ähnliches mit must und should Klauseln innerhalb einer bool Abfrage tun , aber ich glaube, dass die Klausel must hier Ergebnisse mit sowohl "Web" und "devel." oper 'und die should-Klausel werden Sätze mit "Web-Entwickler" höher punkten.

+0

Ja, dies gibt einem Dokument mit "Web-Entwickler" eine höhere Relevanz, aber das OP wollte die relative Wichtigkeit kontrollieren (unter Verwendung der Nummer "5"). Zum Beispiel, vielleicht in einem seltenen Fall, könnte ein Dokument mit Tonnen der Token 'web' und' developer', die überall auftauchen, ein Dokument mit einem einzigen 'Webentwickler' herausschlagen. Mit dieser Antwort geben Sie diesen beiden Fragen dieselbe Bedeutung ([ref] (https://www.elastic.co/guide/en/elasticsearch/guide/current/bool-query.html#_score_calculation)). – Garrett

1

Ich verwendete unter Beispiel Abfrage in meinem Fall, der funktioniert. Es bringt exakte + unscharfe Ergebnisse, aber genaue werden erhöht!

{ "query": { 
"bool": { 
    "should": [ 
    { 
     "match": { 
     "name": "pala" 
     } 
    }, 
    { 
     "fuzzy": { 
     "name": "pala" 
     } 
    } 
    ] 
}}} 
0

Ich denke, sein Standardverhalten bereits mit Spiel Abfrage „oder“ Operator. Es wird die Phrase "Web-Entwickler" zuerst und dann Begriffe wie "Web" oder "Develeper" filtern. Obwohl Sie Ihre Anfrage mit den obigen Antworten verbessern können. Korrigiere mich, wenn ich falsch liege.

2

Sie könnten versuchen, Rescore zu verwenden, um eine exakte Wortgruppe auf Ihren ersten Ergebnissen zu führen. Aus der Dokumentation:

"Rescoring kann helfen, die Genauigkeit zu verbessern, indem nur die obersten (z. B. 100 - 500) Dokumente, die von den Abfrage- und post_filter-Phasen zurückgegeben werden, mit einem sekundären (in der Regel teureren) Algorithmus ersetzt werden Algorithmus für alle Dokumente im Index. "

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-rescore.html