1

使用以下文档集

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 本书的标签中有“培根”但标题中没有“培根”时,这就会成为一个问题(至少对我们而言)。使用上面的查询,标签中带有“bacon”的文档将获得更高的分数,尽管标题被提升了。

我希望第一个示例中标签和标题字段的分数计算为:

 idf(docFreq=2, maxDocs=2)

也就是说,我希望分数计算在多匹配查询中的所有字段中使用术语的 docFreq。这可能吗?

4

1 回答 1

1

我只会增加您对标题的提升,足以使其比标签字段更重要。

我认为您不想实现自己的自定义相似性并将其插入弹性搜索。

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

于 2013-10-16T22:26:46.487 回答