【问题标题】:Lucene 4.6 include special characters as part of word during searchLucene 4.6 在搜索期间包含特殊字符作为单词的一部分
【发布时间】:2023-03-25 05:22:01
【问题描述】:

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

基本上我的问题似乎是这样的:

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

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

谢谢

【问题讨论】:

  • 那么,您希望能够搜索诸如[otherwise 之类的术语吗?
  • 不,我想搜索“otherwise”并让 lucene 返回结果“[otherwise”和“otherwise”。目前,我在将文档写入索引之前从文档中去除方括号,但这不是一个理想的解决方案。

标签: java lucene


【解决方案1】:

您不需要手动去除字符,您应该编写自定义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

【讨论】:

  • 谢谢,看起来很有希望!我会试试这个并在几天内更新帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多