Elasticsearch-Rest-Client:官方 RestClient,封装了 ES 操作,API 层次分明,上手简单
创建springboot2.1.8的项目
pom添加
<properties>
<java.version>1.8</java.version>
<!--修改springboot自带的es操作jar版本-->
<elasticsearch.version>7.6.2</elasticsearch.version>
</properties>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.2</version>
</dependency>
编写config
import org.apache.http.HttpHost;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GulimallElasticSearchConfig {
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
@Bean
public RestHighLevelClient esRestClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));
return client;
}
}
编写测试类
创建索引
PUT /demo81
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_smart"
},
"tag": {
"type": "keyword"
},
"publishTime": {
"type": "date"
}
}
}
}
创建实体类
import lombok.Data;
@Data
public class News {
private String title;
private String tag;
private String publishTime;
}
新增
//单条新增
@Test
public void addOneNews(){
IndexRequest indexRequest = new IndexRequest(INDEX81);
News news = new News();
news.setTitle("中国产小型无人机的“对手”来了,俄微型拦截导弹便宜量又多");
news.setTag("军事");
news.setPublishTime("2018-01-24T23:59:30Z");
String source = JSON.toJSONString(news);
indexRequest.source(source, XContentType.JSON);
try {
IndexResponse index = client.index(indexRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
log.info("新插入的文档ID={}",index.getId());//4Vfv5H0BuTWvfHkM4Wf5
} catch (IOException e) {
e.printStackTrace();
}
}
批量新增
//批量新增
@Test
public void batchAddNews(){
BulkRequest bulkRequest = new BulkRequest();
List<IndexRequest> requests = generateRequests();
for (IndexRequest indexRequest : requests) {
bulkRequest.add(indexRequest);
}
try {
BulkResponse bulk = client.bulk(bulkRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
if(bulk==null){
return;
}
BulkItemResponse[] items = bulk.getItems();
for(BulkItemResponse bulkItemResponse:items){
log.info("新插入的文档ID={}",bulkItemResponse.getId());
}
} catch (IOException e) {
e.printStackTrace();
}
}
public List<IndexRequest> generateRequests(){
List<IndexRequest> requests = new ArrayList<>();
requests.add(generateNewsRequest("中印边防军于拉达克举行会晤 强调维护边境和平", "军事", "2018-01-27T08:34:00Z"));
requests.add(generateNewsRequest("费德勒收郑泫退赛礼 进决赛战西里奇", "体育", "2018-01-26T14:34:00Z"));
requests.add(generateNewsRequest("欧文否认拿动手术威胁骑士 兴奋全明星联手詹皇", "体育", "2018-01-26T08:34:00Z"));
requests.add(generateNewsRequest("皇马官方通告拉莫斯伊斯科伤情 将缺阵西甲关键战", "体育", "2018-01-26T20:34:00Z"));
return requests;
}
public IndexRequest generateNewsRequest(String title, String tag, String publishTime){
IndexRequest indexRequest = new IndexRequest(INDEX81);
News news = new News();
news.setTitle(title);
news.setTag(tag);
news.setPublishTime(publishTime);
String source = JSON.toJSONString(news);
indexRequest.source(source, XContentType.JSON);
return indexRequest;
}
查询
//查询
@Test
public void queryNews(){
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.from(0);
sourceBuilder.size(10);
sourceBuilder.fetchSource(new String[]{"title"},new String[]{});
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title","费德勒");
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("tag","体育");
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("publishTime");
rangeQueryBuilder.gte("2018-01-26T08:00:00Z");
rangeQueryBuilder.lte("2018-01-26T20:00:00Z");
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(matchQueryBuilder);
boolQueryBuilder.must(termQueryBuilder);
boolQueryBuilder.must(rangeQueryBuilder);
sourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.source(sourceBuilder);
try {
SearchResponse search = client.search(searchRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
log.info("查询返回结果是:{}",search);
} catch (IOException e) {
e.printStackTrace();
}
}
更新
//更新 id=41f05H0BuTWvfHkMoWf1
@Test
public void updateNewsById(){
String id="41f05H0BuTWvfHkMoWf1";
UpdateRequest updateRequest = new UpdateRequest(INDEX81,id);
Map<String,String> map = new HashMap<>();
map.put("tag","网球");
updateRequest.doc(JSON.toJSONString(map),XContentType.JSON);
try {
UpdateResponse updateResponse = client.update(updateRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
log.info("更新返回结果是:{}",updateResponse);
} catch (IOException e) {
e.printStackTrace();
}
}
删除
//删除
@Test
public void deleteNewsById(){
DeleteRequest deleteRequest = new DeleteRequest(INDEX81,"4Vfv5H0BuTWvfHkM4Wf5");
try {
DeleteResponse delete = client.delete(deleteRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
log.info("删除的返回信息是:{}",delete);
} catch (IOException e) {
e.printStackTrace();
}
}