ElasticSearch(must、should、filter、must_not) bool的查詢
阿新 • • 發佈:2020-12-02
ElasticSearch的組合查詢
現實的查詢需求從來都沒有那麼簡單;它們需要在多個欄位上查詢多種多樣的文字,並且根據一系列的標準來過濾。為了構建類似的高階查詢,你需要一種能夠將多查詢組合成單一查詢的查詢方法。
你可以用bool
查詢來實現你的需求。這種查詢將多查詢組合在一起,成為使用者自己想要的布林查詢(Bool)。
程式碼示例:
//new 一個查詢物件 BoolQueryBuilder boolQueryBuilder1 = QueryBuilders.boolQuery(); //也可以 BoolQueryBuilder boolQueryBuilder = boolQuery();
它主要的幾個方法如下:
1.must
文件必須匹配這些條件才能被包含進來。相當於sql中的and
2.must_not
文件必須不匹配這些條件才能被包含進來。相當於sql中的not
3.should
如果滿足這些語句中的任意語句,將增加_score
,否則,無任何影響。它們主要用於修正每個文件的相關性得分。相當於sql中的or
4.filter
必須匹配,但它以不評分、過濾模式來進行。這些語句對評分沒有貢獻,只是根據過濾標準來排除或包含文件。
構造查詢條件
1. termQuery:精確查詢(不分詞)
使用termQuery要注意的是,Elasticsearch5之後,取消了string型別,將原來的string型別拆分為text和keyword兩種型別,他們的區別在於text會對欄位進行分詞處理,而keyword則不會。
2. matchQuery:匹配查詢(分詞)
match query搜尋的時候,首先會解析查詢字串,進行分詞,然後查詢,所以假如我搜索的條件輸入的是"六年級",則會把各個年級(一年級至九年級)的資料都查詢出來,因為其中都包含’年級’ 。
3. queryString:精確查詢
4. wildcardQuery:模糊查詢
5. rangeQuery:範圍查詢
程式碼示例:
BoolQueryBuilder boolQueryBuilder = boolQuery(); //精確查詢 if (searchDto.getId() != null) { boolQueryBuilder.must().add(termQuery("id", searchDto.getId())); } //模糊查詢 if (searchDto.getSkuLike() != null) { boolQueryBuilder.must().add(wildcardQuery("sku",StrUtil.format("*{}*",searchDto.getSkuLike()))); } //範圍查詢 if (searchDto.getSupplierAddTimeStart() != null) { boolQueryBuilder.must().add(rangeQuery("create_time").gte(searchDto.getSupplierAddTimeStart())); } // if (searchDto.getSupplierAddTimeEnd() != null) { boolQueryBuilder.must().add(rangeQuery("create_time").lte(searchDto.getSupplierAddTimeEnd())); } // or查詢的情況 (Condition 1 OR Condition 2) AND Condition3 if (searchDto.getKeyword() != null) { BoolQueryBuilder childBoolQueryBuilder = boolQuery(); childBoolQueryBuilder.should().add(wildcardQuery("sku",StrUtil.format("*{}*",searchDto.getKeyword()))); childBoolQueryBuilder.should().add(wildcardQuery("title",StrUtil.format("*{}*",searchDto.getKeyword()))); boolQueryBuilder.must().add(childBoolQueryBuilder); }