Java 为Lucene逃跑是行不通的
我正在为一个“id”字段等于“id:123456:789”的文档制作一个lucene查询 我正在传递“ID:123456:789”,但我已经确认QueryParser.escape会在字符串中的每个冒号之前添加转义。我尝试过使用两种不同的方法从转义字符串中创建查询,但都没有成功,但这两种方法都无法构建有效的查询来匹配id字段等于“id:123456:789”的文档Java 为Lucene逃跑是行不通的,java,lucene,Java,Lucene,我正在为一个“id”字段等于“id:123456:789”的文档制作一个lucene查询 我正在传递“ID:123456:789”,但我已经确认QueryParser.escape会在字符串中的每个冒号之前添加转义。我尝试过使用两种不同的方法从转义字符串中创建查询,但都没有成功,但这两种方法都无法构建有效的查询来匹配id字段等于“id:123456:789”的文档 对于这两种方法,我都使用字符串的转义符来创建查询: String escapedSearchTerm= QueryParser.e
对于这两种方法,我都使用字符串的转义符来创建查询:
String escapedSearchTerm= QueryParser.escape("ID:123456:789"); // searchTerm = "ID\:123456\:789"
方法1:(结果查询中的第二个冒号变为空格)
方法2:(结果查询中的两个冒号都变为空格)
正如您所看到的,这两种方法都不能生成所需的查询。如何构建查询以匹配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默认值:123456默认值:789”
如果分析了您的字段:
那么,短语查询可能就是您正在寻找的解决方案:
QueryParser parser = new QueryParser("text", new StandardAnalyzer());
Query query = parser.parse("default", "myfield:\"ID:123456:789\""));
如果未分析您的字段:
您可以在QueryParser中使用关键字分析器:
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");
QueryParser parser = new QueryParser("text", new KeywordAnalyzer());
Query query = parser.parse("default", "myfield:" + QueryParser.Escape("ID:123456:789")));
Query query = new TermQuery("myfield", "ID:123456:789");