如何在elasticsearch中获得查询的最大可能分数?

时间:2016-06-22 15:59:17

标签: elasticsearch

我有一个存储在elasticsearch索引中的大型文档集,我需要找到类似的文档集来排除重复项。

不幸的是,这些文档可能有不同的值,所以我不能完全依赖过滤器。相反,我试图评估使用多个字段和不同提升值的两个文档之间的差异。

如果差异太大,则文档不会计为重复。 问题是 - 我不知道如何评估差异,因为搜索响应中的_score没有说明差异有多大。

为每个特定查询获得最大可能得分是完美的。我怎样才能做到这一点?

修改: 例如,如果我执行这样的查询,则返回带有_score的JSON,大于1.00

请求: GET / documents / sometype / _search

{
    "query": {
        "bool": {
            "should": [
                {"match": {
                    "title": {
                        "query": "some title"
                    }
               }}
            ]
        } 
    }
}

回复示例:

  

{“take”:1,“timed_out”:false,“_ shards”:...,“hits”:{         “总数”:100,         “max_score”:1.7588379,       }}

正如文档所说,_score - 只是一个浮点数,对其范围一无所知。

2 个答案:

答案 0 :(得分:2)

这是一个有趣的问题。由于Practical Scoring Function(PSF)一般使用逆文档频率(IDF)问题"给出查询的最大文档分数是多少?#34;是不是很好。评分结果取决于所有文档,即索引,甚至是ES配置中的分片数。

我的猜测是,通过修改索引,可以显示如果使用IDF,查询的最大分数是无限的。

但在特殊情况下,如果您通过使用例如停用PSF来停用PSF的IDF部分constant_score,最大分数应该是有限的,因为它只取决于文档本身,而不是索引。

话虽这么说,我还希望看到_max_score端点返回inf以防IDF在查询中的某处使用,如果没有则使用实际最大文档分数。

答案 1 :(得分:0)

这是一个python代码段,可通过添加一个不存在的词(然后将其删除)来获得当前的最高分。

这假设25个随机的小写字母字符在您的索引中有〜0的出现机会(否则更改unique字符串的生成方式)。

import elasticsearch
import string
import random 

es = elasticsearch.Elasticsearch()

unique = ''.join(random.choice(string.ascii_lowercase) for i in range(25))

index = "your_index"
doc_type = "your_doctype"
key = "your_key"

es.index(index=index, doc_type=doc_type, body={key: unique}, id=unique, params={"refresh": "true"})

body = {
        "doc": {index: unique},
        "term_statistics": True,
        "field_statistics": True,
        "positions": False,
        "offsets": False,
        "filter": {
            "min_term_freq": 0,
            "min_doc_freq": 0
        }
    }

result = es.termvectors(index=index, doc_type=doc_type, body=body)
    
max_es_term_score[index] = result["term_vectors"][index]["terms"][unique]

es.delete(index=index, doc_type=doc_type, id=unique)