SpringBoot實(shí)現(xiàn)elasticsearch 查詢(xún)操作(RestHighLevelClient 的案例實(shí)戰(zhàn))
上一節(jié)講述了 SpringBoot 實(shí)現(xiàn) elasticsearch 索引操作,這一章節(jié)講述SpringBoot實(shí)現(xiàn)elasticsearch查詢(xún)操作。
0. 環(huán)境準(zhǔn)備
案例用到的索引庫(kù)結(jié)構(gòu)
PUT /hotel { "mappings": { "properties": { "id": { "type": "keyword" }, "name":{ "type": "text", "analyzer": "ik_max_word", "copy_to": "all" }, "address":{ "type": "keyword", "index": false }, "price":{ "type": "integer" }, "score":{ "type": "integer" }, "brand":{ "type": "keyword", "copy_to": "all" }, "city":{ "type": "keyword", "copy_to": "all" }, "starName":{ "type": "keyword" }, "business":{ "type": "keyword" }, "location":{ "type": "geo_point" }, "pic":{ "type": "keyword", "index": false }, "all":{ "type": "text", "analyzer": "ik_max_word" } } } }
1. 查詢(xún)?nèi)?/h2>
@GetMapping("/searchAll")
public List<HotelDoc> searchAll() throws Exception {
//1.創(chuàng)建請(qǐng)求語(yǔ)義對(duì)象
SearchRequest searchRequest = new SearchRequest("索引名稱(chēng)");
// QueryBuilders: 構(gòu)建查詢(xún)類(lèi)型
searchRequest.source().query(QueryBuilders.matchAllQuery());
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
return handleResponse(searchResponse);
}
@GetMapping("/searchAll") public List<HotelDoc> searchAll() throws Exception { //1.創(chuàng)建請(qǐng)求語(yǔ)義對(duì)象 SearchRequest searchRequest = new SearchRequest("索引名稱(chēng)"); // QueryBuilders: 構(gòu)建查詢(xún)類(lèi)型 searchRequest.source().query(QueryBuilders.matchAllQuery()); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); return handleResponse(searchResponse); }
2. 根據(jù) name 查詢(xún) match 分詞查詢(xún)
@GetMapping("/searchByName/{name}") public List<HotelDoc> searchByName(@PathVariable("name") String name) throws Exception { //1.創(chuàng)建請(qǐng)求語(yǔ)義對(duì)象 SearchRequest searchRequest = new SearchRequest("索引名稱(chēng)"); // QueryBuilders: 構(gòu)建查詢(xún)類(lèi)型 searchRequest.source().query(QueryBuilders.matchQuery("name", name)); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); return handleResponse(searchResponse); }
3. 根據(jù) name 和 品牌查詢(xún) multiMatch 分詞查詢(xún)
@GetMapping("/searchByNameAndBrand/{name}") public List<HotelDoc> searchByNameAndBrand(@PathVariable("name") String name) throws Exception { //1.創(chuàng)建請(qǐng)求語(yǔ)義對(duì)象 SearchRequest searchRequest = new SearchRequest("索引名稱(chēng)"); // QueryBuilders: 構(gòu)建查詢(xún)類(lèi)型 searchRequest.source().query(QueryBuilders.multiMatchQuery(name,"name","brand")); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); return handleResponse(searchResponse); }
4. 根據(jù) brand 查詢(xún) match 分詞查詢(xún)
@GetMapping("/searchByBrand/{name}") public List<HotelDoc> searchByBrand(@PathVariable("name") String name) throws Exception { //1.創(chuàng)建請(qǐng)求語(yǔ)義對(duì)象 SearchRequest searchRequest = new SearchRequest("索引名稱(chēng)"); // QueryBuilders: 構(gòu)建查詢(xún)類(lèi)型 searchRequest.source().query(QueryBuilders.matchQuery("brand", name)); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); return handleResponse(searchResponse); }
5. 按照價(jià)格 范圍查詢(xún)
@GetMapping("/searchByPrice/{low}/{high}") public List<HotelDoc> searchByPrice(@PathVariable("low") String low, @PathVariable("high") String high) throws Exception { //1.創(chuàng)建請(qǐng)求語(yǔ)義對(duì)象 SearchRequest searchRequest = new SearchRequest("索引名稱(chēng)"); // QueryBuilders: 構(gòu)建查詢(xún)類(lèi)型 searchRequest.source().query(QueryBuilders.rangeQuery("price").gte(low).lte(high)); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); return handleResponse(searchResponse); }
6. 精確查詢(xún)
@GetMapping("/termQueryCity/{city}") public List<HotelDoc> termQueryCity(@PathVariable("city") String city) throws Exception { //1.創(chuàng)建請(qǐng)求語(yǔ)義對(duì)象 SearchRequest searchRequest = new SearchRequest("索引名稱(chēng)"); // QueryBuilders: 構(gòu)建查詢(xún)類(lèi)型 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //searchSourceBuilder.query(QueryBuilders.termQuery("city", city)); 這行有點(diǎn)小問(wèn)題 // https://zhuanlan.zhihu.com/p/270426807 參考 searchSourceBuilder.query(QueryBuilders.termQuery("city.keyword", city)); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); return handleResponse(searchResponse); }
7. boolQuery
@GetMapping("/testBool") public List<HotelDoc> testBool() throws Exception { // 1.準(zhǔn)備Request SearchRequest request = new SearchRequest("索引名稱(chēng)"); // 2.準(zhǔn)備DSL // 2.1.準(zhǔn)備BooleanQuery BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); // 2.2.添加term boolQuery.must(QueryBuilders.termQuery("city.keyword", "杭州")); // 2.3.添加range boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250)); request.source().query(boolQuery); // 3.發(fā)送請(qǐng)求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 4.解析響應(yīng) return handleResponse(response); }
8. 分頁(yè)
@GetMapping("/testPageAndSort/{currentPage}/{pageSize}") public List<HotelDoc> testPageAndSort(@PathVariable("currentPage") Integer currentPage, @PathVariable("pageSize") Integer pageSize) throws Exception { // 頁(yè)碼,每頁(yè)大小 // 1.準(zhǔn)備Request SearchRequest request = new SearchRequest("索引名稱(chēng)"); // 2.準(zhǔn)備DSL // 2.1.query request.source().query(QueryBuilders.matchAllQuery()); // 2.2.排序 sort request.source().sort("price", SortOrder.ASC); // 2.3.分頁(yè) from、size request.source().from((currentPage - 1) * pageSize).size(pageSize); // 3.發(fā)送請(qǐng)求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 4.解析響應(yīng) return handleResponse(response); }
9. 高亮查詢(xún)
@GetMapping("/testHighlight/{name}") void testHighlight(@PathVariable("name") String name) throws Exception { // 1.準(zhǔn)備Request SearchRequest request = new SearchRequest("索引名稱(chēng)"); // 2.準(zhǔn)備DSL // 2.1.query request.source().query(QueryBuilders.matchQuery("name", name)); // 2.2.高亮 request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false)); // 3.發(fā)送請(qǐng)求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 4.解析響應(yīng) handleResponse2(response); }
10. 公共解析
private List<HotelDoc> handleResponse(SearchResponse response) throws Exception { // 獲取命中的所有內(nèi)容 SearchHits searchHits = response.getHits(); // 獲取命中的總條數(shù) long count = searchHits.getTotalHits().value; System.out.println("命中的條數(shù)為: "+ count); // 獲取命中的文檔對(duì)象數(shù)組 SearchHit[] hits = searchHits.getHits(); List<HotelDoc> docList = new ArrayList<>(); for (SearchHit hit : hits) { // 解析每一個(gè)hit對(duì)象得到對(duì)應(yīng)的文檔數(shù)據(jù) String json = hit.getSourceAsString(); // HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class); docList.add(JSON.parseObject(json, HotelDoc.class)); } //destroy(); return docList; } private void handleResponse2(SearchResponse response) { // 4.解析響應(yīng) SearchHits searchHits = response.getHits(); // 4.1.獲取總條數(shù) long total = searchHits.getTotalHits().value; System.out.println("共搜索到" + total + "條數(shù)據(jù)"); // 4.2.文檔數(shù)組 SearchHit[] hits = searchHits.getHits(); // 4.3.遍歷 for (SearchHit hit : hits) { // 獲取文檔source String json = hit.getSourceAsString(); // 反序列化 HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class); // 獲取高亮結(jié)果 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); if ( !CollectionUtils.isEmpty(highlightFields) ) { // 根據(jù)字段名獲取高亮結(jié)果 HighlightField highlightField = highlightFields.get("name"); if (highlightField != null) { // 獲取高亮值 String name = highlightField.getFragments()[0].string(); // 覆蓋非高亮結(jié)果 hotelDoc.setName(name); } } System.out.println("hotelDoc = " + hotelDoc); } }
到此這篇關(guān)于SpringBoot實(shí)現(xiàn)elasticsearch 查詢(xún)操作(RestHighLevelClient 的案例實(shí)戰(zhàn))的文章就介紹到這了,更多相關(guān)SpringBoot elasticsearch查詢(xún)操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中CopyOnWriteArrayList的使用解析
這篇文章主要介紹了Java中CopyOnWriteArrayList的使用解析,CopyOnWriteArrayList適合使用在讀操作遠(yuǎn)遠(yuǎn)大于寫(xiě)操作的場(chǎng)景里,比如緩存,它不存在擴(kuò)容的概念,每次寫(xiě)操作都要復(fù)制一個(gè)副本,在副本的基礎(chǔ)上修改后改變Array引用,需要的朋友可以參考下2023-12-12SpringBoot整合Mybatis實(shí)現(xiàn)高德地圖定位并將數(shù)據(jù)存入數(shù)據(jù)庫(kù)的步驟詳解
這篇文章主要介紹了SpringBoot整合Mybatis實(shí)現(xiàn)高德地圖定位并將數(shù)據(jù)存入數(shù)據(jù)庫(kù)的步驟詳解,本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Mybatis實(shí)現(xiàn)批量操作8種小結(jié)
本文對(duì)Mybatis的五種批處理方式進(jìn)行了性能測(cè)試,包括批量新增和批量修改,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10Java利用Dijkstra算法求解拓?fù)潢P(guān)系最短路徑
迪杰斯特拉算法(Dijkstra)是由荷蘭計(jì)算機(jī)科學(xué)迪家迪杰斯特拉于1959年提出的,因此又叫狄克斯特拉算法。本文將利用迪克斯特拉(Dijkstra)算法求拓?fù)潢P(guān)系最短路徑,感興趣的可以了解一下2022-07-07Spring?@Conditional通過(guò)條件控制bean注冊(cè)過(guò)程
這篇文章主要為大家介紹了Spring?@Conditional通過(guò)條件控制bean注冊(cè)過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02java使用Stream流對(duì)自定義對(duì)象數(shù)組去重的實(shí)現(xiàn)
本文主要介紹了java使用Stream流對(duì)自定義對(duì)象數(shù)組去重的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04Tk.mybatis零sql語(yǔ)句實(shí)現(xiàn)動(dòng)態(tài)sql查詢(xún)的方法(4種)
有時(shí)候,查詢(xún)數(shù)據(jù)需要根據(jù)條件使用動(dòng)態(tài)查詢(xún),這時(shí)候需要使用動(dòng)態(tài)sql,本文主要介紹了Tk.mybatis零sql語(yǔ)句實(shí)現(xiàn)動(dòng)態(tài)sql查詢(xún)的方法,感興趣的可以了解一下2021-12-12