Объединение нескольких разных function_score с Elasticsearch - PullRequest
2 голосов
/ 02 июня 2019

У меня есть несколько разных Elasticsearch function_score, но я не уверен, как их объединить

Это тестовый набор, на который я смотрю (я добавил комментарии, чтобы иметь возможность ссылаться на конкретные элементы ввопрос, эти комментарии на самом деле не в индексе)

[
    { // Item 1
        "priority": 0.7,
        "classification": [
            {
                "feature": "A",
                "confidence": 0.4
            },
            {
                "feature": "C",
                "confidence": 0.3
            },
            {
                "feature": "B",
                "confidence": 0.6
            }
        ]
    },
    { // Item 2
        "priority": 0.8,
        "classification": [
            {
                "feature": "A",
                "confidence": 0.3
            },
            {
                "feature": "C",
                "confidence": 0.6
            }
        ]
    },
    { // Item 3
        "priority": 0.4,
        "classification":  [
            {
                "feature": "D",
                "confidence": 0.6
            },
            {
                "feature": "C",
                "confidence": 0.8
            }
        ]
    }
]

Теперь предположим, что я хочу оценивать элементы со следующими весами:

  • "A" с весом 2
  • "B" с весом 3

Я хотел бы сделать следующее:

  1. Рассчитать среднюю достоверность для каждого элемента только для функций "A"и «B» (например, средняя достоверность 0,5 для элемента 1)
  2. Рассчитать приоритет для каждого элемента (например, популярность 0,8 для элемента 2)
  3. Рассчитать сумму весов для каждого элемента элемента (еслипредмет имеет особенность «A», он получает вес 2, если он имеет особенность «B», он получает вес 3. например, предмет 1 получит вес 5, а предмет 2 - вес 2)
  4. Объедините различные вычисления в окончательный счет

I know как создать function_score для средней достоверности, это будет что-то вроде этого:

{
  "nested": {
    "path": "classification",
    "query": {
       "function_score": {
          "functions": [
              {
                  "field_value_factor": {
                      "field": "classification.confidence",
                      "missing": 0
                  },
                  "weight": 0
              }
          ],
          "query": {
              "terms": {
                  "classification.feature": [
                      "A",
                      "B"
                  ]
              }
          },
          "score_mode": "avg"
        }
    }
  }
}

Я также знаю, как создать оценку функции для поля приоритета, это было бы что-то вроде этого:

{
    "function_score": {
        "functions": [
            {
                "field_value_factor": {
                    "field": "popularity",
                    "missing": 0
                },
                "weight": <some-weight>
            }
        ],
        "score_mode": "sum"
    }
}

Я думаю (но не уверен), что знаю, как создать оценку функции для суммы весов объектов (игнорируя веса для объектов, которые не соответствуют "A" или "B").Вероятно, это будет что-то вроде этого:

{
  "query": {
        "function_score": {
            "query": {
                "bool": {
                    "should": [
                        { "match": { "classification.feature": "A" } },
                        { "match": { "classification.feature": "B" } }
                    ]
                }
            },
            "functions": [
              {
                  "filter": { "match": { "classification.feature": "A" } },
                  "weight": 2
              },
              {
                  "filter": { "match": { "classification.feature": "B" } },
                  "weight": 3
              },
            ],
            "score_mode":"sum"
        }
    }
}

Но я понятия не имею, как объединить эти 3 различные функциональные оценки (в настоящее время я не уверен, какой будет действительная функция объединения. Мне нужно будет игратьс различными функциями и решить, какая из них лучше всего подходит для меня, но ради вопроса мы можем сказать, что я хотел бы сделать усреднение по результатам моего 3 function_score)

И вот мои вопросы:

  1. Можно ли определить несколько function_score, а затем определить, как их объединить?
  2. Если невозможно объединить несколько function_score, какой подход я должен использовать для решения этой проблемы?(Я не зациклен на использовании 3 разных function_score, но не уверен, как это сделать иначе)
  3. Хотя я сказал, что хочу усреднить все результаты function_score, позже я могу захотеть сделать что-то более сложноекак это: score("popularity") + (score("feature-weight") * score("confidence")) - есть ли способ достичь этого?

В настоящее время я тестирую это на ES 2.4.5 (который, я знаю, устарел).В любом случае, мы собираемся обновить в ближайшее время, но:

  • Можно ли добиться этого только с более поздними версиями ES?
  • Даже если это возможно только в более поздних версиях ES, я все же хотел бызнать, как это сделать (и использовать его после обновления)

Поиск в Google не дал никакой полезной информации

Заранее спасибо

1 Ответ

1 голос
/ 03 июня 2019

Я думаю, вы должны использовать script_score . Это позволяет вычислить счет, используя значения документа полей. При использовании script_score вам не нужно писать несколько function_score.

Вы также можете передать параметры в свой счет функций, чтобы установить веса для своих функций во время запроса.

Хороший пример эластичного поиска 2 для расширенного использования script_score в документации: https://www.elastic.co/guide/en/elasticsearch/guide/current/script-score.html

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