微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hibernate Search + Lucene:回退搜索停用词

如何解决Hibernate Search + Lucene:回退搜索停用词

我在 5.11.5 版中使用 Hibernate Search 和 Apache Lucene 5.5.5。在我的示例中,我使用 StopFilterFactoryStopAnalyzer.ENGLISH_STOP_WORDS_SET 中定义的认停用词集(例如“this”、“will”、“be”、...)。

现在我索引三个音乐歌曲名称:“我会活下去”、“我们会摇滚你”、“这会是”

我的搜索查询是“Rock will make me living”。所以我发现“I will survive”和“we will rock you”,而不是“this will be”,因为这首歌完全由停用词组成。如果我搜索“这将是”,那么我什么也找不到。

现在我需要对这些歌曲进行“后备”搜索:当且仅当歌曲标题完全由停用词组成,如果所有词都包含在我的搜索字符串中,我想找到它们。因此,搜索“I will be a fireman”不会找到“this will be”,但搜索“I will be like this”会找到“this will be”。

你知道我是如何做到这一点的吗?

解决方法

就我个人而言,在这种情况下,我会考虑简单地取消 StopFilterFactory

停用词的主要问题是它们在许多文档中出现的频率很高,因此考虑到它们没有太多意义,它们会以完全不成比例的方式影响相关性(分数)。

所以我们通常根本不索引它们,以解决这个问题。作为奖励,这可能会在一定程度上减少索引大小。

但还有另一种解决方案,即保留停用词并确定分数的计算方式。在 Lucene 中,负责计算分数的组件称为 Similarity。 Hibernate Search 5 / Lucene 5.5 中的默认值是 ClassicSimilarity,它存在停用词的问题。另一个更新的实现是 BM25,该实现在停止词方面有更好的表现:它不会让它们影响分数。如果您有兴趣,可以找到深入的解释 here。请注意,BM25 在较新版本的 Lucene 和 Hibernate Search 以及 Elasticsearch 中取代了 ClassicSimilarity 作为默认相似度。

我建议您 change the Similarity 使用 org.apache.lucene.search.similarities.BM25Similarity,删除停用词过滤器,然后重新索引您的数据,然后再次测试您的查询。您是否在顶部附近获得相关点击?索引大小是否仍可管理?您的查询“这将是”是否匹配?如果是这样,改用 BM25 是一个完全可行的解决方案。

请注意,您也可以考虑升级到默认使用 BM25 的 Hibernate Search 6

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。