设置df阈值,超出该阈值,应忽略查询项

时间:2014-03-15 11:52:40

标签: search solr lucene tf-idf

我正在使用Solr从数据库中搜索和索引产品。产品有两个有趣的领域:名称和描述。产品名称通常是唯一的,但有时包含常用词,用作产品的预描述。一个例子是" UltraScrew--一种电动螺丝刀“。名称通常比描述短得多

问题在于,当人们搜索一个共同的术语时,名称中包含它的文档会获得不必要的提升,而不是仅在描述中包含它的那些文档。这是因为名称较短,即使之后添加了规范化,也很明显。

我想知道是否可以从名称中过滤术语,而不是使用停用词词典,而是根据术语的相对文档频率。这意味着,如果一个术语出现在超过10%的可用文档中,则在查询名称字段时应忽略该术语。描述字段应保持不变。

这通常是可能的吗?

2 个答案:

答案 0 :(得分:2)

也许你可以使用自己的相似性:

import org.apache.lucene.search.Similarity;
public class MySimilarity extends Similarity {

@Override
public float idf(int docFreq, int numDocs) {
    float freq = ((float)docFreq)/((float)numDocs);
    if (freq >=0.1) return 0;
    return (float) (Math.log(numDocs / (double) (docFreq + 1)) + 1.0);
}
...
}

并使用那个而不是默认值。 您可以在lucene级别设置indexSearcher的相似度,请参阅this other answer to a question

答案 1 :(得分:0)

我不确定我是否正确理解了这个问题,但您可以运行两个单独的查询。伪代码:

SearchResults nameSearchResults = search("name:X");
if (nameSearchResults.size() * 10 >= corpusSize) { // name-based search useless?
   return search("description:X");   // use description-based search
} else {
   return search("name:X description:X); // search both fields
}