首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略lucene的特殊角色?

忽略lucene的特殊角色?
EN

Stack Overflow用户
提问于 2014-07-31 13:59:19
回答 1查看 1.7K关注 0票数 2

我试图为一堆名字创建一个lucene搜索索引。我希望能够搜索那些忽略了案件的名字,比如,特殊字符,白空间等等。

理想情况下,查询RobertRober Roberts应该与R'obert Röbertson匹配。

我必须在apache lucene中应用哪些分析器或过滤器来实现这一点?

到目前为止,我使用的是new StandardAnalyzer(Version.LUCENE_4_9),但这与精确的匹配是相关联的。

此外:我怎样才能连锁分析器?因为IndexWriter只需要一个分析器:

代码语言:javascript
复制
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_9);
new IndexWriterConfig(Version.LUCENE_4_9, analyzer);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-31 14:10:36

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

代码语言:javascript
复制
String normalized = Normalizer.normalize(string, Form.NFD)
        .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

或者直接用regex删除特殊字符:

代码语言:javascript
复制
String normalized = string.replaceAll("[^A-Za-z]+", "");

然后将规范化字段添加到索引中:

代码语言:javascript
复制
    final Document document = new Document();
    document.add(new Field("fieldName", normalized, Store.YES, Index.ANALYZED));

这样做,您的正常内容仍然是相同的,但是lucene也可以搜索规范化字段。

更新

好的,为了实现规范化,您需要多个步骤,首先删除指示字符,然后删除特殊字符:

代码语言:javascript
复制
String normalized = Normalizer.normalize(string, Form.NFD)
        .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
        .replaceAll("[^A-Za-z ]+", ""); // <-- note the space

因此,对于输入R'obert Röbertson,上面的返回Robert Robertson

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25060835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档