gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:53:31 26 4
gpt4 key购买 nike

事情就是这样。我有一个存储在索引中的词,其中包含特殊字符,例如'-',最简单的代码是这样的:

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到底做了什么……

所以如果我想用特殊字符执行查询,我应该怎么做?我应该重写分析器还是从默认的继承查询分析器?以及如何?...

更新:

1 @The New Idiot @femtoRgon,我已经尝试了问题中所述的 QueryParser.escape(queryStr),但它仍然不起作用。

2 我尝试了另一种解决问题的方法。我从Tokenizer派生了一个QueryTokenizer,只用空格截取单词,打包成一个QueryAnalyzer,它派生自Analyzer,最后将QueryAnalyzer传递给QueryParser。

现在可以了。最初它不起作用,因为默认的 StandardAnalyzer 根据默认规则(将某些特殊字符识别为拆分器)切割 queryStr,当查询传递到 QueryParser 时,特殊字符已经被 StandardAnalyzer 删除。现在我使用我自己的方式来剪切 queryStr 并且它只将空格识别为分隔符,因此特殊字符保留在查询中等待处理,这很有效。

3 @The New Idiot @femtoRgon,感谢您回答我的问题。

最佳答案

对此我不确定,但我想您需要使用 \ 转义 - 。根据 Lucene docs .

The "-" or prohibit operator excludes documents that contain the term after the "-" symbol.

再次,

Lucene supports escaping special characters that are part of the query syntax. The current list special characters are

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /

To escape these character use the \ before the character.

Also remember, some characters you'll need to escape twice if they have special meaning in Java.

关于java - 如何使用 QueryParser 执行包含特殊字符的 lucene 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17839053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com