• java连接ES操作入门


    如何建立数据模型?

    1:建立索引

    DELETE /hd_insurance_data
    ​
    PUT hd_insurance_data
    {
      "settings": {
        "number_of_replicas": 1
      }, 
      "mappings" : {
        "properties" : {
          "age" : {
             "type" : "integer"
          },
          "channel_code" : {
            "type" : "keyword"
          },
          "channel_name" : {
            "type" : "keyword"
          }
        }
      }
    }
    

      

    2:写入数据

    2.1:手动写入数据

    put /hd_insurance_data/_doc/1 
    {
    "id": "1",
    "department_name": "大项目部",
    "department_code": "",
    "policy_number": "be16985732a40212345690ed30d1db"
    }

     

    2.2:通过使用kibana进行数据批量导入

    这里不做介绍,导入数据尝试几次都失败了,不太好用

     

    2.3:命令行导入数据

    curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_doc/_bulk?pretty&refresh" --data-binary "@accounts.json"

    搜索java的api了解

    1:启动集群elasticsearch 和kibana

    bin/elasticsearch -E node.name=node1 -E cluster.name=health -E path.data=node1_data -d

    bin/elasticsearch -E node.name=node2 -E cluster.name=health -E path.data=node2_data -d

    bin/elasticsearch -E node.name=node3 -E cluster.name=health -E path.data=node3_data -d
    bin/kibana

    2:建立索引导入数据

    3:Java连接es

    导入es配置
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
      </dependency>

    spring.elasticsearch.rest.uris=http://localhost:9200
    在项目中注入RestHighLevelClient直接就可以使用
      @Autowired
    private ElasticsearchRestTemplate client;
    @Autowired
    private RestHighLevelClient highLevelClient;

    4:建议

    1、做简单的bool查询获取状态是否正常

    GET /hd_insurance_data/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "policy_status": {
                  "value": "1"
                }
              }
            }
          ]
        }
      }
    }
    2、对年龄每隔5岁进行分桶,并将分桶的年龄分男女进行分桶
    GET /hd_insurance_data/_search
    {
      "size": 0,
      "aggs": {
        "age_histrogram":{
          "histogram": {
            "field": "age",
            "interval": 5
          },
          "aggs": {
            "sex_count": {
              "terms": {
                "field": "sex",
                "size": 10
              }
            }
          }
        }
      }
    }

    返回结果,是每个5岁一个分类,同时获取这个分桶中男女的数量

    {
    "key" : 20.0,
    "doc_count" : 1,
    "sex_count" : {
    "doc_count_error_upper_bound" : 0,
    "sum_other_doc_count" : 0,
    "buckets" : [
    {
    "key" : "1",
    "doc_count" : 1
    }
    ]
    }
    },
    {
    "key" : 25.0,
    "doc_count" : 5,
    "sex_count" : {
    "doc_count_error_upper_bound" : 0,
    "sum_other_doc_count" : 0,
    "buckets" : [
    {
    "key" : "1",
    "doc_count" : 3
    },
    {
    "key" : "2",
    "doc_count" : 2
    }
    ]
    }
    }

     
    3、将两个步骤结合起来,获取想要的结果
    GET /hd_insurance_data/_search
    {
      "size": 0, 
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "policy_status": {
                  "value": "1"
                }
              }
            }
          ], 
          "filter": [
            {
              "range": {
                "insurance_time": {
                  "gte": "2017-01-01 15:09:13",
                  "lte": "2021-10-01 15:09:13"
                }
              }
            }
          ]
        }
      }, 
      "aggs": {
        "age_histrogram":{
          "histogram": {
            "field": "age",
            "interval": 5
          }
        },
        "aggs":{
          "sex_count":{
            "terms": {
              "field": "sex",
              "size": 10
            }
          }
        }
      }
    }

    4、将上面的查询通过api翻译为java代码

     public void searchByConditions() throws IOException {
        SearchRequest searchRequest = new SearchRequest("hd_insurance_data");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    ​
        // 设定搜索条件
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
            .must(QueryBuilders.termQuery("policy_status", "1"))
            .must(QueryBuilders.termQuery("department_name", "目部"))
            .must(QueryBuilders.termQuery("channel_name", "保险代理"))
            .must(QueryBuilders.termQuery("sales_plan_code", "S1230445"))
            .must(QueryBuilders.termQuery("quota_plan_code", "10123123101"))
            .filter(QueryBuilders.rangeQuery("insurance_time").gte("2019-01-01 15:09:13").lte("2019-10-01 15:09:13"));
    ​
        // 聚类分析,并子聚类
        AggregationBuilder aggregationBuilder = AggregationBuilders.dateHistogram("age_histrogram").field("age").interval(5);
        AggregationBuilder subAggregationBuilder = AggregationBuilders.terms("sex_count").field("sex");
        aggregationBuilder.subAggregation(subAggregationBuilder);
    ​
        searchSourceBuilder.size(0);
        searchSourceBuilder.query(boolQueryBuilder);
        searchSourceBuilder.aggregation(aggregationBuilder);
        searchRequest.source(searchSourceBuilder);
    ​
        SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        log.info("searchResponse {}", searchResponse.toString());
    //    log.info("searchResponse getAggregations {}", Strings.toString(searchResponse.getAggregations()));
      }

     

    总结:

    1、es使用非常简单,但是各种查询有点多,还需要进一步梳理

    本文是对工作中使用es的一个简单调研,刚学习,还请多多指教。

    参考

    1:elasticsearch的搜索api

    https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.9/java-rest-high-query-builders.html

  • 相关阅读:
    ES6 Set.Map.Symbol数据结构
    ES6 class类 静态方法及类的继承
    ES6 浅谈Reflect
    ES6 proxy代理详解及用法
    Vue之生命周期函数
    Vue之自定义键盘修饰符、自定义指令
    v-show和v-if区别
    迭代器iterator
    es6之Proxy代理
    es6之symbol数据类型
  • 原文地址:https://www.cnblogs.com/truestudy/p/14804524.html
Copyright © 2020-2023  润新知