es的複雜查詢測試,使用jest的dsl工具寫查詢語句

Hiber12發表於2020-12-19

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是使列印的顏色變紅!!!

在這裡插入圖片描述

相關文章