让我先说一下,我没有以一种非常普遍的方式使用Lucene并解释我的问题是如何理解的。我正在使用Lucene在结构化记录中进行搜索。也就是说,索引的每个文档都是一组具有给定集合的短值的字段。分析并存储每个字段,分析通常不超过3个,在大多数情况下只有1个标准化令牌。作为一个例子,我们存储两个字段的想象文件:文件的路径和1-5的用户评级。该路径使用PathHierarchyTokenizer进行标记,并且评级仅按原样存储。所以,如果我们有一个像
这样的文件path: "/a/b/file.txt"
rating: 3
此文档的路径字段将包含标记“/ a”,“/ a / b”和“/a/b/file.ext”,以及对标记“3”进行评级。
我希望针对“path:/ a path:/ a / b path:/a/b/different.txt rating:1”这样的查询对此文档进行评分,并获得值2 - 这些术语的数量匹配。
我的理解和观察是文档的得分取决于各种术语指标,并且每个文档都有很多字段,我绝对不会得到简单的整数得分。
有没有办法以概述的方式制作Lucene得分文件?对索引运行的查询不是由用户生成的,而是由系统构建并附加了一个可选的过滤器,这意味着它们都有一个固定形式的多个TermQuerys连接在一个BooleanQuery中,没有任何模糊文本搜索。目前我没有选择用其他东西取代Lucene,但欢迎提出未来发展的建议。
答案 0 :(得分:1)
我怀疑有什么东西可以使用,所以很可能你需要实现自己的得分手并在搜索时使用它。对于复杂的情况,您可能需要play around with queries,但对于像您这样的简单情况,overwrite DefaultSimilarity
将tf
因子设置为原始频率(相关文档中指定术语的数量)和所有其他组件1.这样的事情:
public class MySimilarity extends DefaultSimilarity {
@Override
public float computeNorm(String field, FieldInvertState state) {
return 1;
}
@Override
public float queryNorm(float sumOfSquaredWeights) {
return 1;
}
@Override
public float tf(float freq) {
return freq;
}
@Override
public float idf(int docFreq, int numDocs) {
return 1;
}
@Override
public float coord(int overlap, int maxOverlap) {
return 1;
}
}
(注意,tf()
是返回不同于1)的唯一方法
IndexSearcher
上的set similarity。