zoukankan      html  css  js  c++  java
  • Elasticsearch的java客户端JEST的操作

    准备

    把Elasticsearch安装好

    安装百度上有很多资料。

    导入必要的包

     <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.3.RELEASE</version>
        </parent>
    <dependency>
                <groupId>net.java.dev.jna</groupId>
                <artifactId>jna</artifactId>
                <version>4.2.2</version>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>2.4.6</version>
            </dependency>
            <dependency>
                <groupId>io.searchbox</groupId>
                <artifactId>jest</artifactId>
                <version>2.0.4</version>
            </dependency>
    

    实体类

    @Data
    public class ArticleDTO implements Serializable {
        private Integer id;
        private String authorId;
        private String articleId;
        private String title;
        private String content;
        private Integer status;
    }
    

    Elasticsearch的Search

    最好先了解一下:
    Elasticsearch的Search详解

    JEST的相关操作

    • 发现这个客户端工具使用了大量的构造器模式。
    • 这么多的构造器的抽象都是针对于ES中的概念和查询语法抽象出来的,所以对ES客户端的理解要结合查询语言。
     package com.ztjy.es;
    
    import com.ztjy.demo.model.ArticleDTO;
    import com.ztjy.demo.service.ArticleService;
    import com.ztjy.demo.service.search.JestClientServer;
    import com.ztjy.tool.RandomUtils;
    import io.searchbox.client.JestClient;
    import io.searchbox.client.JestClientFactory;
    import io.searchbox.client.JestResult;
    import io.searchbox.client.config.HttpClientConfig;
    import io.searchbox.core.*;
    import io.searchbox.indices.DeleteIndex;
    import lombok.extern.log4j.Log4j2;
    import org.elasticsearch.index.query.BoolQueryBuilder;
    import org.elasticsearch.index.query.MatchQueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.search.aggregations.AggregationBuilders;
    import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
    import org.elasticsearch.search.builder.SearchSourceBuilder;
    import org.elasticsearch.search.sort.SortOrder;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Log4j2
    public class TestEs {
        public static final String INDEX_NAME = "test_index_ws";
        public static final String TYPE_NAME = "my_type";
        public static final String TYPE_NAME2 = "my_type2";
        public static final String URI = "http://172.16.200.17:9200";
    
        @Autowired
        private JestClientServer jestClientServer;
        @Autowired
        private ArticleService articleService;
        //删除index下的所有
    
        /**
         * 创建index/type/document
         * <p>单个</p>
         */
        @Test
        public  void testCreateIndex(){
            ArticleDTO article = createArticle(1000);
            addOrUpdateIndex(article);
        }
    
        /**
         * 删除index里面的document全部清除了
         */
        @Test
        public void testDeleteIndex(){
            DeleteIndex deleteIndex = new DeleteIndex.Builder(INDEX_NAME).build();
            JestClient jestClient = createClient();
            try {
                JestResult result = jestClient.execute(deleteIndex);
                log.info("执行结果:{}",result.isSucceeded());
                log.info("返回记过:{}",result.getSourceAsString());
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 测试修改index
         */
        @Test
        public void testUpdateIndex(){
            ArticleDTO article = createArticle(1000);
            article.setTitle(article.getTitle()+"3333!");
            addOrUpdateIndex(article);
        }
    
        /**
         * 测试批量添加index
         */
        @Test
        public void testBulkIndex(){
            bulkIndex();
        }
    
        /**
         * 测试批量删除index
         */
        @Test
        public void testbulkDeleteIndex(){
            bulkDeleteIndex();
        }
    
        /**
         * 删除单个index
         */
        @Test
        public void deleteSigleIndex(){
            deleteSingeIndex();
        }
    
        /**
         * 测试获取单个index
         */
        @Test
        public void testGetIndex(){
            getSingleIndex();
        }
    
        /**
         * 根据条件,分页查询
         *
         *
         */
        @Test
        public void testQueryByTypeAndIds(){
            QueryByTypeAndIds();
        }
    
        @Test
        public void testQueryByCnd(){
            /**
             *{
             *   "query" : {
             *     "match" : {//对应着各种类型的QueryBuilder,这里的类型是短语匹配
             *       "title" : {
             *         "query" : "宝爸给孩子",
             *         "type" : "phrase"
             *       }
             *     }
             *   }
             * }
             * //SearchSourceBuilder对应着查询json结构的最外层(from,size,query,post_filter,sort,aggs)
             * //QueryBuilder对应着各种过滤条件:精确搜索,布尔,范围
             *{
             *   "from" : 0,
             *   "size" : 5,
             *   "query" : {
             *     "match" : {
             *       "title" : {
             *         "query" : "宝爸给孩子",
             *         "type" : "phrase"
             *       }
             *     }
             *   },
             *   "post_filter" : {
             *     "bool" : {
             *       "must" : [ {
             *         "term" : {
             *           "status" : 6
             *         }
             *       }, {
             *         "range" : {
             *           "id" : {
             *             "from" : null,
             *             "to" : 500,
             *             "include_lower" : true,
             *             "include_upper" : true
             *           }
             *         }
             *       }, {
             *         "terms" : {
             *           "title" : [ "护士" ]
             *         }
             *       } ],
             *       "_name" : "title"
             *     }
             *   },
             *   "sort" : [ {
             *     "id" : {
             *       "order" : "desc"
             *     }
             *   } ]
             * }
             *
             *
             */
            SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
    
            MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "宝爸给孩子");
    
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
                    .must(QueryBuilders.termQuery("status", 6))
                    .must(QueryBuilders.rangeQuery("id").lte(500))
                    .must(QueryBuilders.termsQuery("title","护士"));
            searchSourceBuilder.from(0).
                                size(5).
                                sort("id", SortOrder.DESC).
                                postFilter(boolQueryBuilder).
                                query(matchQueryBuilder);
            //聚合
            TermsBuilder status = AggregationBuilders.terms("group_by_tatus").field("status");
            searchSourceBuilder.aggregation(status);
    
            Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(INDEX_NAME).addType(TYPE_NAME).build();
    
            JestClient jestClient = createClient();
            try {
                SearchResult searchResult = jestClient.execute(search);
                log.info("执行结果{}",searchResult.isSucceeded());
                List<SearchResult.Hit<ArticleDTO, Void>> hitList = searchResult.getHits(ArticleDTO.class);
                hitList.stream().map((hit)-> hit.source).forEach((article)->{
                    System.out.println(article);
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 查询多个type下和指定集合去查询
         *
         */
        private void QueryByTypeAndIds() {
            SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
    
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    
            String [] ids=new String[]{"1","2","3","4","5"};
            String [] types=new String[]{TYPE_NAME,TYPE_NAME2};
    
            boolQueryBuilder.must(QueryBuilders.idsQuery(types).addIds(ids));
            searchSourceBuilder.query(boolQueryBuilder);
    
            Search search=new Search.Builder(searchSourceBuilder.toString()).build();
            JestClient jestClient = createClient();
            try {
                SearchResult searchResult = jestClient.execute(search);
                log.info("执行结果{}",searchResult.isSucceeded());
                List<SearchResult.Hit<ArticleDTO, Void>> hitList = searchResult.getHits(ArticleDTO.class);
                for (SearchResult.Hit<ArticleDTO, Void> hit:hitList) {
                    ArticleDTO article = hit.source;
                    log.info(article);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        private void getSingleIndex() {
            Get get = new Get.Builder(INDEX_NAME, "23726").type(TYPE_NAME).build();
            JestClient jestClient = createClient();
            try {
                DocumentResult documentResult = jestClient.execute(get);
                log.info("执行结果{}",documentResult.isSucceeded());
                ArticleDTO articleDTO = documentResult.getSourceAsObject(ArticleDTO.class);
                log.info("查询的值{}",articleDTO.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
    
    
        private void deleteSingeIndex() {
            Delete delete = new Delete.Builder("AW1xUehNzfOadqqIiWnt").index(INDEX_NAME).type(TYPE_NAME).build();
            JestClient client = createClient();
            try {
                DocumentResult documentResult = client.execute(delete);
                log.info("是否添加成功:{}",documentResult.isSucceeded());
                log.info("结果:{}",documentResult.getJsonString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        private void bulkDeleteIndex(){
            Bulk.Builder bulk = new Bulk.Builder();
            List<String> articleIds =new ArrayList<>(100);
            articleIds.add("21082");
            articleIds.add("21191");
            articleIds.add("22053");
            articleIds.add("20761");
            articleIds.add("21038");
            for(String id:articleIds){
                Delete delete = new Delete.Builder(id).index(INDEX_NAME).type(TYPE_NAME).build();
                bulk.addAction(delete);
            }
            try {
                JestClient jestClient = createClient();
                BulkResult result = jestClient.execute(bulk.build());
                if (result != null && result.isSucceeded()){
                    log.info("ES 批量删除完成");
                    log.info("=====================>result:{}.",result.getJsonString());
                }else{
                    log.error("=====================>result:{}.",result.getJsonString());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
    
        private void addOrUpdateIndex(ArticleDTO article) {
            try {
                Index.Builder indexBuilder=new Index.Builder(article);
                indexBuilder.index(INDEX_NAME).type(TYPE_NAME).id(String.valueOf(article.getId()));
                Index index = indexBuilder.build();
    
                JestClient jsClient = createClient();
                DocumentResult result = jsClient.execute(index);
    
                log.info("是否添加成功:{}",result.isSucceeded());
                log.info("结果:{}",result.getJsonString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void bulkIndex(){
            Bulk.Builder bulk = new Bulk.Builder();
            List<ArticleDTO> listArticle = getListArticle();
            Iterator<ArticleDTO> iterator = listArticle.iterator();
            while (iterator.hasNext()){
                ArticleDTO article = iterator.next();
                Index index = new Index.Builder(article).id(String.valueOf(article.getId())).index(INDEX_NAME).type(TYPE_NAME).build();
                bulk.addAction(index);
            }
            try {
                JestClient jestClient = createClient();
                BulkResult result = jestClient.execute(bulk.build());
                if (result != null && result.isSucceeded()){
                    log.info("ES 批量插入完成");
                    log.info("=====================>result:{}.",result.getJsonString());
                }else{
                    log.error("=====================>result:{}.",result.getJsonString());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
    
    
        private ArticleDTO createArticle(int id) {
            ArticleDTO articleDTO=new ArticleDTO();
            articleDTO.setId(id);
            articleDTO.setArticleId(String.valueOf(id*100));
            articleDTO.setAuthorId(String.valueOf(id*1000));
            articleDTO.setTitle("折腾三天生下9斤男婴,宝爸给孩子取了88画名字,护士直接笑哭");
            articleDTO.setContent("小静上个星期刚顺产生下一名男婴,当时这个孩子折腾了她快三天三夜才成功生下来。可把小静给疼到生无绝恋了,最后孩子出生后足足有9斤重。");
            articleDTO.setStatus(RandomUtils.randomInt(10));
            return articleDTO;
        }
    
        private List<ArticleDTO> getListArticle(){
          List<ArticleDTO> articleDTOS=new ArrayList<>(100);
          for (int i =0;i<100;i++){
                articleDTOS.add(createArticle(i+1));
          }
          return articleDTOS;
        }
    
    
        private JestClient createClient() {
            JestClientFactory factory = new JestClientFactory();
            factory.setHttpClientConfig(new HttpClientConfig.Builder(URI)
                    .multiThreaded(true)
                    .build());
            JestClient client = factory.getObject();
            return client;
        }
    }
    
    
  • 相关阅读:
    “零接触”新需求,如何快速实现体温检测数字化管控方案?
    AR公共安全及应急指挥中的应用 | TVP思享
    当模板方法遇到了委托函数,你的代码又可以精简了
    为什么要用内插字符串代替string.format
    如何让多个不同类型的后端网站用一个nginx进行反向代理实际场景分析
    8天入门docker系列 —— 第八天 让程序跑在swarm集群上
    8天入门docker系列 —— 第七天 让你的container实现跨主机访问
    8天入门docker系列 —— 第六天 搭建自己的私有镜像仓库Registry
    8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署
    8天入门docker系列 —— 第四天 使用aspnetcore小案例熟悉端口映射和挂载目录
  • 原文地址:https://www.cnblogs.com/wangsen/p/11607877.html
Copyright © 2011-2022 走看看