4

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

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

4

2 回答 2

6

查看 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

编辑:正如下面评论中提到的,作为过滤器,您不能直接将 ASCIIFoldingFilter 用作分析器,但是在此处将其包含在分析器中的直接说明:stackoverflow.com/a/3834244/390153

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

于 2012-06-24T23:55:59.027 回答
0

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

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

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

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

于 2012-06-28T17:48:08.597 回答