2016-06-23 45 views
2

我已經建立在elasticsearch(v2.3.3)之上的Web應用程序。要過濾查詢,我使用elasticsearch的後期過濾器。但是我知道,如果我使用後置過濾器,那麼過濾的性能優勢將會丟失,因爲我沒有使用任何聚合或差分過濾。 (參考:https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html後篩選查詢中使用Java

這是我elasticsearch客戶端如何看起來像:

Client client = TransportClient.builder().build().addTransportAddress(
     new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 
      9300)); 
    SearchResponse response = client.prepareSearch("index_name") 
     .setTypes("index_type") 
     .setQuery(QueryBuilders.simpleQueryStringQuery(query) 
      .field("newContent").field("T")) 
     .setPostFilter(QueryBuilders.termQuery(Collection, true)) 
     .setFetchSource(new String[] { "U", "UE", "UD", "T" }, null) 
     .setVersion(true).addHighlightedField("newContent").setFrom(0) 
     .setSize(10).execute().actionGet(); 

我也讀了過濾查詢在elasticsearch 2.X版本貶值。有沒有其他方法可以幫助我在執行查詢之前應用過濾器?我可能會錯過某些明顯的東西。我很感謝你的幫助。

回答

5

您只需把目前在後置濾波器的過濾器bool/filter查詢中。嘗試做命中,而不是:

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

SearchResponse response = client.prepareSearch("index_name") 
    .setTypes("index_type") 
    .setQuery(boolQuery) 
    .setFetchSource(new String[] { "U", "UE", "UD", "T" }, null) 
    .setVersion(true).addHighlightedField("newContent").setFrom(0) 
    .setSize(10).execute().actionGet(); 
+0

感謝。我會嘗試這一點,並讓你知道 – Rose

+0

嗨瓦爾,我想用你的解決方案。對於BoolQueryBuilder,我已經導入了「import org.elasticsearch.index.query.BoolQueryBuilder」包。對於OueryBuilder,我已經導入,導入「org.elasticsearch.index.query.BoolQueryBuilder」。我也嘗試了一些其他進口。但是我收到一個錯誤,它說「方法boolQuery()未定義爲類型MultiMatchQuery.QueryBuilder」。是否還有其他任何我缺少的進口產品? – Rose

+2

對不起,我有一個錯字'QueryBuilder'應該是'QueryBuilders'。我的不好,我修好了 – Val