Spring Boot集成ES demo
目录
基础配置
配置 RestHighLevelClient
client 对象,进行增删改查。
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.24</version>
</dependency>
配置
elasticsearch:
host: 127.0.0.1
port: 9200
配置类
config/EsConfig.java
package com.ppl.esdemo.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author ppliang
* @title: ESConfig
* @projectName es-demo2
* @description: ES 配置类
* @date 2021-09-13 16:52
*/
@Configuration
public class EsConfig {
@Value("${elasticsearch.host}")
private String host;
@Value("${elasticsearch.port}")
private int port;
@Bean
public RestHighLevelClient client(){
return new RestHighLevelClient(RestClient.builder(
new HttpHost(host,port,"http")
));
}
}
操作服务
简易逻辑:
查询条件—>查询结果---->遍历----->获取json对象----->转成类对象–>是否修改存入es
对象id 通过md5创建唯一id 通过id进行增删改
问题一:类中属性与ES中的属性名称不匹配。在属性,或get,set方法上使用注解@JSONField
Fastjson 简明教程 | 菜鸟教程 (runoob.com)
问题二:keyword字段的查询(注意是否需要 .keyword 后缀)
- 字段 trem value 精确查询
- 字段 wild
*value*
模糊查询
按照01-02操作文档:edge 安装插件: Elasticvue
创建bean.es.Twitter.java
package com.ppl.esdemo.bean.es;
/**
* @author ppliang
* @title: Twitter
* @projectName es-demo2
* @description: ES 表
* @date 2021-09-13 17:08
*/
public class Twitter {
private String authorId;
private String authorName;
private String message;
private Long createdAt;
public String getAuthorId() {
return authorId;
}
public void setAuthorId(String authorId) {
this.authorId = authorId;
}
public String getAuthorName() {
return authorName;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Long getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Long createdAt) {
this.createdAt = createdAt;
}
@Override
public String toString() {
return "Twitter{" +
"authorId='" + authorId + '\'' +
", authorName='" + authorName + '\'' +
", message='" + message + '\'' +
", createdAt=" + createdAt +
'}';
}
}
创建服务 TwitterServiceImpl.java
/**
* @author ppliang
* @title: TwitterServiceImpl
* @projectName es-demo2
* @description: Twitter 增删改查
* @date 2021-09-14 10:13
*/
@Service
public class TwitterServiceImpl implements TwitterService {
@Autowired
private RestHighLevelClient client;
@Override
public boolean addOne(Twitter _twitter) throws IOException {
IndexRequest request = new IndexRequest("twitter");
request.id(DigestUtils.md5Hex(_twitter.toString()));
request.source(JSON.toJSONString(_twitter), XContentType.JSON);
IndexResponse index = client.index(request, RequestOptions.DEFAULT);
return true;
}
@Override
public List<Twitter> select() throws IOException {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//TODO 增加查询条件
SearchRequest request = new SearchRequest("twitter");
sourceBuilder.query(boolQueryBuilder);
request.source(sourceBuilder);
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
//总数量
long value = hits.getTotalHits().value;
SearchHit[] restHits = hits.getHits();
ArrayList<Twitter> list = new ArrayList<>();
for (SearchHit restHit : restHits) {
//查询到的对象
Twitter twitter = JSON.parseObject(restHit.getSourceAsString(), Twitter.class);
list.add(twitter);
}
return list;
}
@Override
public boolean updateOne(Twitter _twitter) throws IOException {
String id=DigestUtils.md5Hex(_twitter.toString());
UpdateRequest updateRequest = new UpdateRequest("twitter",id);
updateRequest.doc(JSON.toJSONString(_twitter));
UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
return false;
}
@Override
public boolean deleteOne(Twitter _twitter) throws IOException {
String id=DigestUtils.md5Hex(_twitter.toString());
DeleteRequest deleteRequest = new DeleteRequest("twitter", id);
DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);
return false;
}
}
查询条件
boolQueryBuilder.must(QueryBuilders.termQuery(,));
boolQueryBuilder.should(QueryBuilders.termQuery(, ));
boolQueryBuilder.mustNot(QueryBuilders.termQuery(,));
termQuery("fileName",value)//term 全等
termsQuery("fileName", String... values)//trem in 属于
wildcardQuery("fileName",value) //模糊查询 通配符检索 性能较差
rangeQuery("fileName").gte(begin).lte(end);// 范围查询
sourceBuilder.sort("fileName", SortOrder.DESC); //排序 desc 逆序 asc 顺序 默认顺序
sourceBuilder.sort("fileName", SortOrder.ASC);
sourceBuilder.from(0).size(10); //从0开始 取10结果
转成查询语句:
ES 21 - Elasticsearch的高级检索语法 (包括term、prefix、wildcard、fuzzy、boost等) - 爱码网 (likecs.com)
{
"query": {
"bool": {
"must": [
{
"term": {
"author_name": "Edgar"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 10,
"sort": [],
"aggs": {}
}