我需要以编程方式针对多个Solr字段构建布尔查询。我认为Lucene MultiFieldQueryParser
将是一个很好的方式。除非涉及特殊字符,否则这很有效。
public class QueryParserSpike {
String userQuery = "(-)-foo";
String escapedQuery = ClientUtils.escapeQueryChars(userQuery); // \(\-\)\-foo
Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_43);
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_43, new String[]{"a"}, analyzer);
@Test(expected=ParseException.class)
public void testNoEscape() throws Exception {
parser.parse(userQuery); // Throws an exception
}
@Test
public void testEscape() throws Exception {
Query q = parser.parse(escapedQuery);
System.out.println(q.toString()); // a:(-)-foo (This can't be parsed by Solr)
}
@Test
public void testDoubleEscape() throws Exception {
String doubleEscapedQuery = escapedQuery.replaceAll("\\\\", "\\\\\\\\") ;
Query q = parser.parse(doubleEscapedQuery);
System.out.println(q.toString()); // (a:\) (a:\-\) (a:\-foo) (This isn't the correct query)
}
}
我想要摆脱的是a:\(\-\)\-foo
。是否有类似的Solr类?或者是自己编写一些东西来处理MultiFieldQueryParser结果的最佳选择?
答案 0 :(得分:0)
查询从Query.toString()
方法传递的内容是用户可读查询的最佳方法。它不一定是可解析的查询,就像在这种情况下一样。您永远不会依赖于以下逻辑:parser.parse(query.toString())
。 Lucene Query API能够表达使用QueryParser语法完全无法表达的许多内容。
用于在testEscape()
中转义查询的方法应该是正确的,并为您提供所需的查询。您也可以使用QueryParser.escape(userQuery)
作为原始Lucene方法。