2016-06-27 33 views
2

我已經在elasticsearch之上構建了一個web應用程序。我想用Java來做一個多重過濾器。如何在使用Java的Elasticsearch中執行多個過濾器查詢?

Elasticsearch查詢:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     {"match": { 
      "T": "TEXT"}, 
      "match": { 
      "new_content": "TEXT" 
      } 
     }, 

     ], 
     "filter": { 
     "term": { 
      "collection1": "xyz" 
     }, 
     "term": { 
      "collection2": "abc" 
     } 

我要過濾的查詢,例如,它應該在同一領域collection篩選與兩個不同的值(例如,「XYZ」和「ABC」)

現在,我已經爲單個過濾器編寫了一個Java程序。

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() 
       .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T")) 
       .filter(QueryBuilders.termQuery(Collection1, "abc")); 

我應該如何過濾多個值的同一個字段上的查詢?

編輯

在我的web應用程序

實際上,我已經提取的收藏價值:

String[] Collection=request.getParameterValues("site"); 

收藏是我elasticsearch文檔領域。假設Collection[0]是germany_collection(值:true),Collection[1]是usa_collection(值:true)。我想編寫一個查詢過濾我的文檔,以便在germany_collection:true和usa_collection:true時獲得結果。

這是我原來的計劃:

public StringBuffer getJson(String query, String start, String [] Collection{ 
Client client = TransportClient.builder().build() 
       .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); 

     BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() 
       .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T")) 
       .filter(QueryBuilders.termQuery(Collection[0], "true").filter(QueryBuilders.termQuery(Collection[1], "true"); 

但是,當我沒有應用這個過濾器,我收到此錯誤The method filter(TermsQueryBuilder) is undefined for the type TermsQueryBuilder。它說添加到方法接收器。

回答

4

可以使用terms查詢,而不是多個term查詢:

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() 
       .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T")) 
       .filter(QueryBuilders.termsQuery(Collection, "abc", "xyz")); 
             ^    ^ ^
              |     |  | 
            use termsQuery  with multiple values 

UPDATE

我很驚訝,你的代碼編譯,因爲在所有你缺少一些右括號,只是重寫您的查詢是這樣的,它應該工作:

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() 
      .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T")) 
      .filter(QueryBuilders.termQuery(Collection[0], "true")) 
      .filter(QueryBuilders.termQuery(Collection[1], "true")); 
+0

對不起。我搞砸了一個恰當的問題。你能檢查我的編輯部分嗎? – Rose

+0

我已經更新了我的答案。 – Val

+0

它工作。謝謝。由於缺少右括號而出現錯誤。再次感謝 – Rose

相關問題