Elasticsearch, как заменить термин "запрос"? - PullRequest
0 голосов
/ 05 февраля 2019

При использовании Elasticsearch до версии 6 следующий запрос возвращал совпадения на основе сходства с запросом.Теперь в ES 6+ это возвращает попадание в зависимости от того, соответствуют ли они какой-либо части запроса, все с одинаковым счетом.Это изменение нарушает остальную часть более сложного запроса (не показан).

Как получить оценки попаданий, соответствующие старому ES 5 - для следующего запроса

{
  "query": {
    "bool": {
      "should": [
        {
          "terms": {
            "some_field_name": [
              "iPad Pro",
              "iPhone 8"
            ]
          }
        }
      ]
    }
  }
}

В ES 5это возвращает хиты, набранные выше для соответствия всем терминам и ниже для соответствия меньше.В ES 6+ это возвращает попадания только с оценками = 1, и поэтому они ранжируются независимо от того, сколько было совпадений.

Например, попадание с обоими терминами оценивается выше в ES 5:

"_score": 0.87546873, when 2 of 4 terms match
"_score": 0.60353506, when 2 of 5 terms match
"_score": 0.13353139, when 1 of 4 terms match

Это очень похоже на желаемое «косинусное» сходство, которое нам нужно (мы понимаем, что это не совсем то, как создаются оценки).

Какой запрос вернет те же оценки, что и ES 5делает для вышеупомянутого запроса.Другими словами, что такое эквивалентный запрос ES 6?

1 Ответ

0 голосов
/ 06 февраля 2019

Примечание: просто опубликовать его как черновик, поскольку обсуждение в комментариях становится длиннее и неуклюже.

ОБНОВЛЕНИЕ: Просто проверил оба предложенных мной метода, и оба, похоже,дать аналогичную оценку.Пожалуйста, попробуйте эти методы и посмотрите, имеют ли баллы, которые вы получаете, какое-либо отношение к вам.

Я понимаю, что это не работает для терминов, но я предложил заменить его на несколько фильтров "term"который также имеет параметр boost или замените его запросом "term_set" и установите для параметра required_matches значение "1", так как нам нужно поведение "или".

1) Использование запроса term_set:

{
  "query": {
    "bool": {
      "should": [
        {
          "terms_set": {
            "some_field_name": {
             "terms" : ["iPad Pro", "iPhone 8"],
             "minimum_should_match_script": {
                "source": "1"
              } 

            }
          }
        }
      ]
    }
  }
}

2) Использование фильтров нескольких терминов вместо фильтра отдельных терминов:

{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "some_field_name": "iPad Pro"
          }
        },
        {
          "term": {
            "some_field_name": "iPhone 8"
          }
        }
      ]
    }
  }
}

Если вы использовали повышение в терминах, то вы должны применять одинаковое повышение в каждом из блоков терминов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...