上一節(jié)講述了 SpringBoot 實現(xiàn) elasticsearch 索引操作,這一章節(jié)講述 SpringBoot 實現(xiàn) elasticsearch 查詢操作。
1. 環(huán)境準備
案例用到的索引庫結構文章來源:http://www.zghlxwxcb.cn/news/detail-513748.html
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. 查詢?nèi)?/h2>
@GetMapping("/searchAll")
public List<HotelDoc> searchAll() throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
searchRequest.source().query(QueryBuilders.matchAllQuery());
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
return handleResponse(searchResponse);
}
2. 根據(jù) name 查詢 match 分詞查詢
@GetMapping("/searchByName/{name}")
public List<HotelDoc> searchByName(@PathVariable("name") String name)
throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
searchRequest.source().query(QueryBuilders.matchQuery("name", name));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
return handleResponse(searchResponse);
}
3. 根據(jù) name 和 品牌查詢 multiMatch 分詞查詢
@GetMapping("/searchByNameAndBrand/{name}")
public List<HotelDoc> searchByNameAndBrand(@PathVariable("name") String name) throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
searchRequest.source().query(QueryBuilders.multiMatchQuery(name,"name","brand"));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
return handleResponse(searchResponse);
}
4. 根據(jù) brand 查詢 match 分詞查詢
@GetMapping("/searchByBrand/{name}")
public List<HotelDoc> searchByBrand(@PathVariable("name") String name) throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
searchRequest.source().query(QueryBuilders.matchQuery("brand", name));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
return handleResponse(searchResponse);
}
5. 按照價格 范圍查詢
@GetMapping("/searchByPrice/{low}/{high}")
public List<HotelDoc> searchByPrice(@PathVariable("low") String low, @PathVariable("high") String high) throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
searchRequest.source().query(QueryBuilders.rangeQuery("price").gte(low).lte(high));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
return handleResponse(searchResponse);
}
6. 精確查詢
@GetMapping("/termQueryCity/{city}")
public List<HotelDoc> termQueryCity(@PathVariable("city") String city) throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//searchSourceBuilder.query(QueryBuilders.termQuery("city", city)); 這行有點小問題
// 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.準備Request
SearchRequest request = new SearchRequest("索引名稱");
// 2.準備DSL
// 2.1.準備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ā)送請求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4.解析響應
return handleResponse(response);
}
8. 分頁
@GetMapping("/testPageAndSort/{currentPage}/{pageSize}")
public List<HotelDoc> testPageAndSort(@PathVariable("currentPage") Integer currentPage, @PathVariable("pageSize") Integer pageSize) throws Exception {
// 頁碼,每頁大小
// 1.準備Request
SearchRequest request = new SearchRequest("索引名稱");
// 2.準備DSL
// 2.1.query
request.source().query(QueryBuilders.matchAllQuery());
// 2.2.排序 sort
request.source().sort("price", SortOrder.ASC);
// 2.3.分頁 from、size
request.source().from((currentPage - 1) * pageSize).size(pageSize);
// 3.發(fā)送請求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4.解析響應
return handleResponse(response);
}
9. 高亮查詢
@GetMapping("/testHighlight/{name}")
void testHighlight(@PathVariable("name") String name) throws Exception {
// 1.準備Request
SearchRequest request = new SearchRequest("索引名稱");
// 2.準備DSL
// 2.1.query
request.source().query(QueryBuilders.matchQuery("name", name));
// 2.2.高亮
request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
// 3.發(fā)送請求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4.解析響應
handleResponse2(response);
}
9. 公共解析
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);
// 獲取命中的文檔對象數(shù)組
SearchHit[] hits = searchHits.getHits();
List<HotelDoc> docList = new ArrayList<>();
for (SearchHit hit : hits) {
// 解析每一個hit對象得到對應的文檔數(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.解析響應
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);
// 獲取高亮結果
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
if ( !CollectionUtils.isEmpty(highlightFields) ) {
// 根據(jù)字段名獲取高亮結果
HighlightField highlightField = highlightFields.get("name");
if (highlightField != null) {
// 獲取高亮值
String name = highlightField.getFragments()[0].string();
// 覆蓋非高亮結果
hotelDoc.setName(name);
}
}
System.out.println("hotelDoc = " + hotelDoc);
}
}
@GetMapping("/searchAll")
public List<HotelDoc> searchAll() throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
searchRequest.source().query(QueryBuilders.matchAllQuery());
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
return handleResponse(searchResponse);
}
@GetMapping("/searchByName/{name}")
public List<HotelDoc> searchByName(@PathVariable("name") String name)
throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
searchRequest.source().query(QueryBuilders.matchQuery("name", name));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
return handleResponse(searchResponse);
}
@GetMapping("/searchByNameAndBrand/{name}")
public List<HotelDoc> searchByNameAndBrand(@PathVariable("name") String name) throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
searchRequest.source().query(QueryBuilders.multiMatchQuery(name,"name","brand"));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
return handleResponse(searchResponse);
}
@GetMapping("/searchByBrand/{name}")
public List<HotelDoc> searchByBrand(@PathVariable("name") String name) throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
searchRequest.source().query(QueryBuilders.matchQuery("brand", name));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
return handleResponse(searchResponse);
}
@GetMapping("/searchByPrice/{low}/{high}")
public List<HotelDoc> searchByPrice(@PathVariable("low") String low, @PathVariable("high") String high) throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
searchRequest.source().query(QueryBuilders.rangeQuery("price").gte(low).lte(high));
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
return handleResponse(searchResponse);
}
@GetMapping("/termQueryCity/{city}")
public List<HotelDoc> termQueryCity(@PathVariable("city") String city) throws Exception {
//1.創(chuàng)建請求語義對象
SearchRequest searchRequest = new SearchRequest("索引名稱");
// QueryBuilders: 構建查詢類型
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//searchSourceBuilder.query(QueryBuilders.termQuery("city", city)); 這行有點小問題
// 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);
}
@GetMapping("/testBool")
public List<HotelDoc> testBool() throws Exception {
// 1.準備Request
SearchRequest request = new SearchRequest("索引名稱");
// 2.準備DSL
// 2.1.準備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ā)送請求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4.解析響應
return handleResponse(response);
}
@GetMapping("/testPageAndSort/{currentPage}/{pageSize}")
public List<HotelDoc> testPageAndSort(@PathVariable("currentPage") Integer currentPage, @PathVariable("pageSize") Integer pageSize) throws Exception {
// 頁碼,每頁大小
// 1.準備Request
SearchRequest request = new SearchRequest("索引名稱");
// 2.準備DSL
// 2.1.query
request.source().query(QueryBuilders.matchAllQuery());
// 2.2.排序 sort
request.source().sort("price", SortOrder.ASC);
// 2.3.分頁 from、size
request.source().from((currentPage - 1) * pageSize).size(pageSize);
// 3.發(fā)送請求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4.解析響應
return handleResponse(response);
}
@GetMapping("/testHighlight/{name}")
void testHighlight(@PathVariable("name") String name) throws Exception {
// 1.準備Request
SearchRequest request = new SearchRequest("索引名稱");
// 2.準備DSL
// 2.1.query
request.source().query(QueryBuilders.matchQuery("name", name));
// 2.2.高亮
request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
// 3.發(fā)送請求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4.解析響應
handleResponse2(response);
}
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);
// 獲取命中的文檔對象數(shù)組
SearchHit[] hits = searchHits.getHits();
List<HotelDoc> docList = new ArrayList<>();
for (SearchHit hit : hits) {
// 解析每一個hit對象得到對應的文檔數(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.解析響應
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);
// 獲取高亮結果
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
if ( !CollectionUtils.isEmpty(highlightFields) ) {
// 根據(jù)字段名獲取高亮結果
HighlightField highlightField = highlightFields.get("name");
if (highlightField != null) {
// 獲取高亮值
String name = highlightField.getFragments()[0].string();
// 覆蓋非高亮結果
hotelDoc.setName(name);
}
}
System.out.println("hotelDoc = " + hotelDoc);
}
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-513748.html
到了這里,關于SpringBoot 實現(xiàn) elasticsearch 查詢操作(RestHighLevelClient 的案例實戰(zhàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!