Lucene 4.6在搜索过程中包含特殊字符作为单词的一部分

时间:2018-03-20 20:34:15

标签: java lucene

我继承了一个使用Lucene 4.6.0搜索xml文档的项目。

基本上我的问题似乎是:

搜索包含"otherwise authorized as such"的文本字段的文档会在搜索任何单词时返回突出显示的文档,但如果 文本字段包含"[otherwise authorized as such]"之类的内容,然后只搜索“已授权”返回结果。

我猜lucene因为方括号而没有看到"[otherwise""such]"作为单词? 不是一个lucene专家,即使有文档,我仍然坚持这一点。有没有办法自定义分析器以包含“[”作为单词搜索的一部分?

由于

1 个答案:

答案 0 :(得分:0)

您不需要手动删除错误的字符,您应该编写自定义Analyzer,它将使用PatternReplaceCharFilter,这可能会删除不需要的符号。

这个分析器的例子是这样的:

class CustomAnalyzer extends Analyzer {

        @Override
        protected Reader initReader(String fieldName, Reader reader) {
            CharFilter cf = new PatternReplaceCharFilter(Pattern.compile("\\["), "", reader);
            cf = new PatternReplaceCharFilter(Pattern.compile("\\]"), "", cf);
            cf = new PatternReplaceCharFilter(Pattern.compile("\\)"), "", cf);
            cf = new PatternReplaceCharFilter(Pattern.compile("\\("), "", cf);
            return cf;
        }

        @Override
        protected TokenStreamComponents createComponents(String fieldName) {
            final StandardTokenizer analyzer = new StandardTokenizer();
            TokenStream tok = new StandardFilter(analyzer);
            tok = new LowerCaseFilter(tok);
            return new TokenStreamComponents(analyzer, tok);
        }
    }

我在这里选择仅替换''符号。

在此索引时间过滤后,您将能够正常搜索。

代码的完整示例位于here