2012-10-08 52 views
3

個人我在查詢中遇到問題,想將AND子句放在一個術語中,但是我沒有得到並嘗試搜索沒有成功。Lucene條件AND在QueryBuilder中

按照例子,返回查詢(我使用的是在我indece測試盧克條件和結果是不同的)

builder.bool() 
    .should(builder 
      .bool() 
      .should(builder.keyword() 
        .onFields("campo01", "campo02", "campo03") 
        .matching(query).createQuery()) 
      .should(builder.keyword().wildcard().onField("campo01") 
        .matching("*" + query + "*").createQuery()) 
      .should(builder.keyword().wildcard().onField("campo02") 
        .matching("*" + query + "*").createQuery()) 
      .should(builder.keyword().wildcard().onField("campo03") 
        .matching("*" + query + "*").createQuery()).createQuery()) 
    .must(builder.keyword().onField("campo04").matching(0).createQuery()) 
    .createQuery(); 

此代碼生成以下查詢Lucene的:

(((campo01:teste campo02:test campo03:teste) campo01:*teste* campo02*teste* campo03:*teste*) +campo04:0) 

但是,此查詢返回的結果比預期的要大。與盧克進行測試意識到,必須是不理想的,需要成爲和。

(((campo01:teste campo02:test campo03:teste) campo01:*teste* campo02*teste* campo03:*teste*) AND campo04:0) 

因此,結果是正確的,但我無法使生成查詢來創建此結果。

任何人都可以幫助或有任何問題依然存在。我真正想要的是將AND條件放在特定的領域。

回答

2

你有正確的想法,使用'必須'和'應該'子句。您可以構建一個查詢,從而有效地創建使用它們的邏輯AND。你錯過了一件事。 的和結構,如:

query1 AND query2 

是:

+query1 +query2 

你錯過例如在「+」,或者必須條款,在第一個查詢,所以當第二是必需的,第一個不是,雖然它影響結果權重。

那麼,具體來說,你要的是

builder.bool() 
.must(builder 
     .bool() 
     .should(builder.keyword() 
       .onFields("campo01", "campo02", "campo03") 
       .matching(query).createQuery()) 
     .should(builder.keyword().wildcard().onField("campo01") 
       .matching("*" + query + "*").createQuery()) 
     .should(builder.keyword().wildcard().onField("campo02") 
       .matching("*" + query + "*").createQuery()) 
     .should(builder.keyword().wildcard().onField("campo03") 
       .matching("*" + query + "*").createQuery()).createQuery()) 
.must(builder.keyword().onField("campo04").matching(0).createQuery()) 
.createQuery(); 

或者......

(+((campo01:teste campo02:test campo03:teste) campo01:*teste* campo02*teste* campo03:*teste*) +campo04:0) 
+0

謝謝,非常完美。 –