2012-10-24 6 views
10

Der Versuch, ElasticSearch zu verwenden, um eine Suche zu erstellen, die die Entfernung von einem Mittelpunkt verwendet, um die Relevanz zu beeinflussen.ElasticSearch - Entfernung vom Punkt zur Abfragerelevanz verwenden

Ich möchte nicht einfach die Entfernung von einem Punkt sortieren, von dem ich weiß, dass es möglich ist, weil ich möchte, dass Relevanz basierend auf der gesuchten Abfrage auch die Ergebnisse beeinflusst.

Ich würde gerne eine Suchzeichenfolge eingeben, sagen "Kaffee", und ein lat/lon, sagen "38, -77", und erhalten meine Ergebnisse durch eine Kombination aus, wie sie auf "Kaffee "und wie nahe sie zu" 38, -77 "sind.

Danke!

Antwort

6

Sie können distance function im Skript Custom Score Query verwenden, um _score basierend auf der Entfernung von einem Mittelpunkt zu ändern.

+0

Würden diese Gewichte nach der eigentlichen Suche angewendet werden? Der Grund, warum ich frage, ist, weil, wenn das Limit für die Suche 100 Ergebnisse und die Gesamttreffergebnisse 1000 waren, dann könnten einige sehr enge Ergebnisse weggelassen werden, wenn sie nach den ersten 100 kamen. –

+0

Diese Gewichte würden nach der Suche aber angewendet werden vor dem Abruf. Die erste Suche wird durchgeführt und 1000 (in Ihrem Beispiel) Ergebnisse werden gesammelt. Für jedes erfasste Ergebnis wird der Relevanzwert anhand des bereitgestellten Skripts berechnet, und die obersten 100 Ergebnisse werden beibehalten. Wenn alle 1000 Datensätze aus den Suchergebnissen verarbeitet wurden, werden die ersten 100 Datensätze abgerufen. – imotov

+0

Vielen Dank für Ihre Hilfe! So funktioniert elasticsearch immer? Es scheint, dass bei einigen Abfragen, die eine große "Unschärfe" enthalten, der potenzielle Suchsatz Millionen von Ergebnissen mit geringer Relevanz enthalten könnte. Wie weiß elasticsearch, wann man aufhört zu suchen? –

10

Der kürzlich hinzugefügte Abfragetool function_score (0.90.4) fügt Unterstützung für die Rangfolge basierend auf der Entfernung hinzu. Dies ist eine Alternative zum Abfragetyp für benutzerdefinierte Treffer. Dies gilt eine Abklingfunktion (es gibt mehr) auf ein Feld

"query": { 
    "function_score": { 
    "functions": [ 
     { "gauss": { "loc": { "origin": "51,0", "scale": "5km" }}}, 
    ] 
    } 
} 

("LOC"), die Spielstände gegen den Abstand von einem Ursprung a angegeben:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

Ein Beispiel von dort abgehoben bestimmter Maßstab. Dies ist genau das, was Sie für das Entfernungsranking wünschen, da es Ihnen eine Menge Flexibilität gibt, wie es rangieren sollte, ohne benutzerdefinierte Scripts zu schreiben.

+0

Welche Art von Feld ist "loc"? Kannst du ein bisschen mehr darüber erzählen? Ich habe so etwas wie "loc": "12.5,65.5" und es scheint nicht zu funktionieren. –

+0

könnte sich geändert haben, seit ich dies geschrieben habe, gab es eine Menge Veränderung um Geo-Zeug in den letzten Elasticsearch-Versionen. 0,90.4 ist schon lange her. –

+0

Wird es herausfinden. Vielen Dank ! –

Verwandte Themen