ElasticSearch 中boolQueryBuilder的使用


 
List<EsActivity> list(ActivityQueryRequest request);

public <T> List<T> documentList(BoolQueryBuilder boolQuery,String index,Integer pageSize,Integer pageNum, Class<T> tClass){
        SearchRequest searchRequest = new SearchRequest(index);
        searchRequest.types(type);
        SearchSourceBuilder searchSourceBuilder =  new SearchSourceBuilder();
        searchSourceBuilder.query(boolQuery);
        searchSourceBuilder.sort("updateTime", SortOrder.DESC);
        if(pageSize!=null && pageNum!=null){
            searchSourceBuilder.from((pageNum-1)*pageSize);
            searchSourceBuilder.size(pageSize);
        }else{
            searchSourceBuilder.from(0);
            searchSourceBuilder.size(10000);
        }
//        String[] includeFields = new String[] {"activityId", "eCommerceId","platformCode"};
//        String[] excludeFields = new String[] {};
//        searchSourceBuilder.fetchSource(includeFields, excludeFields);
        searchRequest.source(searchSourceBuilder);
        try {
            //查詢結果
            SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            SearchHits hits = searchResponse.getHits();
            SearchHit[] searchHits = hits.getHits();
            List<T> result = Arrays.stream(searchHits).map(item -> {
                JSONObject jsonObject = JSONObject.parseObject(item.getSourceAsString());
                jsonObject.put("documentId",item.getId());
                return JSONObject.toJavaObject(jsonObject, tClass);
            }).collect(Collectors.toList());
            return result;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return new ArrayList<>();
        }

    }

-----------------------------------

@RequestMapping("/searchMatch")
public List<NBAPlayer> searchMatch(@RequestParam(value = "displayNameEn", required = false) String displayNameEn) throws IOException {
return nbaPlayerService.searchMatch("displayNameEn", displayNameEn);
}


List<NBAPlayer> searchMatch(String key, String value) throws IOException;
 @Override
public List<NBAPlayer> searchMatch(String key, String value) throws IOException {
SearchRequest request = new SearchRequest(NBA_INDEX);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQuery = new BoolQueryBuilder();
boolQuery.must(QueryBuilders.termQuery(key, value));
searchSourceBuilder.query(QueryBuilders.matchQuery(key, value));
// searchSourceBuilder.query(QueryBuilders.);
searchSourceBuilder.from(0);
searchSourceBuilder.size(1000);
request.source(searchSourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
System.out.println(JSONObject.toJSON(response));
SearchHit[] hits = response.getHits().getHits();
List<NBAPlayer> playerList = new ArrayList<>();
for (SearchHit hit : hits) {
NBAPlayer player = JSONObject.parseObject(hit.getSourceAsString(), NBAPlayer.class);
playerList.add(player);
}
return playerList;
}

 

-----------------------------------------------------------------------------
1. 為什么filter會快?

filename already exists, renamed
看上面的流程圖就能很明顯的看到,filterquery還是有很大的區別的。

比如,query的時候,會先比較查詢條件,然后計算分值,最后返回文檔結果;

filter則是先判斷是否滿足查詢條件,如果不滿足,會緩存查詢過程(記錄該文檔不滿足結果);滿足的話,就直接緩存結果。

綜上所述,filter快在兩個方面:

  • 1 對結果進行緩存
  • 2 避免計算分值
2. bool查詢的使用

Bool查詢對應Lucene中的BooleanQuery,它由一個或者多個子句組成,每個子句都有特定的類型

must
返回的文檔必須滿足must子句的條件,並且參與計算分值

filter
返回的文檔必須滿足filter子句的條件,但是不會像must一樣,參與計算分值

should
返回的文檔可能滿足should子句的條件.在一個bool查詢中,如果沒有must或者filter,有一個或者多個should子句,那么只要滿足一個就可以返回.minimum_should_match參數定義了至少滿足幾個子句.

must_not
返回的文檔必須不滿足定義的條件

如果一個查詢既有filter又有should,那么至少包含一個should子句.

bool查詢也支持禁用協同計分選項disable_coord.一般計算分值的因素取決於所有的查詢條件.

bool查詢也是采用more_matches_is_better的機制,因此滿足must和should子句的文檔將會合並起來計算分值.

3.JavaAPI使用

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

public void () throws IOException {
SearchRequest searchRequest = new SearchRequest("item");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

boolQueryBuilder.must(QueryBuilders.matchQuery("scompCode", "G0000001"));
// 模糊查詢
boolQueryBuilder.filter(QueryBuilders.wildcardQuery("itemDesc", "*手機*"));
// 范圍查詢 from:相當於閉區間; gt:相當於開區間(>) gte:相當於閉區間 (>=) lt:開區間(<) lte:閉區間 (<=)
boolQueryBuilder.filter(QueryBuilders.rangeQuery("itemPrice").from(4500).to(8899));
sourceBuilder.query(boolQueryBuilder);

searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
logger.info("查詢數據:{}", Arrays.toString(searchResponse.getHits().getHits()));
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM