Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Elasticsearch - boost nested query with higher value

I have a query (well a part of it - rest is unimportant like pagination):

  "query": {
    "filtered": {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "is_active": true
              }
            }
          ],
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "nested": {
                      "path": "skills",
                      "query": {
                        "bool": {
                          "must": [
                            {
                              "bool": {
                                "must": [
                                  {
                                    "range": {
                                      "skills.value": {
                                        "gte": "2"
                                      }
                                    }
                                  },
                                  {
                                    "term": {
                                      "skills.skill.name": "php"
                                    }
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      }
                    }
                  }
                ],
                "boost": 2
              }
            }
          ]
        }
      }
    }
  }

It's for searching profile, which has a skill "PHP" with value 2 or more. User can search for multiple skills=>values pair. It's working fine, but I have one question:

How to make a little boost for matched skills which has higher skills.value, just to make person with PHP value 3 be higher in search results than someone with PHP 2 even if both are correct match.

like image 776
barat Avatar asked Sep 28 '15 15:09

barat


1 Answers

I suggest using function_score to do this and more specifically the field_value_factor function which allows to use a field value in the scoring computation (with an optional factor by which to multiply the field value):

{
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "is_active": true
              }
            }
          ],
          "should": [
            {
              "nested": {
                "path": "skills",
                "query": {
                  "function_score": {
                    "query": {
                      "bool": {
                        "must": [
                          {
                            "range": {
                              "skills.value": {
                                "gte": "2"
                              }
                            }
                          },
                          {
                            "term": {
                              "skills.skill.name": "php"
                            }
                          }
                        ]
                      }
                    },
                    "functions": [
                      {
                        "field_value_factor": {
                          "field": "skills.value",
                          "factor": 2
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}
like image 178
Val Avatar answered Nov 02 '22 14:11

Val