使用以下文档集:
curl -XPUT "http://localhost:9200/test/books/1" -d '{
"title": "Bacon Dishes",
"tags": ["bacon", "cooking"]
}'
curl -XPUT "http://localhost:9200/test/books/2" -d '{
"title": "Beyond Bacon",
"tags" : ["cooking"]
}'
以下查询:
curl -XGET "http://localhost:9200/test/books/_search?pretty=true&search_type=dfs_query_then_fetch" -d ' {
"explain" : true,
"query" : {
"multi_match" : {
"query" : "bacon beyond",
"fields" : ["title^2","tags^1"]
}
}
}'
解释计划显示标题的得分是使用idf(docFreq=2, maxDocs=2)
计算的,而标记的得分(如果存在)是使用idf(docFreq=1, maxDocs=2)
计算的。
这就成了一个问题(至少对我们而言)当有100本书时,50个标题中有“培根”,标签中只有1个“培根”,但标题中没有“培根”。使用上面的查询,尽管标题被提升,但标签中带有“培根”的文档得分会更高。
我希望第一个示例中的标记和标题字段的分数计算为:
idf(docFreq=2, maxDocs=2)
也就是说,我希望分数计算在多匹配查询中的所有字段中使用术语的docFreq。这可能吗?
答案 0 :(得分:1)
我只会增加你对标题的提升,足以让它比标签字段更重要。
我认为你不想实现自己的自定义相似性并将其插入elasticsearch。
请记住,为字段添加适当的权重并使用提升进行微调,这需要使用真实的索引,真实数据和真实查询。