• elasticsearch api 调用


    elasticsearch

    说明

    请先看理论知识, 再看代码, 事半功倍! 有些代码的测试数据可能不全, 旨在理解API的调用, 所以…

    下载安装 elasticsearch

    这里下载安装的版本是 elasticsearch-7.8.0

    依赖
       <dependencies>
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>7.8.0</version>
            </dependency>
            <!-- elasticsearch 的客户端 -->
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>elasticsearch-rest-high-level-client</artifactId>
                <version>7.8.0</version>
            </dependency>
    
            <!-- elasticsearch 依赖 2.x 的 log4j -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>2.8.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.8.2</version>
            </dependency>
            <!-- junit 单元测试 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
    		<!-- 一个小而全的Java工具类库(推荐使用) -->
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.8.3</version>
            </dependency>
        </dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    初始化 es 客户端
        @Test
        public void initESClient() throws IOException {
            //创建 es 客户端
            RestHighLevelClient esClient = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http"))
            );
    		//业务代码区 -- begin
            //TODO
    		//业务代码区 -- end
            //关闭 es 客户端
            esClient.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    创建索引
        @Test
        public void createIndex() throws IOException {
            RestHighLevelClient esClient = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http"))
            );
            //使用 CreateIndexRequest 创建 user 索引
            CreateIndexRequest request = new CreateIndexRequest("user");
            CreateIndexResponse response = esClient.indices().create(request, RequestOptions.DEFAULT);
            boolean acknowledged = response.isAcknowledged();
            System.out.println("索引创建" + (acknowledged?"成功!":"失败!"));
            esClient.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    查看索引
        @Test
        public void getIndex() throws IOException {
            RestHighLevelClient esClient = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http"))
            );
            //查看 user 索引
            GetIndexRequest request = new GetIndexRequest("user");
            GetIndexResponse response = esClient.indices().get(request, RequestOptions.DEFAULT);
            System.out.println("aliases: " + response.getAliases());
            System.out.println("mappings: " + response.getMappings());
            System.out.println("settings: " + response.getSettings());
            esClient.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    删除索引
        @Test
        public void delete() throws IOException {
            RestHighLevelClient esClient = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http"))
            );
            DeleteIndexRequest request = new DeleteIndexRequest("car");
            AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);
            boolean acknowledged = response.isAcknowledged();
            System.out.println("删除索引" + (acknowledged?"成功!":"失败!"));
            esClient.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    创建文档
    //单条新增&循环新增
    @Test
    public void createDocument() throws IOException {
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
        //单条新增
        /*IndexRequest request = new IndexRequest("student").id("1001");
            request.source(JSONUtil.toJsonStr(new Student("1001", "1001", 1001, 1001)), XContentType.JSON);
            IndexResponse response = client.index(request, RequestOptions.DEFAULT);
            System.out.println(response.getId());
            System.out.println(response.getResult());
            System.out.println(response.getIndex());
            System.out.println(response.getType());
            System.out.println(response.getVersion());*/
        //循环新增
        List<String> list = Arrays.asList("1001_蔡卓妍_38_女", "1002_杨幂_36_女", "1003_赵丽颖_32_女", "1004_高圆圆_40_女", "1005_江莱_37_女");
        for (String item : list) {
            String[] split = item.split("_");
            //id 可以设置自定义id, 不设置的话 es 将自动生成id
            IndexRequest request = new IndexRequest().index("user").id(split[0]);
            request.source(JSONUtil.toJsonStr(new User(split[0], split[1], Integer.parseInt(split[2]), split[3])), XContentType.JSON);
            IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
            System.out.println("_index:" + response.getIndex());
            System.out.println("_id:" + response.getId());
            System.out.println("_result:" + response.getResult());
            System.out.println("------------------------------------");
        }
        esClient.close();
    }
    	
       //批量新增
        @Test
        public void createDoc() throws IOException{
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            //批量新增
            BulkRequest request = new BulkRequest();
            List<Integer> list = Arrays.asList(1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009);
            for (Integer integer : list) {
                request.add(new IndexRequest().index("student").id(integer.toString()).source(JSONUtil.toJsonStr(new Student(integer.toString(),integer.toString(), integer, integer)), XContentType.JSON));
            }
            BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
            System.out.println("took:" + responses.getTook());
            System.out.println("items:" + responses.getItems());
            client.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    通过id查看文档
    @Test
        public void getDocument() throws IOException {
            RestHighLevelClient esClient = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http"))
            );
            String indexName = "user";
            List<String> list = Arrays.asList("1001_蔡卓妍_38_女", "1002_杨幂_36_女", "1003_赵丽颖_32_女", "1004_高圆圆_40_女", "1005_江莱_37_女");
            for (String item : list) {
                String[] split = item.split("_");
                GetRequest request = new GetRequest().index(indexName).id(split[0]);
                GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
                System.out.println("id: " + response.getId());
                System.out.println("index: " + response.getIndex());
                System.out.println("type: " + response.getType());
                System.out.println("source: " + response.getSource());
                System.out.println("version: "+ response.getVersion());
                System.out.println("----------------------------------");
            }
            esClient.close();
        }
    
    	//查看索引下所有数据
        @Test
        public void queryAllData() throws Exception{
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            SearchRequest searchRequest = new SearchRequest("student");
            searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
            SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println(response.getTook());
            SearchHits hits = response.getHits();
            System.out.println(hits.getTotalHits());
            for (SearchHit hit : hits) {
                System.out.println(hit.getSourceAsString());
            }
            client.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    修改文档
    //tips: 修改数据的某个属性; 数据所有属性都要修改, 设置即可, 原数据将被覆盖;
    @Test
    public void updateDocument() throws IOException {
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
        UpdateRequest request = new UpdateRequest().index("user").id("1001").doc(XContentType.JSON, "sex", "女");
        UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);
        System.out.println("id: " + response.getId());
        System.out.println("index: " + response.getIndex());
        System.out.println("result: " + response.getResult());
        System.out.println("version: " + response.getVersion());
        esClient.close();
    }
    
        //批量修改
        @Test
        public void updateDoc() throws IOException{
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            BulkRequest request = new BulkRequest();
            request.add(new UpdateRequest().index("student").id("1001").doc(XContentType.JSON, "name", "1001"));
            BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
            System.out.println(responses.getTook());
            System.out.println(responses.getItems());
            System.out.println(JSONUtil.toJsonStr(responses));
            client.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    通过id删除文档
       @Test
        public void deleteDocument() throws IOException{
            RestHighLevelClient esClient = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http"))
            );
            DeleteRequest request = new DeleteRequest().index("user").id("1005");
            DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
            System.out.println("id: "+ response.getId());
            System.out.println("index: "+ response.getIndex());
            System.out.println("result: "+ response.getResult());
            System.out.println("version: "+ response.getVersion());
            esClient.close();
        }
    
        //批量删除文档
        @Test
        public void deleteDoc() throws IOException{
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            BulkRequest request = new BulkRequest();
            List<Integer> list = Arrays.asList(1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009);
            for (Integer integer : list) {
                request.add(new DeleteRequest().index("student").id(integer.toString()));
            }
            BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
            System.out.println("took:" + responses.getTook());
            System.out.println("items:" + responses.getItems());
            client.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    条件查询
        //tips: 查询指定索引下所有(文档)数据;(无条件,即: 所有数据)
    	@Test
        public void query() throws IOException{
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
    
            SearchRequest request = new SearchRequest();//可以注释掉下面这行,student放到这的括号里
            request.indices("student");
            request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            System.out.println(response.getTook());
            System.out.println(response.getHits().getTotalHits());
            SearchHits hits = response.getHits();
            for (SearchHit hit : hits) {
                 System.out.println(hit.getSourceAsString());
            }
    
            client.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    分页查询
    	@Test
        public void queryByPage() throws IOException{
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
    
            SearchRequest request = new SearchRequest();
            request.indices("student");
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(QueryBuilders.matchAllQuery());
            sourceBuilder.from(0);//起始页码
            sourceBuilder.size(2);//每页显示数据数
            sourceBuilder.sort("age", SortOrder.DESC);//排序;对age(年龄)字段进行倒序排序
            request.source(sourceBuilder);
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            SearchHits hits = response.getHits();
            System.out.println(response.getTook());
            System.out.println(response.getHits().getTotalHits());
            for (SearchHit hit : hits) {
                System.out.println(hit.getSourceAsString());
            }
            client.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    查询过滤字段
    	@Test
        public void queryPageByCondition() throws IOException{
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
    
            SearchRequest request = new SearchRequest();
            request.indices("student");
            SearchSourceBuilder source = new SearchSourceBuilder();
            source.query(QueryBuilders.termQuery("name", "1007"));
            String[] includes = {"no", "name", "age", "sorted"};
            String[] excludes = {};
            source.fetchSource(includes, excludes);
            request.source(source);
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            SearchHits hits = response.getHits();
            System.out.println(response.getTook());
            System.out.println(response.getHits().getTotalHits());
            for (SearchHit hit : hits) {
                System.out.println(hit.getSourceAsString());
            }
            client.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    条件查询
    	//tips: 有条件的查询; 查询所有男生 的信息
    	@Test
        public void query() throws Exception {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            SearchRequest searchRequest = new SearchRequest("student");
            SearchSourceBuilder source = new SearchSourceBuilder();
            source.query(QueryBuilders.termQuery("gender", "男"));
            searchRequest.source(source);
            SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println(response.getTook());
            System.out.println(response.getHits().getTotalHits());
            for (SearchHit hit : response.getHits()) {
                System.out.println(hit.getSourceAsString());
            }
            client.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    聚合查询
        student索引的所有数据:
            {"no":"1001","name":"张三","gender":"男","age":21,"skill":78}
            {"no":"1002","name":"李四","gender":"男","age":21,"skill":80}
            {"no":"1003","name":"王五","gender":"男","age":24,"skill":90}
            {"no":"1004","name":"赵六","gender":"男","age":20,"skill":90}
            {"no":"1005","name":"小花","gender":"女","age":26,"skill":96}
            {"no":"1006","name":"小丽","gender":"女","age":24,"skill":89}
            {"no":"1007","name":"小翠","gender":"女","age":27,"skill":86}
            {"no":"1008","name":"小妹","gender":"女","age":25,"skill":88}
            {"no":"1009","name":"小娟","gender":"女","age":28,"skill":84}
    
    	@Test
        public void queryAggregation() throws Exception {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            SearchRequest searchRequest = new SearchRequest("student");
            SearchSourceBuilder source = new SearchSourceBuilder(); 
         source.aggregation(AggregationBuilders.terms("genderTerm").field("gender.keyword")//聚合名称(自定义): genderTerm; 字段: 按照性别字段聚合; 类似于mysql的group by 	
                            .subAggregation(AggregationBuilders.count("genderCount").field("gender.keyword"))//分组数量
    .subAggregation(AggregationBuilders.avg("ageAvg").field("age"))//分组数据的平均年龄
    .subAggregation(AggregationBuilders.min("minAge").field("age"))//分组数据的最小年龄
    .subAggregation(AggregationBuilders.topHits("details").sort("age", SortOrder.ASC).size(10)));//每组详情数据,并设置按年龄升序排序
            searchRequest.source(source);
            SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
            Aggregations aggregations = response.getAggregations();
            ParsedStringTerms terms = aggregations.get("genderTerm");
            List<? extends Terms.Bucket> buckets = terms.getBuckets();
            for (Terms.Bucket bucket : buckets) {
                String key = bucket.getKeyAsString();
                System.out.println("key: " + key);
                Aggregations aggregations1 = bucket.getAggregations();
                ParsedValueCount count = aggregations1.get("genderCount");
                System.out.println("统计本组总个数: " + count.getValueAsString());
                ParsedAvg avg = aggregations1.get("ageAvg");
                System.out.println("统计本组年龄平均数: " + avg.getValue());
                ParsedMin minAge = aggregations1.get("minAge");
                System.out.println("统计本组年龄最小数: " + minAge.getValueAsString());
                ParsedTopHits topHits = aggregations1.get("details");
                SearchHits hits = topHits.getHits();
                for (SearchHit hit : hits) {
                    System.out.println(hit.getSourceAsString());
                }
            }
            client.close();
        }
    运行结果:
    key: 女
    统计本组总个数: 5.0
    统计本组年龄平均数: 26.0
    统计本组年龄最小数: 24.0
    {"no":"1006","name":"小丽","gender":"女","age":24,"skill":89}
    {"no":"1008","name":"小妹","gender":"女","age":25,"skill":88}
    {"no":"1005","name":"小花","gender":"女","age":26,"skill":96}
    {"no":"1007","name":"小翠","gender":"女","age":27,"skill":86}
    {"no":"1009","name":"小娟","gender":"女","age":28,"skill":84}
    key: 男
    统计本组总个数: 4.0
    统计本组年龄平均数: 21.5
    统计本组年龄最小数: 20.0
    {"no":"1004","name":"赵六","gender":"男","age":20,"skill":90}
    {"no":"1001","name":"张三","gender":"男","age":21,"skill":78}
    {"no":"1002","name":"李四","gender":"男","age":21,"skill":80}
    {"no":"1003","name":"王五","gender":"男","age":24,"skill":90}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
  • 相关阅读:
    .NET C#基础(7):接口 - 人如何和猫互动
    mac 中定时任务执行时的环境不同于手动执行时的环境
    数据库优化
    SAP ABAP OData 服务如何支持 $select 有选择性地仅读取部分模型字段值试读版
    【概率论基础进阶】随机变量及其分布-随机变量函数的分布
    Matlab:绘制日期时间
    双向认证配置
    【数据库查询表结构】
    【校招VIP】互联网校招项目&实习对项目的要求不重要?大错特错!你忽略掉的项目考察重点都在这里!
    ES6之Map和Set有什么不同?
  • 原文地址:https://blog.csdn.net/lz527657138/article/details/125472882