用lucene忽略特殊字符?

时间:2014-07-31 13:59:20

标签: java lucene

我正在尝试为一堆名称创建一个lucene搜索索引。我希望能够搜索忽略案例,变音符号,特殊字符,空格等的名称。

理想情况下,查询RobertRober 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);

1 个答案:

答案 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