首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调整Lucene评分

调整Lucene评分
EN

Stack Overflow用户
提问于 2018-12-02 19:25:51
回答 1查看 85关注 0票数 0

我看过其他Lucene的得分问题,但似乎没有一个能解决我的问题。

我正在索引一些大的单词文件。这些文件中的行被分开,文件中的每10行都被分成一个Lucene Document (实际上它们是重叠的10行Documents,但这与此无关)。

例如,当我搜索“泡沫盛开”时.令我稍感意外的是,如果其中一个词在给定的Document中出现两次,那么在同一个Document中找到两个搜索词(即“泡”和“花”)几乎可以算作“和找到两个搜索词一样好”。

此外,包含三个单词“冒泡”实例的Document ( 10行)将在包含1x“冒泡”和1x "bloom“的Document之前列出。带有2x“气泡”的一个似乎等于两个单词的Document

注:像这样的一个String,“泡泡盛开”似乎会由一个QueryParser.parse()变成一个带有两个子句的BooleanQuery

有什么方法可以使Document中找到两个单词(搜索词)的事实比找到其中一个单词的2或3个实例更高,但另一个单词为零吗?

顺便说一句,我刚做了一个搜索字符串是“+泡+花”.显然,这不包括任何缺少一个单词的Document。但我认为这是一种解决办法。我希望默认的功能,没有"+“(对于”要求“),以得分的事实,所有的术语是更高的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-18 11:55:25

很清楚的是,TF-IDF或BM25评分很大程度上取决于索引中术语的分布,因为例如,我能够让包含“冒泡花”的文档比任何文档都高,但是这最有可能是我的测试分布。

以一种标准的方式实现这一目标有不同的方法。最简单的方法之一是使用ConstantScoreQuery,它总是给出一个或多个匹配项的分数为1.0 (或任何其他任意数字)。与正在进行求和的BooleanQuery一起,您可以很容易地根据文档中的术语数对文档进行评分。

例如。

代码语言:javascript
复制
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的匹配是相等的。这可能也有一些警告。

指向完整代码的链接是那里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53583782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档