【问题标题】:Hibernate Search + Lucene: Fallback-search for stop wordsHibernate Search + Lucene:后备搜索停用词
【发布时间】:2021-02-22 10:03:23
【问题描述】:

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

现在我索引了三个音乐歌曲标题:“我会活下来”、“我们会摇滚你”、“这将是”

我的搜索查询是“摇滚会让我活下来”。所以我发现“我会生存”和“我们会摇滚你”,而不是“这将是”,因为这首歌完全由停用词组成。如果我搜索“this will be”,那么我什么也找不到。

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

你知道我是怎么做到的吗?

【问题讨论】:

    标签: lucene hibernate-search


    【解决方案1】:

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

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

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

    但还有另一种解决方案,即保留停用词并修复分数的计算方式。在 Lucene 中,负责计算分数的组件称为Similarity。 Hibernate Search 5 / Lucene 5.5 中的默认值是ClassicSimilarity,它会遇到停用词的问题。另一个较新的实现是 BM25,该实现在停用词方面具有更好的行为:它不会让它们对分数产生太大影响。如果您有兴趣,可以找到深入的解释here。请注意,BM25 将 ClassicSimilarity 替换为最新版本的 Lucene 和 Hibernate Search 以及 Elasticsearch 中的默认相似度。

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

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

    【讨论】:

    • 感谢您的回答。我已经使用了这种相似性。但在我的特殊情况下,我有一个自定义停用词列表,有时索引词包含 95% 的停用词,如果我搜索单个非停用词,我仍然必须找到它们。是否可以注册不影响分数的自定义单词列表?
    • @Rokko_11 我没有关注;你是说搜索非停用词不会产生正确的命中吗?好像很奇怪,我一定是误会了。您能否举例说明索引停用词的不良影响?
    • 不,目前正在搜索非停用词,但如果我删除 StopFilter,分数会比以前低。我过滤了分数很低的搜索结果,所以我会丢失一些搜索结果......但是谢谢,我重新考虑你的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多