Solr,特殊字符和MultiFieldQueryParser

时间:2013-06-11 20:20:24

标签: solr lucene solrj

我需要以编程方式针对多个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结果的最佳选择?

1 个答案:

答案 0 :(得分:0)

查询从Query.toString()方法传递的内容是用户可读查询的最佳方法。它不一定是可解析的查询,就像在这种情况下一样。您永远不会依赖于以下逻辑:parser.parse(query.toString())。 Lucene Query API能够表达使用QueryParser语法完全无法表达的许多内容。

用于在testEscape()中转义查询的方法应该是正确的,并为您提供所需的查询。您也可以使用QueryParser.escape(userQuery)作为原始Lucene方法。