当前位置: 首页 > 知识库问答 >
问题:

Lucene 4.6在搜索期间将特殊字符作为单词的一部分

狄承望
2023-03-14

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

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

搜索带有包含"否则授权为此类"的文本字段的文档时,在搜索任何这些单词时返回突出显示的文档,但是如果文本字段包含类似于"[否则授权为此类]"的内容,则仅搜索"授权"返回一个结果。

我猜是因为方括号的缘故,lucene没有把“[否则的话”“这样的]”看作单词?我不是lucene的专家,即使有文档,我也被困在这个问题上。有没有办法定制一个分析器,将“[”作为单词搜索的一部分?

谢谢

共有1个答案

柴磊
2023-03-14

您不需要手动去除坏字符,您应该编写自定义的分析器,它将使用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);
        }
    }

在这里,我选择仅替换“”符号。

在此索引时间筛选之后,您将能够正常搜索。

代码的完整示例位于此处

 类似资料:
  • 我刚开始使用hibernate lucene搜索。从几天以来,我一直致力于搜索关键字与特殊字符。我正在使用MultiFieldQueryParser进行精确短语匹配以及布尔搜索。但在这个过程中,我无法得到搜索关键字的结果,如“有1年以上的经验”,如果我没有在搜索关键字周围添加任何引号,那么我就得到了结果。所以我在执行lucene查询时观察到的是,它正在转义特殊符号(+)。我正在使用Standard

  • 我有一个问题与搜索的特殊字符在solr。我的文档有一个字段标题,有时它可以像泰坦尼克号-1999(它有字符-)。当我试图搜索索尔与"-"我收到一个400错误。我试图逃避这个角色,所以我尝试了像“-”和“\-”这样的东西。有了这些变化,solr不会用错误来回应我,但它会返回0个结果。 如何在solr admin中搜索具有该特殊字符(如“-”或“”?)的内容??? 问候 在这里更新您可以看到我当前的s

  • 我有像这样的字符串: (或) 我想看看这个字符串是否有单词“place”。 如果它们是我使用的字符串中的单词,则包含("place")。因为这是所有一个字符串,我尝试拆分但它给出了语法错误。你能让我知道如何获取它吗?

  • 问题内容: 我无法在Elasticsearch中以特殊字符结尾/开头的字符进行搜索。就像“ 123456!” 我的映射是 它给我错误,我可以在搜索查询(或映射)中做什么,以便特殊字符将被视为搜索字符串的一部分? 问题答案: 由于您的字段是(好!),请尝试用双引号引起来进行完全匹配: 这样做的另一种方法是在查询中设置分析器(但请务必转义,因为它是保留字符(对于操作员)

  • 是否可以通过fullTextQuery找到带有特殊字符的单词?luke的搜索很好地处理了查询,但是from fullTextQuery没有返回任何结果。 不带通配符搜索“C”,不带特殊字符。 如何解决这个问题?

  • 要转义这些字符,请在字符前面使用\。例如,要搜索(1+1):2,请使用以下查询: 为此,我使用方法: 我使用经典分析器是因为我注意到标准分析器在转义特殊字符方面存在一些问题。 null