ElasticSearch入门-HelloWorld版CRUD,Http Rest访问,elasticsearch,elasticsearch-rest-high-level-client

接着上1篇

ES,SpringData,SpringBoot,一些小坑和阶段性总结

https://blog.csdn.net/FansUnion/article/details/102799101

一、概述

1、放弃SpringBoot版本,自动引入

各种问题,也没看出啥优势。

2、放弃SpringData,ES封装

CrudRepository之类的封装,不是ES未来的方向了。

全面拥抱http Rest

3、ES

7.2.0版本,2019比较新的版本。一下子跟上时代。

jar版本和ES版本,尽可能匹配,避免不必要的问题。

二、Maven配置

<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->

        <dependency>

            <groupId>org.elasticsearch</groupId>

            <artifactId>elasticsearch</artifactId>

            <version>7.2.0</version>

        </dependency>

        <dependency>

            <groupId>org.elasticsearch.client</groupId>

            <artifactId>elasticsearch-rest-high-level-client</artifactId>

            <version>7.2.0</version>

        </dependency>

三、CRUD示例

import java.io.IOException;

import java.util.List;

import org.apache.commons.lang.StringUtils;

import org.apache.http.HttpHost;

import org.elasticsearch.action.bulk.BulkRequest;

import org.elasticsearch.action.bulk.BulkResponse;

import org.elasticsearch.action.delete.DeleteRequest;

import org.elasticsearch.action.delete.DeleteResponse;

import org.elasticsearch.action.get.GetRequest;

import org.elasticsearch.action.get.GetResponse;

import org.elasticsearch.action.index.IndexRequest;

import org.elasticsearch.action.index.IndexResponse;

import org.elasticsearch.action.search.SearchRequest;

import org.elasticsearch.action.search.SearchResponse;

import org.elasticsearch.client.Node;

import org.elasticsearch.client.RequestOptions;

import org.elasticsearch.client.RestClient;

import org.elasticsearch.client.RestClientBuilder;

import org.elasticsearch.client.RestHighLevelClient;

import org.elasticsearch.client.indices.CreateIndexRequest;

import org.elasticsearch.common.xcontent.XContentType;

import org.elasticsearch.index.query.QueryBuilders;

import org.elasticsearch.search.SearchHit;

import org.elasticsearch.search.SearchHits;

import org.elasticsearch.search.builder.SearchSourceBuilder;

import com.alibaba.fastjson.JSONObject;

import com.google.common.collect.Lists;

import lombok.extern.slf4j.Slf4j;

@Slf4j

public class EsKit {

    public static void main(String[] args) {

        //实体类

        EsUser esUser =new EsUser();

        int id = 1;

        esUser.setId(id);

        esUser.setName("fansunion");

        EsUser esUser2 =new EsUser();

        int id2 = 2;

        esUser2.setId(id2);

        esUser2.setName("sugar");

        //新增

        //Invalid index name [esUser], must be lowercase

        String indexName="demo_esuser";

        EsKit.add(indexName, esUser);

        EsKit.add(indexName, esUser2);

        //查询

        EsUser getUser=EsKit.get(indexName, id,EsUser.class);

        log.info("getUser={}",getUser);

        List<EsUser> userList=EsKit.search(indexName,"fansunion", EsUser.class);

        log.info("userList={}",userList);

        //删除

        EsKit.delete(indexName, id);

        //删除之后,应该为null

        EsUser getUserAfterDelete=EsKit.get(indexName, id,EsUser.class);

        log.info("删除之后,应该为null:{}",getUserAfterDelete);

    }

     

    //TODO 封装常用和通用的查询

