我观察到Solr/Lucene赋予了太多的权重来匹配特定查询词的tf上的所有查询词。例如:
假设我们的查询是: text:( "red“"jacket”“red jacket")
文档A ->包含40次"jacket“
文档B ->包含"red jacket“1次(并且因为这个"red”1次和"jacket“1次)
文档B的得分要高得多,因为它只包含查询的所有三个术语,但只有一次,而文档A的得分非常低,即使它包含一个术语很多次。
我能以这样的方式创建一个查询吗?如果Lucene找到"red jacket“的匹配项,它不会将其分别视为"red”和"jacket“的匹配项?
发布于 2014-02-28 22:52:01
我建议使用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,可以使用dismax和edismax查询解析器以及其他许多方便的特性。类似于:
select/?q=red+jacket+"red jacket"&defType=dismax发布于 2016-01-05 22:35:48
Tf-idf是搜索引擎通常做的事情,但不是你一直想要的。如果你想忽略重复的关键词,这不是你想要的。
Tf-idf计算为to因子的乘积: tf x idf。tf (词频)是一个词在文本中出现的频率。idf (逆向文档频率)意味着一个单词在搜索引擎中的所有文档中的唯一性程度。
考虑一个包含100个单词的文本,其中单词cat出现了3次。则cat的项频率(即tf)为(3 / 100) = 0.03。现在,假设我们有1000万个文档,并且单词cat出现在其中的1000个文档中。然后,反向文档频率(即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(查询(位置:A)),5,if(exists(查询(位置:B)),3,0)
参见第二个示例的original source和上下文。
https://stackoverflow.com/questions/22095542
复制相似问题