gpt4 book ai didi

java - 转义 Lucene 不起作用

转载 作者:行者123 更新时间:2023-12-01 10:12:28 25 4
gpt4 key购买 nike

我正在为“id”字段等于“ID:123456:789”的文档制作 lucene 查询。

我通过 QueryParser.escape 传递“ID:123456:789”,我已确认它在字符串中的每个冒号之前添加了转义符。我尝试使用两种不同的方法从转义字符串创建查询,但没有成功,但这两种方法都无法构建有效的查询来匹配 id 字段等于“ID:123456:789”的文档。


对于这两种方法,我都使用字符串的转义版本来制作查询:

String escapedSearchTerm= QueryParser.escape("ID:123456:789"); // searchTerm = "ID\:123456\:789"


方法1:(结果查询中的第二个冒号变成空格)

QueryParser parser = new QueryParser("id", new StandardAnalyzer());
Query query = parser.parse(escapedSearchTerm);
System.out.println(query.toString(field)); // ID:123456 789 (second colon becomes a space)


方法 2:(结果查询中两个冒号都变成空格)

Query query = (new QueryBuilder(analyzer)).createPhraseQuery("id", escapedSearchTerm);
System.out.println(query.toString(field)); // ID 123456 789 (both colons become a space)


如您所见,这两种方法都不会产生所需的查询。如何构建一个查询来匹配 id 字段完全等于字符串“ID:123456:789”的文档。

最佳答案

QueryParser.escape 旨在转义查询语法。它并不是为了绕过分析。在您展示的情况下,您正在使用 StandardAnalyzer。字符串“ID:123456:789”将被分析器标记为三个术语:“id”、“123456”、“789”。如果您在索引时使用StandardAnalyzer,则在构建查询时应使用适当的分析器。

例如:

QueryParser parser = new QueryParser("text", new StandardAnalyzer());
Query query = parser.parse("default", "myfield:ID:123456:789");

这会导致语法错误,我认为原因非常明显。

QueryParser parser = new QueryParser("text", new StandardAnalyzer());
Query query = parser.parse("default", "myfield:" + QueryParser.escape("ID:123456:789"));

结果为“myfield:id myfield:123456 myfield:789”。冒号已正确转义,但随后被分析删除。注意这和

之间的区别
Query query = parser.parse("default", "myfield:ID 123456 789"));

结果是“myfield:id default:123456 default:789”。

如果您的字段分析:

那么短语查询可能就是您正在寻找的解决方案:

QueryParser parser = new QueryParser("text", new StandardAnalyzer());
Query query = parser.parse("default", "myfield:\"ID:123456:789\""));

如果您的字段被分析:

您可以在 QueryParser 中使用 KeywordAnalyzer:

QueryParser parser = new QueryParser("text", new KeywordAnalyzer());
Query query = parser.parse("default", "myfield:" + QueryParser.Escape("ID:123456:789")));

或者您可以构造一个 TermQuery:

Query query = new TermQuery("myfield", "ID:123456:789");

关于java - 转义 Lucene 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36068742/

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