Martijn van Maasakkers
Martijn van Maasakkers

Reputation: 2817

Sorting by distance on a numeric field in ElasticSearch

For a project I need to select documents which are within filter bounds and a closest to a numeric value. This is about a price and I cannot seem to find if this is possible.

Say I have 2 documents:

{
    "name": "Document1",
    "price": 46.12,
    "tags": ["tag1", "tag2"]
}
{
    "name": "Document2",
    "price": 82.29,
    "tags": ["tag1", "tag3"]
}    

Is it possible to get the document with the price closest to 66.23?

Upvotes: 4

Views: 1098

Answers (1)

Martijn van Maasakkers
Martijn van Maasakkers

Reputation: 2817

The answer (thanks to keety) was to enable dynamic scripting and add a sorting method like this:

{
    "query": {
        "filtered" : {
            "query":{
                "match_all" : { }
            },
            "filter": {}
        }
    },
    "sort" : {
        "_script" : {
            "script" : "cur = (factor - doc['age'].value); if (cur < 0) { cur = cur * -1 } else { cur = cur}",
            "type" : "number",
            "params" : {
                "factor" : 45
            },
            "order" : "asc"
        }
    }
}

This sorts from closest to farthest and works like a charm. Thanks!

Upvotes: 5

Related Questions