springboot整合es
环境准备
jdk 1.8
springboot 2.x
elasticsearch-6.7.0 (官网下载)
导入依赖
<!--ElasticSearch依赖-->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.7.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.7.0</version>
</dependency>`
es版本用的是6.7.0,用restHighLevelClient来操作的
配置
@Configuration
@Slf4j
public class ESConfig {
/**
* 主机,本机ip
*/
@Value("${elasticsearch.host}")
private String esHost;
/**
* 传输层端口,一般是9200,可以去elasticsearch.yml改
*/
@Value("${elasticsearch.port}")
private int esPort;
/**
* 集群名称,一般是my-application,可以去elasticsearch.yml改
*/
@Value("${elasticsearch.clustername}")
private String esClusterName;
@Bean
public RestHighLevelClient restHighLevelClient() {
log.info("开始初始化Elasticsearch");
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
RestClient.builder(new HttpHost(esHost, esPort,"http")));
return restHighLevelClient;
}
}
一些相关操作
@Resource
private RestHighLevelClient restHighLevelClient;
1.条件查询
//一般查询用BoolQueryBuilder 就够了
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//must;should;mustNot
//termQuery 是完全匹配;还有matchQuery分词查询;matchAllQuery查询全部;还有模糊查询等等
//查询指定userId,未逻辑删除的数据
boolQuery.must(QueryBuilders.termQuery("userId", userId));
boolQuery.mustNot(QueryBuilders.termQuery("isDelete", "0"));
//一个查询请求体,将query放入
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(query);
searchSourceBuilder.from(0);//分页 (pageNum-1)*pageSize
searchSourceBuilder.size(10);//分页 pageSize
searchSourceBuilder.sort("createTime", SortOrder.DESC);//排序
//一个查询请求,将请求体放入
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(index);//es上索引名,要自己建
searchRequest.types(type);//类型名
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 解析对象
List<XXXVO> voList = new ArrayList<>();
if (SUCCESS == searchResponse.status().getStatus()) {
for (SearchHit searchHit : searchResponse.getHits().getHits()) {
XXXVO xxxVO = JSON.parseObject(searchHit.getSourceAsString(), XXXVO.class);
voList.add(xxxVO);
}
}
2.批量操作
删除不知道为什么用deleteByQuery一直出错,所以我是手动先查询然后再批量删除
//批量操作的请求
BulkRequest request = new BulkRequest();
//这是查询要删的数据
SearchResponse searchResponse = searchData(index,type,query,sortName,0,0);
if (SUCCESS == searchResponse.status().getStatus()) {
// 解析对象
SearchHit[] resultHit = searchResponse.getHits().getHits();
if(resultHit.length > 0){
for (SearchHit searchHit : searchResponse.getHits().getHits()) {
//searchHit.getId()拿到每条数据的id然后新建删除请求,放入批量请求里面
request.add(new DeleteRequest(index,type,searchHit.getId()));
}
//执行批量请求
restHighLevelClient.bulk(request, RequestOptions.DEFAULT);;
}
}
3.搜索推荐
一般有用户输入某个词然后会查询是否有相关推荐词
//比如我输入二次元,然后去某个索引下某个字段去搜索是否有相关词语来推荐
//title字段
CompletionSuggestionBuilder completionSuggestionBuilder = new CompletionSuggestionBuilder("title");
//前缀匹配,可能会搜出"二次元*****"
completionSuggestionBuilder.prefix("二次元");
//这里的mySuggestion可以随意取值,但是拿到SearchResponse后是根据这个值来解析相应的推荐结果
//可以加多个推荐,在后面继续addSuggestion就行了
SuggestBuilder suggestBuilder = new SuggestBuilder().addSuggestion("mySuggestion", completionSuggestionBuilder);
//查询请求
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.suggest(suggest);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(index);//索引名
searchRequest.types(type);//类型名
searchRequest.source(searchSourceBuilder);
//结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
List<String> resultList = new ArrayList<>();//将推荐结果保存到list
if (SUCCESS == suggestResponse.status().getStatus()) {
Suggest suggest = suggestResponse.getSuggest();
if (suggest != null) {
Suggest.Suggestion suggestion = suggest.getSuggestion("mySuggestion");
List<Suggest.Suggestion.Entry> entry = suggestion.getEntries();
List<Suggest.Suggestion.Entry.Option> optionList = entry.get(0).getOptions();
for (Suggest.Suggestion.Entry.Option option : optionList) {
resultList.add(option.getText().toString());
}
}
}