我正在使用Solr从数据库中搜索和索引产品。产品有两个有趣的领域:名称和描述。产品名称通常是唯一的,但有时包含常用词,用作产品的预描述。一个例子是" UltraScrew--一种电动螺丝刀“。名称通常比描述短得多
问题在于,当人们搜索一个共同的术语时,名称中包含它的文档会获得不必要的提升,而不是仅在描述中包含它的那些文档。这是因为名称较短,即使之后添加了规范化,也很明显。
我想知道是否可以从名称中过滤术语,而不是使用停用词词典,而是根据术语的相对文档频率。这意味着,如果一个术语出现在超过10%的可用文档中,则在查询名称字段时应忽略该术语。描述字段应保持不变。
这通常是可能的吗?
答案 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
}