У меня есть несколько разных 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
Я хотел бы сделать следующее:
- Рассчитать среднюю достоверность для каждого элемента только для функций "A"и «B» (например, средняя достоверность 0,5 для элемента 1)
- Рассчитать приоритет для каждого элемента (например, популярность 0,8 для элемента 2)
- Рассчитать сумму весов для каждого элемента элемента (еслипредмет имеет особенность «A», он получает вес 2, если он имеет особенность «B», он получает вес 3. например, предмет 1 получит вес 5, а предмет 2 - вес 2)
- Объедините различные вычисления в окончательный счет
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)
И вот мои вопросы:
- Можно ли определить несколько function_score, а затем определить, как их объединить?
- Если невозможно объединить несколько function_score, какой подход я должен использовать для решения этой проблемы?(Я не зациклен на использовании 3 разных function_score, но не уверен, как это сделать иначе)
- Хотя я сказал, что хочу усреднить все результаты function_score, позже я могу захотеть сделать что-то более сложноекак это:
score("popularity") + (score("feature-weight") * score("confidence"))
- есть ли способ достичь этого?
В настоящее время я тестирую это на ES 2.4.5 (который, я знаю, устарел).В любом случае, мы собираемся обновить в ближайшее время, но:
- Можно ли добиться этого только с более поздними версиями ES?
- Даже если это возможно только в более поздних версиях ES, я все же хотел бызнать, как это сделать (и использовать его после обновления)
Поиск в Google не дал никакой полезной информации
Заранее спасибо