Elasticsearch function_score查询

时间:2015-11-01 16:21:48

标签: elasticsearch tf-idf scoring

我正在使用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查询中执行此操作吗?我无法理解如何实现这一目标。感谢。

1 个答案:

答案 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中)实际过滤文件)。

希望这有帮助。