【问题标题】:common idf scoring across all multimatch query fields with elasticsearch使用 elasticsearch 对所有多匹配查询字段进行通用 idf 评分
【发布时间】:2013-10-15 04:27:49
【问题描述】:

使用以下文档集

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

【问题讨论】:

  • 我只会增加你对标题的提升,足以让它比标签更重要。我认为您不想实现自己的自定义相似性并将其插入 elasticsearch :)
  • 你说得对,我绝对不想做这种事!您是否碰巧知道此处的任何选项/设置是否启用了我正在寻找的行为? elasticsearch.org/guide/en/elasticsearch/reference/current/…
  • 不,你只需要让标题权重更高,就是这样。足够高,使它变得重要,因为您希望将其与标签进行比较。当然,这是微调,需要使用真实的索引、真实的数据、真实的查询……
  • 谢谢。请将您的评论转换为答案。如果没有其他答案,我会接受。

标签: search lucene elasticsearch


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2016-01-17
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多