我有一个存储在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 - 只是一个浮点数,对其范围一无所知。
答案 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)