【发布时间】:2019-06-02 12:10:41
【问题描述】:
我有几个不同的 Elasticsearch function_score,但我不知道如何组合它们
这是我正在查看的测试集(我添加了 cmets 以便能够引用问题中的特定项目,这些 cmets 实际上不在索引中)
[
{ // 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”计算每个项目的平均置信度(例如,项目 1 的平均置信度为 0.5)
- 计算每个项目的优先级(例如 0.8 项目 2 的流行度)
- 计算每个项目特征的权重总和(如果项目具有特征“A”,则其权重为 2,如果 它具有特征“B”,它的权重为 3。例如第 1 项的权重为 5,第 2 项的权重为 2)
- 将不同的计算组合成最终分数
我知道如何为平均置信度创建 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 版本中实现,我仍然想知道如何实现它(并在我们升级后使用它)
谷歌搜索没有得到任何有用的信息
提前致谢
【问题讨论】:
标签: elasticsearch