es的複雜查詢測試,使用jest的dsl工具寫查詢語句
1、查詢有兩種方案:
(1)先過濾條件,再搜尋關鍵字
(2)先搜尋關鍵字,再過濾條件
採用先過濾條件,再搜尋關鍵字,這樣查詢效率更高!!!
2、這樣的查詢也是交集查詢,把查詢範圍縮小,才能更加符合使用者需查詢的商品。
query{
bool #聯合查詢
filter #過濾條件
term #過濾某一列的id
must #關鍵字查詢
match #搜尋某一列資料的關鍵字
}
3、舉例,執行下面的es複雜查詢(過濾條件+關鍵字查詢)(filter過濾條件term交集):
GET gmall0105/PmsSkuInfo/_search
{
"query": {
"bool": {
"filter": [
{ "term": {"skuAttrValueList.valueId":"47"}
},
{"term": {"skuAttrValueList.valueId": "93"}
}
]
, "must": [
{
"match": {
"skuName": "小米"
}
}
]
}
}
}
注意這裡的filter過濾條件的大括號格式:
“filter”:[
{ “term”:{} } ,
{ “term”:{} }
]
4、執行下面的es複雜查詢(過濾條件+關鍵字查詢)(filter過濾條件terms並集)
這個terms並集的過濾條件範圍比term大,所以按照terms過濾。
程式碼如下:
GET gmall0105/PmsSkuInfo/_search
{
"query": {
"bool": {
"filter": [
{"terms":{"skuAttrValueList.valueId":["62","68","83"]}
},
{ "term": {"skuAttrValueList.valueId":"47"}
},
{"term": {"skuAttrValueList.valueId": "93"}
}
]
, "must": [
{
"match": {
"skuName": "小米"
}
}
]
}
}
}
5、查詢結果,資料庫總共12條小米sku商品,查詢到符合條件的共7條:
6、既然知道es的複雜查詢語句,並且測試也查到了相應的結果,接下來就是對接在java層面,對es進行查詢。難度係數巨高!!!認真理解!!!
(1)new一個Search.Builder物件(“es查詢語句”).addIndex索引.addType表名.buid()
Search search = new Search.Builder("").addIndex("gmall0105").addType("PmsSkuInfo").build();
(2)使用jestClient.execute(search)對其進行包裝和解析,並返回結果:
返回的結果是這樣的,有很多引數,我們需要對這些引數進行處理,需要用哪個引數?
(3)這裡就暫時使用hits匹配條數吧,接收回來的結果result.getHits(對映類的class泛型),快捷鍵Ctrl+alt+v,使用一個泛型列表接收它。
(4)再把這個泛型列表資料使用for迴圈遍歷每一條資料hit.source,最終得到就是你需要的物件資料了,再使用一個es物件列表接收即可!
//用api執行es複雜查詢
List<PmsSearchSkuInfo> pmsSearchSkuInfos = new ArrayList<>();
Search search = new Search.Builder("{\n" +
" \"query\": {\n" +
" \"bool\": {\n" +
" \"filter\": [\n" +
" {\"terms\":{\"skuAttrValueList.valueId\":[\"62\",\"68\",\"83\"]}\n" +
" },\n" +
" \n" +
" { \"term\": {\"skuAttrValueList.valueId\":\"47\"}\n" +
" },\n" +
" \n" +
" {\"term\": {\"skuAttrValueList.valueId\": \"93\"}\n" +
" }\n" +
" \n" +
" ]\n" +
" \n" +
" , \"must\": [\n" +
" {\n" +
" \"match\": {\n" +
" \"skuName\": \"小米\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" }\n" +
"}").addIndex("gmall0105").addType("PmsSkuInfo").build();
SearchResult result = jestClient.execute(search);
List<SearchResult.Hit<PmsSearchSkuInfo, Void>> hits = result.getHits(PmsSearchSkuInfo.class);
for (SearchResult.Hit<PmsSearchSkuInfo, Void> hit : hits) {
pmsSearchSkuInfos.add(hit.source);
}
System.out.print(pmsSearchSkuInfos.size());
7、斷點測試,查詢到es條數7條,測試成功:
這樣查詢,雖然可以,但是這個es查詢語句(json的dsl語句)太長了,直接貼上在程式碼裡,顯得非常冗腫。
8、使用jest的dsl工具,幫助我們寫es查詢語句
分頁:
1、前臺傳遞頁碼,
2、定義每頁多少條數,
3、條數*頁碼 就是你查詢的範圍
(1)
複雜條件查詢語句:
query 查詢
bool 聯合查詢
filter 過濾條件
terms 過濾某一列的id的並集
term 過濾某一列的id
must 關鍵字查詢
match 搜尋某一列資料的關鍵字
from
size
highlight
(2)步驟,記得上邊的單詞即可,並且理解其的層級關係,下面的程式碼就很好寫了:
(3)New searchsourcebuilder物件,這個物件下有query、from、size、highlight這些方法同級
(4)New boolquerybuilder物件,這個物件有filter、must這些方法同級
(5)New termquerybuilder物件,有term方法,填寫(“欄位名”,“值”),篩選id。
(6)如果多個id並集篩選,則new termsquerybuilder物件
(7)New matchquerybuilder物件,有match方法,填寫(“欄位名”,“值”),搜尋關鍵字
如果要完整的查詢一次有過濾列和關鍵字的搜尋,需要4個new物件,最後把boolquerybuilder物件丟進searchsourcebuilder物件的query方法即可!!!
(8)New HighlightBuilder物件,這個物件有樣式標籤前字尾pretags、posttags、field欄位名等方法。
//jest的dsl工具,幫忙生成查詢語句
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//bool聯合條件查詢
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
//filter的term條件篩選
TermQueryBuilder termQueryBuilder = new TermQueryBuilder("skuAttrValueList.valueId","47");
boolQueryBuilder.filter(termQueryBuilder);
//must的match關鍵字查詢
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("skuName","小米");
boolQueryBuilder.must(matchQueryBuilder);
//query查詢
searchSourceBuilder.query(boolQueryBuilder);
//from起始條數
searchSourceBuilder.from(0);
//size查詢資料條數
searchSourceBuilder.size(20);
//highlight高亮
searchSourceBuilder.highlight(null);
String dslStr = searchSourceBuilder.toString(); //根據使用者搜尋的內容和點選的篩選條件,生成最終查詢語句!
System.err.print(dslStr);
列印最終生成的查詢語句:
System.err.print(); //err是使列印的顏色變紅!!!
相關文章
- 複雜查詢—子查詢
- Laravel使用MongoDB複雜的查詢LaravelMongoDB
- Elasticsearch查詢及聚合類DSL語句寶典Elasticsearch
- ES 20 - 查詢Elasticsearch中的資料 (基於DSL查詢, 包括查詢校驗match + bool + term)Elasticsearch
- JPA的多表複雜查詢
- Solr複雜查詢一:函式查詢Solr函式
- SQL 複雜查詢SQL
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- ElasticSearch DSL 查詢Elasticsearch
- mysql查詢語句5:連線查詢MySql
- PostgreSQL 原始碼解讀(24)- 查詢語句#9(查詢重寫)SQL原始碼
- mysql查詢語句MySql
- 寫一個“特殊”的查詢構造器 – (四、條件查詢:複雜條件)
- oracle表複雜查詢Oracle
- 複雜查詢還是直接寫sql吧SQL
- hisql ORM 查詢語句使用教程SQLORM
- MySQL的簡單查詢語句MySql
- mysql dba常用的查詢語句MySql
- Mysql之查詢語句MySql
- sql查詢語句流程SQL
- SQL mother查詢語句SQL
- SQL查詢語句 (Oracle)SQLOracle
- mysql查詢語句集MySql
- MySQL 查詢常用操作(0) —— 查詢語句的執行順序MySql
- Laravel Query Builder 複雜查詢案例:子查詢實現分割槽查詢 partition byLaravelUI
- mysql查詢效率慢的SQL語句MySql
- oracle查詢語句查詢增加一列內容Oracle
- linux中查詢find命令的複雜用法Linux
- 資料庫查詢語句資料庫
- mysql高階查詢語句MySql
- 多表查詢建表語句
- Laravel 子查詢語句用法Laravel
- mybatis plus 使用LambdaQueryWrapper設定複雜的條件查詢MyBatisAPP
- MySQL中用通用查詢日誌找出查詢次數最多的語句的教程MySql
- SQL學習(三) 複雜查詢SQL
- SQL語句替換查詢結果的的寫法舉例SQL
- 在mysql查詢效率慢的SQL語句MySql
- Oracle常用的系統查詢語句整理Oracle