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

如何使用QueryParser执行包含特殊字符的lucene查询?

云宏儒
2023-03-14

事情是这样的。我有一个术语html" target="_blank">存储在索引中,它包含特殊字符,比如'-',最简单的代码是这样的:

Document doc = new Document();
doc.add(new TextField("message", "1111-2222-3333", Field.Store.YES, Field.Index.NOT_ANALYZED));
writer.addDocument(doc);

然后使用QueryParser创建一个查询,如下所示:

String queryStr = "1111-2222-3333";
QueryParser parser = new QueryParser(Version.LUCENE_36, "message", new StandardAnalyzer(Version.LUCENE_36));
Query q = parser.parse(queryStr);
Query q = parser.parse(QueryParser.escape(queryStr));

不使用QueryParser而直接使用TermQuery可以做我想做的事情,但是这种方式对于用户输入文本来说不够灵活。

我想可能StandardAnalyzer做了一些事情来省略查询字符串中的特殊字符。我尝试了debug,我发现字符串是拆分的,实际查询是这样的:“message:1111 message:2222 message:3333”。不知道lucene到底做了什么……

那么如果我要执行带有特殊字符的查询,我该怎么做呢?我应该重写分析器还是从默认的分析器继承queryparser?又如何?...

我试过另一种方法来解决这个问题。我从Tokenizer派生了一个QueryTokenizer,并且只对单词进行空格切割,将其打包到一个QueryAnalyzer,它从Analyzer派生,最后将QueryAnalyzer传递到queryparser。

现在起作用了。最初它不起作用,因为默认的StandardAnalyzer根据默认规则(将一些特殊字符识别为拆分符)剪切queryStr,当查询传递到QueryParser时,StandardAnalyzer已经删除了这些特殊字符。现在我用我自己的方法来剪切查询器,它只识别空格作为拆分器,所以特殊字符留在查询中等待处理,这就起作用了。

3@新白痴@Femtorgon,谢谢你回答我的问题。

共有1个答案

尹晟
2023-03-14

我不确定这一点,但我猜您需要用\转义-。根据Lucene文档。

“-”或“禁止”运算符排除在“-”符号后面包含术语的文档。

再一次,

还要记住,如果某些字符在Java中有特殊含义,则需要转义两次。

 类似资料:
  • 我很难理解如何处理lucene中的特殊角色 我的分析器没有停止字,因此不会删除特殊字符: 比我创建文档要多: 查询标签:brüder\-g工作正常,但是模糊查询标签:brüder\-g~不返回任何内容。当街道名称为Eselgasse查询标签时:Esel~将正常工作。 我使用Lucene 5.3.1 谢谢你的帮助!

  • 我有一个密码字段,我需要使用javascript检查它是否有以下字符: ! @ # $ % ^ 我试着这样做,结果正如预期的那样: 有没有更简单/有效的方法来做到这一点?

  • 关于Lucene,我非常喜欢的一点是查询语言,在这里我(应用程序用户)可以编写动态查询。我通过 但这不适用于像这样的范围查询: 另一方面,通过API它可以工作(但我放弃了将查询用作输入的便捷方式): 这是查询解析器中的一个错误,还是我遗漏了一个要点,比如QueryParser接受的是词法值而不是数值?我如何在不使用查询API但解析字符串的情况下实现这一点? 这个问题是这个问题的后续问题,指出了问题

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

  • 我必须使用exe来运行某个函数。但是该目录包含某些具有特殊字符的文件夹,比如“.”,“-”,所以它不会被执行。我可以像重命名文件名一样重命名目录名吗?我不确定需要做什么。 我使用Linux环境。下面是一段代码, 有人能建议我吗?谢谢

  • 问题内容: 我必须检测一个字符串是否包含任何特殊字符。我该如何检查?Swift支持正则表达式吗? 我尝试了上面的代码,但是只有当我输入第一个字符作为特殊字符时,它才匹配。 问题答案: 您的代码检查字符串中是否没有字符来自给定的集合。您要检查的是给定集合中是否 没有 任何 字符: __ 您还可以使用正则表达式实现此目的: 该模式匹配的字符 不在 AZ,az或0-9范围内。 Swift 2更新: Sw