弹性搜索渗透反应评分

时间:2014-06-20 21:12:21

标签: elasticsearch elasticsearch-percolate

现状

我正在使用elasticsearch的percolate功能。它运作良好 - 我得到匹配的percolate-ids返回一个新文档,并可以构建基本上反向搜索。到目前为止一切都很棒。

问题

问题出现了:我希望得到一个分数,表示给定文档与过滤器查询的匹配程度(正常查询给出的分数)。为此,我添加了track_scores,但没有运气。

我在track_scores的文档中找到了这个:

  

...分数基于查询,表示查询如何与percolate查询的元数据匹配,而不是如何将渗透的文档与查询匹配...

我想要/甚至需要什么?

显示问题的示例

这是一个展示问题的示例(摘自elasticsearch.org)。无论输入文档是什么,此处在percolate-response中返回的分数始终为1.0

//Index the percolator
curl -XPUT 'localhost:9200/my-index/.percolator/1' -d '{
    "query" : {
        "match" : {
            "message" : "bonsai tree"
        }
    }
}'

渗透第一份文件:

curl -XGET 'localhost:9200/my-index/message/_percolate' -d '{
    "doc" : {
        "message" : "A new bonsai tree in the office"
    },
    "track_scores" : "true"
}'


//...returns
{"took": 1, "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
}, "total": 1, "matches": [
    {
        "_index": "my-index",
        "_id": "1",
        "_score": 1.0 <-- Score
    }
]}

渗透第二个(不同的):

//Percolate a second one
curl -XGET 'localhost:9200/my-index/message/_percolate' -d '{
    "doc" : {
        "message" : "A new bonsai tree in the office next to another bonsai tree is cool!"
    },
     "track_scores" : "true"
}'


//...returns
{"took": 3, "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
}, "total": 1, "matches": [
    {
        "_index": "my-index",
        "_id": "1",
        "_score": 1.0 <-- SAME Score, but different document (other score needed here!)
    }
]}

我需要什么

我希望第一个文档的评分为0.8,第二个文档的评分为0.9。但他们不能像在这里那样得分。我怎样才能实现我的目标?

非常感谢任何想法和帮助。

2 个答案:

答案 0 :(得分:3)

分数与数据集中的其他文档相关。您可能会进行某种自定义评分,您只关注手头文档的术语频率/反向文档频率,但可能不会非常有效,但可能已经足够好了。

我不确定这是否是针对您的问题的可行解决方案,但是一种方法将重新运行针对整个数据集的所有匹配的percolate查询,并从中获取文档分数并使用该方法重新索引文档数据。由于它都是相对的,因此可能需要您更新与查询匹配的所有其他文档。可能,最好在某个设定的时间间隔内进行全局重新评分。

答案 1 :(得分:-1)

您的文档未定义限制搜索空间的查询。 _score是根据此查询计算的,而不是您要渗透的查询。