java Elasticsearch-Rest-Client操作ES

389 阅读1分钟

Elasticsearch-Rest-Client:官方 RestClient,封装了 ES 操作,API 层次分明,上手简单

www.elastic.co/guide/en/el…

创建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();
    }
}