【问题标题】:Solr TF vs All Terms matchSolr TF 与所有条款匹配
【发布时间】:2014-02-28 12:40:53
【问题描述】:

我观察到 Solr/Lucene 过于重视匹配特定查询词的 tf 上的所有查询词。 例如
假设我们的查询是:文本:(“红色”“夹克”“红色夹克”)
文档 A -> 包含 40 次“夹克”
文档 B -> 包含 1 次“红色夹克”(因为这个“红色”1 次和“夹克”1 次)

文档 B 获得了更高的分数,因为它包含查询的所有三个术语,但只有一次,而文档 A 的分数非常低,即使它包含一个术语的次数很多。

我能否以这样一种方式创建查询,即如果 Lucene 找到“红色夹克”的匹配项,它不会分别将其视为“红色”和“夹克”的匹配项?

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    我建议使用DisjunctionMaxQuery。在原始 Lucene 中,这看起来像:

    Query dismax = new DisjunctionMaxQuery(0);
    dismax.add(parser.parse("red"));
    dismax.add(parser.parse("junction"));
    dismax.add(parser.parse("red jacket"));
    

    dismax 查询将使用其子查询中的最大分数进行评分,而不是其子查询分数的乘积。

    使用 Solr,dismaxedismax 查询解析器是解决这个问题的方法,以及许多其他方便的功能。比如:

    select/?q=red+jacket+"red jacket"&defType=dismax
    

    【讨论】:

    • 但是,如果我确实想在分数中添加另一个术语。例如q = red+jacket+"red jack"+car ... 现在在这个查询中,我希望得分为 = maxof(red,jacket,"red jack") + maxof(car).. 这是可能的吗?
    • 所以基本上,它归结为相同的基本问题,有没有一种方法可以让 solr 只考虑文档中的一个术语,即说是否有匹配的“红色夹克”一个文档,solr 匹配它,然后将其删除以供进一步考虑,使其不匹配其他查询词,如“red”或“jacket”?
    • 听起来像是语义上的精细语义区别,当 dismax 查询服务于相同的功能目的时。但是,如果您关心实现细节,那么我有理由说不,没有什么可以做到这一点。 Dismax 是实现此目的的标准方法。如果您需要了解嵌套查询,可以查看:Understanding Solr nested queries
    【解决方案2】:

    Tf-idf 是搜索引擎通常所做的,但不是您一直想要的。如果你想忽略重复的关键词,那不是你想要的。

    Tf-idf 被计算为以下因素的乘积:tf x idf。 tf(词频)是一个词在文本中出现的频率。 idf(逆文档频率)表示一个词在您在搜索引擎中拥有的所有文档中的唯一性。

    考虑一个包含 100 个单词的文本,其中单词 cat 出现 3 次。 cat 的词频(即 tf)为 (3 / 100) = 0.03。现在,假设我们有 1000 万份文档,其中有一千份文件中出现了 cat 这个词。然后,逆文档频率(即 idf)计算为 log(10,000,000 / 1,000) = 4。因此,Tf-idf 权重是这些数量的乘积:0.03 * 4 = 0.12。请参阅original source 的示例。

    忽略 tf-idf 的最好方法可能是 Solr exists 函数,它可以通过 bf 相关性提升参数访问。例如:

    bf=if(exists(query(location:A)),5,if(exists(query(location:B)),3,0))

    参见original source 和第二个示例的上下文。

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 2019-11-14
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      相关资源
      最近更新 更多