1. elasticsearch-highlevel-api
1.1 依賴
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.17.15</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.17.15</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.17.15</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
</exclusions>
</dependency>
1.2 代碼-controller-service-impl
1.2.1 controller
package com.niewj.ssdemo.web;
import com.niewj.ssdemo.model.entity.BookDb;
import com.niewj.ssdemo.service.SearchEsService;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* ES相關測試
*
* @author niewj
* @date 2025/9/5 17:33
*/
@RestController
public class SearchEsController {
@Resource private SearchEsService searchEsService;
@RequestMapping(value = "/getByIds")
public List<BookDb> sayHello(@RequestBody List<String> ids) {
return searchEsService.search(ids);
}
@RequestMapping(value = "/queryTitleAndSummary")
public List<BookDb> queryTitleAndSummary(@RequestParam String searchKey) {
return searchEsService.queryTitleAndSummary(searchKey);
}
}
1.2.2 service
package com.niewj.ssdemo.service;
import com.niewj.ssdemo.model.entity.BookDb;
import java.util.List;
/**
* es數據查詢接口
*
* @date 2025/9/5 15:06
*/
public interface SearchEsService {
/**
* 查詢es數據
* @param ids
* @return
*/
List<BookDb> search(List<String> ids);
/**
* 根據標題和摘要查詢
* @param searchKey
* @return
*/
List<BookDb> queryTitleAndSummary(String searchKey);
}
1.2.3 service-impl
package com.niewj.ssdemo.service.impl;
import com.alibaba.fastjson.JSON;
import com.niewj.ssdemo.config.es.EsProperties;
import com.niewj.ssdemo.model.entity.BookDb;
import com.niewj.ssdemo.service.SearchEsService;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.stereotype.Service;
/**
* es查詢實現類
*/
@Slf4j
@Service
public class EsHightLevelServiceImpl<T> implements SearchEsService {
/** highlight查詢 */
@Resource private RestHighLevelClient restHighLevelClient;
@Resource private EsProperties esProperties;
@Override
public List<BookDb> search(List<String> ids) {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder queryBuilder = searchCondition(ids);
if (queryBuilder == null) {
return null;
}
searchSourceBuilder.query(queryBuilder);
// 設置排序
searchSourceBuilder.sort(SortBuilders.fieldSort("publish_date").order(SortOrder.DESC));
List<BookDb> dataList = searchAndGetData(searchSourceBuilder);
return dataList;
}
@Override
public List<BookDb> queryTitleAndSummary(String searchKey) {
SearchSourceBuilder ssBuilder = new SearchSourceBuilder();
MultiMatchQueryBuilder queryBuilder =
QueryBuilders.multiMatchQuery(searchKey, "title", "summary").minimumShouldMatch("1");
ssBuilder.query(queryBuilder);
ssBuilder.sort(SortBuilders.fieldSort("publish_date").order(SortOrder.DESC));
List<BookDb> dataList = searchAndGetData(ssBuilder);
return dataList;
}
/**
* 查詢並返回結果列表
*
* @param searchSourceBuilder
* @return
*/
private List<BookDb> searchAndGetData(SearchSourceBuilder searchSourceBuilder) {
// 構建入參
SearchRequest searchRequest = new SearchRequest(esProperties.getBookdbIndex());
// searchSourceBuilder.from(from);
// searchSourceBuilder.size(pageSize);
searchSourceBuilder.trackTotalHits(true);
searchRequest.source(searchSourceBuilder);
try {
SearchResponse searchResponse =
restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 處理搜索結果
SearchHits hits = searchResponse.getHits();
List<SearchHit> list = Arrays.asList(hits.getHits());
// 封裝數據
if (CollectionUtils.isEmpty(list)) {
log.warn("開始轉換數據docs為空");
return Collections.emptyList();
}
// 將 docs 集合轉換為一個流,以便進行流式操作
List<BookDb> datas =
list.stream()
.map(hit -> docToModel(hit))
.collect(Collectors.toList());
log.info("BookDb, 將es數據轉為BookDb結果:{}", datas);
return datas;
} catch (Exception e) {
log.error("pageQuery searchRequest:{}, error:", searchRequest, e);
}
return null;
}
public BookDb docToModel(SearchHit searchHit) {
if (null == searchHit) {
return null;
}
String json = searchHit.getSourceAsString();
log.info("原始json:{}", json);
if (StringUtils.isBlank(json)) {
return null;
}
return JSON.parseObject(json, BookDb.class);
}
public static BoolQueryBuilder searchCondition(List<String> appIds) {
if (CollectionUtils.isNotEmpty(appIds)) {
return QueryBuilders.boolQuery()
.must(QueryBuilders.idsQuery().addIds(appIds.toArray(new String[] {})));
}
return null;
}
}
2. RestHighLevelClient獲取
2.1 es配置
# es
spring.elastic.host=localhost
spring.elastic.port=9200
spring.elastic.user=elastic
spring.elastic.password=elastic
spring.elastic.bookdbIndex=bookdb
2.2 配置類
package com.niewj.ssdemo.config.es;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "spring.elastic")
@Data
public class EsProperties {
private String host;
private String user;
private String password;
private int port;
private String type = "_doc";
private String index;
private String bookdbIndex;
}
2.3 獲取client
package com.niewj.ssdemo.config.es;
import javax.annotation.Resource;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(EsProperties.class)
public class EsConfig {
@Resource private EsProperties esProperties;
@Bean
@ConditionalOnMissingBean(RestHighLevelClient.class)
public RestHighLevelClient restHighLevelClient() {
return new RestHighLevelClient(
RestClient.builder(new HttpHost(esProperties.getHost(), esProperties.getPort(), "http"))
.setHttpClientConfigCallback(
httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(init())));
}
private CredentialsProvider init() {
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
AuthScope.ANY,
new UsernamePasswordCredentials(esProperties.getUser(), esProperties.getPassword()));
return credentialsProvider;
}
}