java - 忽略带有lucene的特殊字符?

标签 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);

最佳答案

可能有一种标准的方法可以做到这一点,但我能想到的就是在一个特殊的(不同的)字段中存储一个“净化”版本,如下所示:

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

关于java - 忽略带有lucene的特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25060835/

相关文章:

java - SpringBoot Junit 测试 Autowiring 问题

solr - 如何在Titan图形服务器上利用ElasticSearch/Solr搜索API?

linq - Solr 查询难题

search - 如何在 Lucene 中执行通配符搜索

java - 当结果是一条记录时,Hibernate Search/Lucene 返回 null 元素

java - 如何在java中使用lucene添加自定义停用词

java - IntelliJ - 如何从 "Run" View 中的失败单元测试跳转到源代码而不是编译类

java - JSF 的奇怪问题 - Web bean 在第二次提交单击之前不会被调用

java - 瓦丁表 "Error during cache update"

java - Play 应用程序 |如何将 FilePart 传递给其他请求