使用elasticsearch在所有多匹配查询字段中进行常见的idf评分

时间:2013-10-15 04:27:50

标签: search lucene elasticsearch

使用以下文档集

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。这可能吗?

1 个答案:

答案 0 :(得分:1)

我只会增加你对标题的提升,足以让它比标签字段更重要。

我认为你不想实现自己的自定义相似性并将其插入elasticsearch。

请记住,为字段添加适当的权重并使用提升进行微调,这需要使用真实的索引,真实数据和真实查询。