我正在使用Elasticsearch v 1.7.3
以下是文档中的字段:
Field1, Field2, Field3, Field4
我需要给每个领域赋予权重,如Field1:40,Field2:40,Field3:10,Field4:10
在索引编制期间,Field1和Field2将扩展为其语音标记。所以我们有Field1 ==> Field1,Field1.1,Field1.2和Field2 => Field2,Field2.1,Field2.2
我的查询可以基于以上4个字段中的任何一个的组合。
现在进行评分,我不想使用TF / IDF或BM25评分模型。
相反,我只是想计算每个字段的加权平均值并将它们加在一起。
For example for input query:
Field1: ABC
Field2: PQR
Field3: XYZ
Field4: RST
假设语料库中有以下文件:
Document 1
-----------
Field1: ABC
Field2: PQR
Field3: XYZ
Field4: RST
Document 2
-----------
Field1: ABX
Field2: PQR
Field3: XYZ
Field4: RST
文档1的分数:100 ==> WeightedAverage(Field1)+ WeightedAverage(Field2)+ WeightedAverage(Field3)+ WeightedAverage(Field4) ===> 40 + 40 + 10 + 10
文件2的分数:90 ==> WeightedAverage(Field1)+ WeightedAverage(Field2)+ WeightedAverage(Field3)+ WeightedAverage(Field4) ===> 30 + 40 + 10 + 10(不完全是,但我希望你能得到这个想法)。
我可以在function_score查询中执行此操作吗?我无法理解如何实现这一目标。感谢。
答案 0 :(得分:1)
你需要看看函数得分查询。内部函数得分,定义一个布尔查询,在每个字段和assgin boost(40或10)上都有过滤器,并选择boost_mode作为总和。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html
{
"functions": [
{
"filter": {
"query": {
"bool": {
"should": [
{
"match": {
"inputloc1": "ABC"
}
}
]
}
}
},
"boost_factor": 11
},
{
"filter": {
"query": {
"bool": {
"should": [
{
"query_string": {
"fields": [
"input"
],
"query": "xyz",
"fuzziness": 0,
"fuzzy_prefix_length": 0
}
}
]
}
}
},
"boost_factor": 6
}
],
"boost_mode": "sum"
}
我从我的代码中给出了函数的示例,但是您可以切换所有查询以匹配(而不是查询字符串)。您在函数内定义的只计算得分。您在查询中定义的内容(在function_score中)实际过滤文件)。
希望这有帮助。