我试图为一堆名字创建一个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);发布于 2014-07-31 14:10:36
可能有一种标准的方法可以这样做,但我所能想到的只是在一个特殊的(不同的)字段中存储一个“消毒”版本,如下所示:
String normalized = Normalizer.normalize(string, Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");或者直接用regex删除特殊字符:
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
https://stackoverflow.com/questions/25060835
复制相似问题