Подтвердить что ты не робот

Elasticsearch - ускорение вложенного запроса с более высоким значением

У меня есть запрос (ну его часть - отдых неважен, как разбиение на страницы):

  "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
              }
            }
          ]
        }
      }
    }
  }

Это для поиска профиля, у которого есть навык "PHP" со значением 2 или более. Пользователь может выполнять поиск нескольких навыков = > пары значений. Он работает нормально, но у меня есть один вопрос:

Как сделать небольшой стимул для совпадающих навыков с более высоким уровнем квалификации. Просто чтобы заставить человека с значением PHP 3 быть выше в результатах поиска, чем кто-то с PHP 2, даже если оба правильные совпадения.

4b9b3361

Ответ 1

Я предлагаю использовать function_score для этого, а точнее field_value_factor функция, которая позволяет использовать значение поля в скоринга вычисление (с дополнительным фактором, с помощью которого можно умножить значение поля):

{
  "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
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}