ElasticSearch — use distance from point to affect

2020-06-03 02:22发布

问题:

Trying to use ElasticSearch to create a search that uses distance from a centerpoint to influence relevance.

I don't want to simply sort on distance from a point, which I know is possible, because I want relevance based on the searched query to also affect results.

I'd like to pass in a search string, say "coffee", and a lat/lon, say "38, -77", and get my results ordered by a combination of how related they are to "coffee" and how close they are to "38, -77".

Thanks!

回答1:

You can use distance function in the script of the Custom Score Query to modify _score based on the distance from a centerpoint.



回答2:

The recently (0.90.4) added function_score query type adds support for ranking based on distance. This is an alternative to the custom score query type.

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

An example lifted from there:

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

This applies a decay function (there are several) to a field ("loc") that scores against the distance from an origin given a particular scale. This is exactly what you'd want for distance ranking since it gives you a lot of flexibility to how it should rank without writing custom scripts.