    public static <T> List<T> search(String indexName,String name,Class<T> clazz){

        SearchRequest searchRequest = new SearchRequest(indexName);

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //termQuery是相同比较

        sourceBuilder.query(QueryBuilders.termQuery("name", name));

        sourceBuilder.from(0);

        sourceBuilder.size(10);

        //将请求体加入到请求中

        searchRequest.source(sourceBuilder);

        List<T> list = Lists.newArrayList();

        try {

            SearchResponse searchResponse = getClient().search(searchRequest, RequestOptions.DEFAULT);

            SearchHits hits = searchResponse.getHits();

            SearchHit[] searchHits = hits.getHits();

            for (SearchHit hit : searchHits) {

                String jsonStr = hit.getSourceAsString();

                log.info("search -> " + jsonStr);

                list.add(JSONObject.parseObject(jsonStr,clazz));

            }

        catch (IOException e) {

            e.printStackTrace();

        }

        return list;

    }

     

     

    public static <T> T get(String indexName, Integer id,Class<T> clazz) {

        T model=null;

        try {

            GetRequest getRequest = new GetRequest(indexName, id+"");

            RequestOptions options = RequestOptions.DEFAULT;

            GetResponse getResponse = getClient().get(getRequest, options);

            log.info("elastic 查询成功,getResponse={}", getResponse);

            String jsonStr= getResponse.getSourceAsString();

            if(StringUtils.isNotEmpty(jsonStr)){

                model =  JSONObject.parseObject(jsonStr,clazz);

            }

        catch (Exception e) {

            e.printStackTrace();

        }

        return model;

    }

    //add已经足够了,还有必要用UpdateRequest?

    public  static IndexResponse add(String indexName, EsUser esUser) {

        try {

            IndexRequest request = new IndexRequest(indexName);

            String jsonString = JSONObject.toJSONString(esUser);

            request.index(indexName).id(String.valueOf(esUser.getId())).source(jsonString, XContentType.JSON);

            IndexResponse response = getClient().index(request, RequestOptions.DEFAULT);

            log.info("elastic 索引新增成功,response={}", response);

            return response;

        catch (Exception e) {

            e.printStackTrace();

            log.error("索引数据变更失败", e);

        }

        return null;

    }

    public  static BulkResponse batchAdd(String indexName, List<EsUser> esUserList) {

        try {

            BulkRequest bulkRequest = new BulkRequest();

            IndexRequest request = null;

            for (EsUser esUser : esUserList) {

                request = new IndexRequest(indexName);

                request.index(indexName).id(esUser.getId() + "").source(XContentType.JSON,esUser);

                bulkRequest.add(request);

            }

            BulkResponse response = getClient().bulk(bulkRequest, RequestOptions.DEFAULT);

            return response;

        catch (Exception e) {

            log.error("批量插入索引失败", e);

        }

        return null;

    }

    public  static DeleteResponse delete(String indexName, Integer id) {

        try {

            DeleteRequest request = new DeleteRequest(indexName);

            request.index(indexName).id(id + "");

            DeleteResponse response = getClient().delete(request, RequestOptions.DEFAULT);

            log.info("elastic 索引删除成功,response={}", response);

            return response;

        catch (Exception e) {

            e.printStackTrace();

            log.error("索引数据变更失败", e);

        }

        return null;

    }

    // 索引创建------目前没用(直接添加数据)

    public  static void createEsIndex(String indexName, String settings, String mappings) {

        try {

            CreateIndexRequest request = new CreateIndexRequest(indexName);

            buildSetting(request, settings);

            buildIndexMapping(request, mappings);

            getClient().indices().create(request, RequestOptions.DEFAULT);

            log.info("索引创建成功");

        catch (Exception e) {

            log.error("索引创建失败:{}", e);

        }

    }

    /**

     * 设置分片

     *

     * @param request

     */

    private  static void buildSetting(CreateIndexRequest request, String settings) {

        request.settings(settings, XContentType.JSON);

    }

    /**

     * 设置索引的mapping

     *

     * @param request

     */

    private  static void buildIndexMapping(CreateIndexRequest request, String mappings) {

        request.mapping(mappings, XContentType.JSON);

    }

    private static RestHighLevelClient restHighLevelClient;

    public static RestHighLevelClient getClient() {

        if (restHighLevelClient != null) {

            return restHighLevelClient;

        }

        RestClientBuilder clientBuilder = RestClient.builder(new HttpHost("192.168.162.239"9200"http"));

        // 设置监听器,每次节点失败都可以监听到,可以作额外处理

        clientBuilder.setFailureListener(new RestClient.FailureListener() {

            public void onFailure(Node node) {

                super.onFailure(node);

            }

        });

        restHighLevelClient = new RestHighLevelClient(clientBuilder);

        return restHighLevelClient;

    }

}

四、执行结果

2019-10-29 19:46:55.338 [demo] [main] INFO [demo.component.es.rest.EsKit] -elastic 索引新增成功,response=IndexResponse[index=demo_esuser,type=_doc,id=1,version=1,result=created,seqNo=15,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]

2019-10-29 19:46:55.520 [demo] [main] INFO [demo.component.es.rest.EsKit] -elastic 索引新增成功,response=IndexResponse[index=demo_esuser,type=_doc,id=2,version=3,result=updated,seqNo=16,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]

2019-10-29 19:46:55.565 [demo] [main] INFO [demo.component.es.rest.EsKit] -elastic 查询成功,getResponse={"_index":"demo_esuser","_type":"_doc","_id":"1","_version":1,"_seq_no":15,"_primary_term":1,"found":true,"_source":{"id":1,"name":"fansunion"}}

2019-10-29 19:46:55.633 [demo] [main] INFO [demo.component.es.rest.EsKit] -getUser=EsUser(id=1, name=fansunion)

2019-10-29 19:46:56.510 [demo] [main] INFO [demo.component.es.rest.EsKit] -search -> {"id":1,"name":"fansunion"}
2019-10-29 19:46:56.510 [demo] [main] INFO [demo.component.es.rest.EsKit] -userList=[EsUser(id=1, name=fansunion)]

2019-10-29 19:46:56.573 [demo] [main] INFO [demo.component.es.rest.EsKit] -elastic 索引删除成功,response=DeleteResponse[index=demo_esuser,type=_doc,id=1,version=2,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]

2019-10-29 19:46:56.593 [demo] [main] INFO [demo.component.es.rest.EsKit] -elastic 查询成功,getResponse={"_index":"demo_esuser","_type":"_doc","_id":"1","found":false}

2019-10-29 19:46:56.594 [demo] [main] INFO [demo.component.es.rest.EsKit] -删除之后,应该为null:null

发布了1318 篇原创文章 · 获赞 2522 · 访问量 340万+

猜你喜欢

转载自blog.csdn.net/FansUnion/article/details/102807877