2013-06-11 107 views
0

我需要以編程方式針對多個Solr字段構建布爾查詢。我認爲Lucene MultiFieldQueryParser將是一個很好的選擇。除非涉及特殊字符,否則此效果很好。Solr,特殊字符和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

查詢從Query.toString()方法傳遞的內容對於用戶可讀的查詢來說是最大的努力。它不一定是一個可解析的查詢,就像在這種情況下一樣。你可以從來沒有依靠像這樣的邏輯:parser.parse(query.toString())。 Lucene Query API能夠表達很多事情,根本無法用QueryParser語法來表達。

用於轉義testEscape()中的查詢的方法應該是正確的,併爲您提供查找的查詢。您也可以使用QueryParser.escape(userQuery)作爲原始Lucene方法。

+0

那麼,有什麼辦法可以用Solr查詢解析器做類似的事情嗎?我需要創建一個可以傳遞給SolrJ的查詢字符串。 – condit

+0

我相信Solr DisMax查詢解析器應該處理你正在查找的內容,請參閱[qf屬性](http://wiki.apache.org/solr/ExtendedDisMax#qf_.28Query_Fields.29)。 – femtoRgon