我观察到Solr / Lucene在特定查询字词的tf上匹配所有查询字词的权重太大。
例如
说我们的查询是:text :(“red”“jacket”“red jacket”)
文件A - >包含“夹克”40次
文件B - >包含“红色夹克”1次(因为这个“红色”1次和“夹克”1次)
文档B的得分要高得多,因为它包含查询的所有三个术语,但只有一次,而文档A得分非常低,即使它包含一个术语很多次。
我是否可以通过以下方式创建查询:如果Lucene找到“红夹克”匹配,则不会将其视为“红色”和“夹克”的匹配?
答案 0 :(得分: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,dismax和edismax查询解析器是实现此目的的方法,以及许多其他便利功能。类似的东西:
select/?q=red+jacket+"red jacket"&defType=dismax
答案 1 :(得分:1)
Tf-idf是搜索引擎通常会做的,但不是你一直想要的。如果你想忽略重复的关键词,那就不是你想要的。
Tf-idf计算为因子的乘积:tf x idf。 tf(术语频率)是一个单词在文本中的频率。 idf(逆文档频率)表示单词在搜索引擎中的所有文档中的唯一性。
考虑包含100个单词的文本,其中单词cat出现3次。然后,对于cat,术语频率(即,tf)是(3/100)= 0.03。现在,假设我们有1000万个文档,其中有一千个单词出现在其中。然后,逆文档频率(即,idf)被计算为log(10,000,000 / 1,000)= 4.因此,Tf-idf权重是这些量的乘积:0.03 * 4 = 0.12。请参阅示例的original source。
忽略tf-idf的最佳方法可能是Solr存在函数,可通过bf相关性boost参数访问。例如:
BF =如果(存在(查询(位置:A)),图5,如果(存在(查询(位置:B)),3,0))
请参阅original source和第二个示例的上下文。