• ElasticSearch基础 java操作es归纳


    java操作es有2种方式:

    1.通过9300端口 tcp ransport-api.jar 但不能适配版本 不建议使用

    2.通过9200端口 http Elasticsearch-Rest-Client 官方restclient 建议使用

    导入依赖

    //导入依赖
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.4.2</version>
    </dependency>
    //导入的版本与es版本一致7.4.2
    //打开maven插件看dependencies中管理的依赖es版本是7.9.3
    //因为springboot已经对es的版本做了管理 xml重写下es版本
    
        <properties>
            <java.version>1.8</java.version>
            <elasticsearch.version>7.4.2</elasticsearch.version>
        </properties>
    
    springboot中es版本也改过来了

    配置es

    //类似数据库dao配置 代码通用的
    
    @Configuration
    public class GuliESConfig {
    
        public static final RequestOptions COMMON_OPTIONS;
    
        static {
            RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
            COMMON_OPTIONS = builder.build();
        }
    
        @Bean
        public RestHighLevelClient esRestClient() {
            RestClientBuilder builder = null;
            // 可以指定多个es
            builder = RestClient.builder(new HttpHost("192.168.112.151", 9200, "http")
    //                ,new HttpHost("host", 9200, "http")
            );
            RestHighLevelClient client = new RestHighLevelClient(builder);
            return client;
        }
    
    }
    
    //其它代码用到es注入就行了
        @Autowired
        private RestHighLevelClient esRestClient;

    java es保存测试  IndexRequest

       @Autowired
        private RestHighLevelClient esRestClient; 
      /**
         *  保存数据
         * @throws IOException
         */
        @Test
        void indexData() throws IOException{
            //设置保存的索引和id
            IndexRequest indexRequest = new IndexRequest("users");
            indexRequest.id("1");
    
            //保存的数据 这里指定json类型
            indexRequest.source("{"test":1}", XContentType.JSON);
    
            //执行保存 index同步 indexAsync异步
            IndexResponse index = esRestClient.index(indexRequest, GuliESConfig.COMMON_OPTIONS);
            System.out.println(index);
        }

    java es 检索测试 SearchRequest

    相当查询 "query": { "match": { "address": "Mill" } }

        @Test
        public void find() throws IOException {
            // 1 创建检索请求
            SearchRequest searchRequest = new SearchRequest();
            searchRequest.indices("bank");
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            // 构造检索条件
    //        sourceBuilder.query();
    //        sourceBuilder.from();
    //        sourceBuilder.size();
    //        sourceBuilder.aggregation();
            sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
            System.out.println(sourceBuilder.toString());
    
            searchRequest.source(sourceBuilder);
    
            // 2 执行检索
            SearchResponse response = esRestClient.search(searchRequest, GuliESConfig.COMMON_OPTIONS);
            // 3 分析响应结果
            System.out.println(response.toString());
        }

    查询结果转为bean

            // 3.1 获取java bean   Account是bean类
            SearchHits hits = response.getHits();
            SearchHit[] hits1 = hits.getHits();
            for (SearchHit hit : hits1) {
                hit.getId();
                hit.getIndex();
                String sourceAsString = hit.getSourceAsString();
                Account account = JSON.parseObject(sourceAsString, Account.class);
                System.out.println(account);
            }

    聚合检索测试 

    搜索address中包含mill的所有人的年龄分布以及平均年龄,平均薪资

    GET bank/_search
    {
      "query": {
        "match": {
          "address": "Mill"
        }
      },
      "aggs": {
        "ageAgg": {
          "terms": {
            "field": "age",
            "size": 10
          }
        },
        "ageAvg": {
          "avg": {
            "field": "age"
          }
        },
        "balanceAvg": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }

    java代码测试如下

        /**
         * 聚合检索
         * @throws IOException
         */
        @Test
        public void jhfind() throws IOException {
            // 1 创建检索请求
            SearchRequest searchRequest = new SearchRequest();
            searchRequest.indices("bank");
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            // 构造检索条件
    //        sourceBuilder.query();
    //        sourceBuilder.from();
    //        sourceBuilder.size();
    //        sourceBuilder.aggregation();
            sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
            //AggregationBuilders工具类构建AggregationBuilder
            // 构建第一个聚合条件:按照年龄的值分布
            TermsAggregationBuilder agg1 = AggregationBuilders.terms("agg1").field("age").size(10);// 聚合名称
    // 参数为AggregationBuilder
            sourceBuilder.aggregation(agg1);
            // 构建第二个聚合条件:平均薪资
            AvgAggregationBuilder agg2 = AggregationBuilders.avg("agg2").field("balance");
            sourceBuilder.aggregation(agg2);
    
            System.out.println("检索条件"+sourceBuilder.toString());
    
            searchRequest.source(sourceBuilder);
    
            // 2 执行检索
            SearchResponse response = esRestClient.search(searchRequest, GuliESConfig.COMMON_OPTIONS);
            // 3 分析响应结果
            System.out.println(response.toString());
        }

    检索结果处理

    // 3.2 获取检索到的分析信息
    //实际测试检索结果aggregations下名称不是"agg2"而是"avg#agg2"  不是"agg1"而是"lterms#agg1" 暂不知道是什么原因 先记录着
    Aggregations aggregations = response.getAggregations();
    Terms agg21 = aggregations.get("agg2"); //"avg#agg2"  
    for (Terms.Bucket bucket : agg21.getBuckets()) {
        String keyAsString = bucket.getKeyAsString();
        System.out.println(keyAsString);
    }
  • 相关阅读:
    CodeForces 796D bfs
    2017 UESTC Training for Graph Theory
    CodeForces 776D 2-SAT
    CodeForces 776E 数学规律,欧拉
    希尔排序
    怎么把大数据的二维数组转化为一维数组????
    关于while((c=getchar()))的一些应用与思考
    uva 1586 Molar mass(Uva-1586)
    uva 1585 Score(Uva-1585)
    uva1584 Circular Sequence(Uva-1584)
  • 原文地址:https://www.cnblogs.com/hbhb/p/14653695.html
Copyright © 2020-2023  润新知