我正在使用Compass / Lucene来搜索和索引我的数据库。我想在搜索时忽略变音符号和字符大小写,这样查询“foo”将匹配“Fóo”和“foo”,查询“fóó”将匹配“fóo”和“fOO”。
基于我所读到的内容,似乎我需要更改Compass在索引和搜索我的上下文时使用的默认分析器。我已经找到了指定要使用的分析器的位置,但我似乎无法找到满足我要求的分析器实现。是否已经存在一个忽略变音符号和字符大小写的分析器,或者我是否需要编写自己的分析器?
答案 0 :(得分:6)
看看org.apache.lucene.analysis.ASCIIFoldingFilter,看看它是否符合您的要求。如果没有,我会用它的来源作为自己编写的起点。
你是必须使用相同的Analyzer配置进行索引和查询是正确的,原因很明显,如果你从索引中删除了所有的变音符号,你需要从任何查询中删除它们还
要注意的一件事是确保在索引/查询过程中将任何unicode规范化。有关具体信息,请参阅:http://unicode.org/reports/tr15/,http://unicode.org/faq/normalization.html和http://docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html。
编辑:如下面的评论所述,作为过滤器,您不能直接使用ASCIIFoldingFilter作为分析器,但是有关于将它包含在分析器中的直接说明:stackoverflow.com/a/3834244/390153 编辑:正如@jspboix在下面的评论中所提到的,你还需要链接LowerCaseFilter来处理字符大小写。答案 1 :(得分:0)
在我的Grails应用程序中,我使用可搜索的插件并将系统配置为使用“德语”分析器:
compassSettings = ['compass.engine.analyzer.default.type': 'German']
至少忽略了这种情况和变音符号 - “ä”在索引中存储为“a”。
我刚刚将“Fóo”和“Föo”添加到我的一个测试文档中并搜索“foo” - 它找到“Föo”而不是“Fóo”。所以我想如果你把语言切换到正确的值(法语?)它应该可以工作。