0

我需要针对多个 Solr 字段以编程方式构建布尔查询。我认为 LuceneMultiFieldQueryParser将是一个不错的选择。除非涉及特殊字符,否则这很有效。

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 的结果的最佳选择是什么?

4

1 回答 1

0

查询从Query.toString()方法传递的内容是用户可读查询的最大努力。它不一定是可解析的查询,就像在这种情况下一样。你永远不能依赖这样的逻辑:parser.parse(query.toString()). Lucene Query API 能够表达许多用 QueryParser 语法根本无法表达的东西。

您用来转义查询的方法testEscape()应该是正确的,并为您提供您正在寻找的查询。您也可以将QueryParser.escape(userQuery), 用于原始 Lucene 方法。

于 2013-06-11T20:34:04.410 回答