Nishant Kumar
Nishant Kumar

Reputation: 117

ElasticSearch : How can I boost score depending on field value?

I am trying to get rid of sorting in elasticsearch by boosting the _score based on field value. Here is my scenario:

I have a field in my document: applicationDate. This is time elapsed since EPOC. I want record having greater applicationDate (most recent) to have higer score.

If score of two documents are same, I want to sort them on another field that is of type String. Say "status" is another field that can have value (Available, in progress, closed ). So, documents having same applicationDate should have _score based on status. Available should have more score , In Progress a less, Closed, least. So by this means, I wont have to sort the documents after getting results.

Please give me some pointers.

Upvotes: 1

Views: 7607

Answers (3)

llermaly
llermaly

Reputation: 2510

There is a new field called rank_feature_field that can be useful for this usecase:

https://www.elastic.co/guide/en/elasticsearch/reference/current/rank-feature.html

Upvotes: 0

keety
keety

Reputation: 17461

You should be able to achieve this using Function Score . Depending on your requirements it could be as simple as the following Example:

  put test/test/1 
{
     "applicationDate" : "2015-12-02",
     "status" : "available"
}
put test/test/2
{
     "applicationDate" : "2015-12-02",
     "status" : "progress"
}

put test/test/3
{
     "applicationDate" : "2016-03-02",
     "status" : "progress"
}


post test/_search
{
   "query": {
      "function_score": {
         "functions": [
             {
               "field_value_factor" : {
                    "field" : "applicationDate",
                    "factor" : 0.001
               }
             },
            {
               "filter": {
                  "term": {
                     "status": "available"
                  }
               },
               "weight": 360
            },
            {
               "filter": {
                  "term": {
                     "status": "progress"
                  }
               },
               "weight": 180
            }
         ],
         "boost_mode": "multiply",
         "score_mode": "sum"
      }
   }
}
**Results:**

"hits": [
     {
        "_index": "test",
        "_type": "test",
        "_id": "3",
        "_score": 1456877060,
        "_source": {
           "applicationDate": "2016-03-02",
           "status": "progress"
        }
     },
     {
        "_index": "test",
        "_type": "test",
        "_id": "1",
        "_score": 1449014780,
        "_source": {
           "applicationDate": "2015-12-02",
           "status": "available"
        }
     },
     {
        "_index": "test",
        "_type": "test",
        "_id": "2",
        "_score": 1449014660,
        "_source": {
           "applicationDate": "2015-12-02",
           "status": "progress"
        }
     }
  ]

Upvotes: 9

jay
jay

Reputation: 2077

Have you looked at function scores? https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

Specifically look at decay functions in the above documentation.

Upvotes: 0

Related Questions