我看过其他Lucene的得分问题,但似乎没有一个能解决我的问题。
我正在索引一些大的单词文件。这些文件中的行被分开,文件中的每10行都被分成一个Lucene Document (实际上它们是重叠的10行Documents,但这与此无关)。
例如,当我搜索“泡沫盛开”时.令我稍感意外的是,如果其中一个词在给定的Document中出现两次,那么在同一个Document中找到两个搜索词(即“泡”和“花”)几乎可以算作“和找到两个搜索词一样好”。
此外,包含三个单词“冒泡”实例的Document ( 10行)将在包含1x“冒泡”和1x "bloom“的Document之前列出。带有2x“气泡”的一个似乎等于两个单词的Document。
注:像这样的一个String,“泡泡盛开”似乎会由一个QueryParser.parse()变成一个带有两个子句的BooleanQuery。
有什么方法可以使Document中找到两个单词(搜索词)的事实比找到其中一个单词的2或3个实例更高,但另一个单词为零吗?
顺便说一句,我刚做了一个搜索字符串是“+泡+花”.显然,这不包括任何缺少一个单词的Document。但我认为这是一种解决办法。我希望默认的功能,没有"+“(对于”要求“),以得分的事实,所有的术语是更高的。
发布于 2018-12-18 11:55:25
很清楚的是,TF-IDF或BM25评分很大程度上取决于索引中术语的分布,因为例如,我能够让包含“冒泡花”的文档比任何文档都高,但是这最有可能是我的测试分布。
以一种标准的方式实现这一目标有不同的方法。最简单的方法之一是使用ConstantScoreQuery,它总是给出一个或多个匹配项的分数为1.0 (或任何其他任意数字)。与正在进行求和的BooleanQuery一起,您可以很容易地根据文档中的术语数对文档进行评分。
例如。
Query query = new BooleanQuery.Builder()
.add(new ConstantScoreQuery(new TermQuery(new Term("text", "bloom"))), BooleanClause.Occur.SHOULD)
.add(new ConstantScoreQuery(new TermQuery(new Term("text", "bubble"))), BooleanClause.Occur.SHOULD)
.build();这是either查询,所以您与其中任何一个都有匹配。这一个明显的问题是,泡或bloom的匹配是相等的。这可能也有一些警告。
指向完整代码的链接是那里。
https://stackoverflow.com/questions/53583782
复制相似问题