【问题标题】:ignore diacritics when searching搜索时忽略变音符号
【发布时间】:2023-03-24 19:19:01
【问题描述】:

我正在使用 Compass/Lucene 搜索和索引我的数据库。我希望在搜索时忽略变音符号和字符大小写,这样查询“foo”将匹配“Fóo”和“foo”,而“fóó”查询将匹配“fóo”和“fOO”。

根据我阅读的内容,我似乎需要更改 Compass 在索引和搜索上下文时使用的默认分析器。我找到了指定要使用的分析器的位置,但似乎找不到满足我要求的分析器实现。是否已经存在忽略变音符号和字符大小写的分析器,还是我需要自己编写?

【问题讨论】:

    标签: java search grails lucene compass-lucene


    【解决方案1】:

    看看 org.apache.lucene.analysis.ASCIIFoldingFilter 看看它是否符合您的要求。如果没有,我会以它的源代码为起点来编写自己的代码。

    您是对的,您必须使用相同的分析器配置进行索引和查询,原因很明显,如果您已从索引中删除所有变音符号,则需要从任何查询中删除它们也。

    需要注意的一件事是确保在索引/查询过程中的某处对任何 unicode 进行规范化。具体见:http://unicode.org/reports/tr15/http://unicode.org/faq/normalization.htmlhttp://docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html

    编辑:正如下面的 cmets 中所述,作为过滤器,您不能直接将 ASCIIFoldingFilter 用作分析器,但是这里有关于将其包含在分析器中的直接说明:stackoverflow.com/a/3834244/390153

    编辑:正如@jspboix 在下面的评论中提到的,您还需要链接 LowerCaseFilter 来处理字符大小写。

    【讨论】:

    • 我不认为 org.apache.lucene.analysis.ASCIIFoldingFilter 会直接解决我的问题,因为它不是分析器,但可能是一个有用的起点
    • 不,不是直接的,因为它是一个过滤器。但是,您会在此处找到如何将其合并到分析器中的简短示例:stackoverflow.com/a/3834244/390153
    • 你还需要 LoweCaseFilter 来匹配 "fOO" 和 "foo"。
    • @jspboix 谢谢,当我专注于变音符号时,我忘记了这部分问题。
    【解决方案2】:

    在我的 Grails 应用程序中,我使用了可搜索插件,并且刚刚将系统配置为使用“德语”分析器:

    compassSettings = ['compass.engine.analyzer.default.type': 'German']
    

    这至少会忽略大小写和变音符号 - “ä”在索引中存储为“a”。

    我刚刚在我的一个测试文档中添加了“Fóo”和“Föo”并搜索了“foo”——它找到了“Föo”但没有找到“Fóo”。所以我猜如果你将语言切换到正确的值(法语?)它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 2011-12-12
      相关资源
      最近更新 更多