我正在尝试为一堆名称创建一个 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);
最佳答案
可能有一种标准的方法可以做到这一点,但我能想到的就是在一个特殊的(不同的)字段中存储一个“净化”版本,如下所示:
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/