2016-03-30 10 views
1

Ich versuche, Elastic Search für das Speichern von Geodaten zu verwenden. Ich möchte jedoch, dass der Relevanzwert eine Kombination aus der Entfernung von einem Punkt und der Relevanz basierend auf Textabgleich-Abfragen ist. Nehmen wir beispielsweise an, dass die Abfrage Yellowstone National Park lautet, der Ursprung jedoch in Chicago liegt. Portage Park in Chicago ist eher passend, denn für jede angemessene Entfernung und Verfall, weil Yellowstone National Park einen Zerfall Wert nahe Null haben wird und nicht in den Ergebnissen überhaupt nicht angezeigt werden. Was ich gerne machen würde, ist einen FLOOR auf dem Decay-Score zu haben, so dass alle Ergebnisse über eine bestimmte Distanz gleich aussehen.Wie können Sie in ElasticSearch einen Boden für die Gaußsche Abklingfunktion festlegen?

Zum Beispiel ist hier der Java-Code ich habe:

 queryBuilder = new FunctionScoreQueryBuilder(queryBuilder).add(
     ScoreFunctionBuilders.gaussDecayFunction("search_geo_point", point.get(), "10km") 
      .setDecay(0.75) 
      .setOffset("5km")); 

Was ich möchte, um alle Punkte zu behandeln ist, die größer als 30 km sagen vom Ursprung als identisch und haben die Verfallsfunktion nicht länger den Punktestand über diesen Punkt hinaus reduzieren. Ist das möglich? Das Problem ist, dass die Decay-Funktion die Relevanz ab einer bestimmten Entfernung so stark reduziert, dass selbst wenn die Abfrage genau zu einem Textfeld passt, sie nicht in den Ergebnissen erscheint.

Antwort

1

Ich kenne keine Funktion in Function Score in Elasticsearch implementiert, obwohl es sehr praktisch wäre.

POST test/parks/_search 
{ 
    "query": { 
    "function_score": { 
     "query": { 
     "match": { 
      "name": "Yellowstone National park" 
     } 
     }, 
     "functions": [ 
     { 
      "gauss": { 
      "location": { 
       "origin": "41.4881832, -87.623177", 
       "scale": "10km", 
       "offset": "5km" 
      } 
      }, 
      "filter": { 
      "geo_distance_range": { 
       "from": "0km", 
       "to": "30km", 
       "location": { 
       "lat": 41.881832, 
       "lon": -87.623177 
       }, 
       "include_upper": false 
      } 
      } 
     }, 
     { 
      "weight": ## Set appropriate weight, 
      "filter": { 
      "geo_distance_range": { 
       "from": "30km", 
       "location": { 
       "lat": 41.881832, 
       "lon": -87.623177 
       }, 
       "include_lower": true 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

Mit der Abfrage oben, nur Sie die Gaußfunktion Punktzahl zu Hits im Bereich von 30km gelten:

Allerdings können Sie Ihr Ziel mit einem kleinen Problem zu umgehen, indem die Filterklauseln im function query erreichen . In der zweiten Filterklausel definieren Sie eine konstante Punktzahl für alle weiter entfernten Treffer. Beachten Sie, dass Sie include_upper und include_lower entsprechend festlegen sollten, um zu verhindern, dass dasselbe Element mehrfach bewertet wird.

Verwandte Themen