我正在尝试为一堆名称创建一个lucene搜索索引。我希望能够搜索忽略案例,变音符号,特殊字符,空格等的名称。
理想情况下,查询Robert
或Rober Roberts
应与R'obert Röbertson
匹配。
我必须在apache lucene
中应用哪些分析器或过滤器来实现此目的?
到目前为止,我正在使用new StandardAnalyzer(Version.LUCENE_4_9)
,但这与精确匹配有关。
此外:我如何连锁分析仪?因为IndexWriter只需要一个分析器:
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_9);
new IndexWriterConfig(Version.LUCENE_4_9, analyzer);
答案 0 :(得分:1)
可能有一种标准的方法可以做到这一点,但我能想到的只是在一个特殊的(不同的)字段中存储一个“已消毒”的版本,如下所示:
String normalized = Normalizer.normalize(string, Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
或直接删除正则表达式的特殊字符:
String normalized = string.replaceAll("[^A-Za-z]+", "");
然后将规范化字段添加到索引:
final Document document = new Document();
document.add(new Field("fieldName", normalized, Store.YES, Index.ANALYZED));
这样做,你的正常内容仍然是相同的,但lucene也可以搜索规范化的字段
<强>更新强>
好的,因此对于规范化,您将需要多个步骤,首先删除变音,然后删除特殊字符:
String normalized = Normalizer.normalize(string, Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
.replaceAll("[^A-Za-z ]+", ""); // <-- note the space
因此,对于输入R'obert Röbertson
,上述内容会返回Robert Robertson