2013-07-10 359 views
0

我通過編程創建布爾查詢。像這樣:默認操作符Solr和BooleanQuery構建

BooleanQuery query = new BooleanQuery(); 
    for (Iterator<String> it = guids.iterator(); it.hasNext();) { 
     String guid = it.next(); 
     query.add(new BooleanClause(
        new TermQuery(
         new Term("guid",guid) 
           ), 
        BooleanClause.Occur.SHOULD)); 
    } 

然後我從解析器返回它。解析器我設置

parser.setDefaultOperator(QueryParser.Operator.AND); 

的問題是,仍返回查詢像

guid:dafafafa guid:dadafafaf 

與默認操作方式:

guid:dafafafa AND guid:dadafafaf 

,但我要的是:

guid:dafafafa OR guid:dadafafaf 

why not que ry解析器負責調整默認操作符?

回答

0

我不完全知道你的意思「返回一個類似於」......的查詢「......但是,我認爲你的意思是你從結果查詢中得到了類似Query.toString()的信息。

從解析器傳出的查詢不再與解析器有任何關係。該查詢沒有默認運算符,默認運算符僅適用於解析傳遞給它的文本查詢。 Query.toString和其他類似的方法盡最大努力以字符串形式表示任意複雜的查詢。在這樣做的過程中,他們通常不會使用AND/OR語法,而是使用+/-語法,它與實際lucene查詢的表示更緊密相關,其中子句的子句設置爲SHOULDMUSTMUST_NOT

重讀,我可能會誤解,你可能只是手動構建整個查詢。但是,如果您沒有通過QueryParser傳遞查詢字符串,那麼QueryParser將如何處理任何事情?

+0

我爲Solr編寫了一個自定義查詢解析器。爲了實現它,我使用lucene的Extendable Query parser [這裏是描述](https://lucene.apache.org/core/4_3_1/queryparser/org/apache/lucene/queryparser/ext/ExtendableQueryParser.html)。然後,每個字段都有一個返回查詢的擴展。這組查詢然後返回到Solr ** QParser.parser ** – Windys

+0

我明白了。默認的運算符邏輯會影響理解查詢字符串,但不會轉換'Query'對象。我相信,如果你正在實現自己構建'Query'的邏輯,它也將落到你的實現中來處理defaultOperator。如果你用'BooleanClause.Occur.SHOULD'明確地設置了一個子句,那麼這個子句就會被默認的操作符覆蓋,這似乎很奇怪。 – femtoRgon