Elasticsearch-02-Java 调用API

1. ELK-6.3.1版本环境搭建 

  参考 https://www.cnblogs.com/dduo/p/14871203.html

2.maven Java 项目

  2.0 项目结构 

         

  2.1 pom.xml中引入相关依赖

  <!--Es服务器版本6.3.1 使用对应报错 org.elasticsearch.client.Request.<init>(Ljava/lang/String;Ljava/lang/String;)V 因此使用6.5.4-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.5.4</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Client 包缺少一些东西,因此引入此包
            可以具体查看ISSUE https://github.com/elastic/elasticsearch/issues/26959
         -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.5.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
           <version>4.12</version>
        </dependency>

  2.2 准备测试数据

    https://files-cdn.cnblogs.com/files/blogs/688336/resources.zip

    数据说明: data中是准备往索引中插入的测试数据    mapping中是创建索引对应的mapping映射文件

           

  2.3 客户端连接对象等工具类开发

public interface CommonData {
    String index = "sku";
    String indexAlias = "sku_ali";
    String esServer = "10.10.10.10";
    Integer esPort = 9200;
    String schema = "http";
    String[] showFields = {"skuName","price","spuId","skuDesc"};
    String dataFile = "data/data.txt";
    String mappingFile = "mapping/mapping.json"
}
import io.netty.util.internal.StringUtil;
import org.apache.http.HttpHost;
import org.elasticsearch.client.IndicesClient;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.Test;
import static com.es.api.CommonData.*;
/**
 * @Description: 0. 准备Elasticsearch的客户端连接
 */
public class ClientApp {
    private static volatile RestHighLevelClient client = null;
    /* 组装Elasticsearch客户端 */
    public static RestHighLevelClient getClient(String ip, Integer port) {
        if (client == null) {
            synchronized (ClientApp.class) {
                try {
                    if(StringUtil.isNullOrEmpty(ip) && port == null){
                        client = new RestHighLevelClient(
                                RestClient.builder(
                                        new HttpHost(esServer,esPort, schema)
                                ));
                    }else{
                        client = new RestHighLevelClient(
                                RestClient.builder(
                                        new HttpHost(ip,port, schema)
                                ));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return client;
    }

    public static RestHighLevelClient getClient() {
        return getClient(null,null);
    }

    /* 测试获取ES客户端 */
    @Test
    public void testClientGet(){
        RestHighLevelClient client = getClient();
        RestClient lowLevelClient = client.getLowLevelClient();
        IndicesClient indices = client.indices();
    }
}

 2.4 创建索引+插入测试数据

import io.netty.util.internal.StringUtil;
import org.elasticsearch.action.admin.indices.alias.Alias;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.support.ActiveShardCount;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.Test;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Random;
import static com.es.api.ClientApp.*;
import static com.es.api.CommonData.*;
/**
 * @Description: 1. 创建索引+添加测试数据
 */
public class IndexApiUseApp {
    /* 创建索引*/
    public void createIndex(String indexName, String mapping, String alias) throws IOException {
        // 配置信息 使用建造者模式构建
        Settings settings = Settings.builder()
                // 当前索引的shard分片数为1
                .put("number_of_shards", 1)
                // 当前索引的副本数为1
                .put("number_of_replicas", 1)
                .build();
        CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
        // 除此之外还可以使用Map传递
        createIndexRequest.settings(settings);
        // 设置超时时间
        createIndexRequest.timeout(TimeValue.timeValueSeconds(5));
        // 设置主节点超时时间
        createIndexRequest.masterNodeTimeout(TimeValue.timeValueSeconds(5));
        // 设置创建索引API返回响应之前等待活动分片的数量
        createIndexRequest.waitForActiveShards(ActiveShardCount.from(1));
        CreateIndexRequest createIndexRequest2 = new CreateIndexRequest(indexName, settings);

        // 设置mapping
        if (StringUtil.isNullOrEmpty(mapping)) {
            InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(mappingFile);
            byte[] datas = new byte[2048];
            int a = 0;
            while ((a = resourceAsStream.read(datas)) != -1) {}
            String mapData = new String(datas);
            mapData = mapData.replaceAll("\t", "")
                    .replaceAll("\r\n", "")
                    .replaceAll("\n", "")
                    .trim();
            createIndexRequest.mapping("_doc", mapData, XContentType.JSON);
        }
        // 设置索引别名
        if (StringUtil.isNullOrEmpty(alias)) {
            createIndexRequest.alias(new Alias(alias));
        }
        // 执行创建请求
        CreateIndexResponse createIndexResponse = getClient()
                .indices()
                .create(createIndexRequest, RequestOptions.DEFAULT);
        boolean acknowledged = createIndexResponse.isAcknowledged();
        boolean shardsAcknowledged = createIndexResponse.isShardsAcknowledged();
        String index = createIndexResponse.index();
        System.out.println("acknowledged: " + acknowledged + ",shardsAcknowledged: " + shardsAcknowledged + ",index: " + index);
    }
  /*使用单元测试创建索引*/
    @Test
    public void createIndexTest() {
        try {
            createIndex(index, "", indexAlias);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /* 索引添加测试数据*/
    @Test
    public void batchAdd() {
        String index = CommonData.index;
        try (InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(dataFile);
             BufferedReader bis = new BufferedReader(new InputStreamReader(resourceAsStream));) {
            // 读取data.txt数据并组装数据
            String str = null;
            while ((str = bis.readLine()) != null) {
                XContentBuilder contentBuilder = XContentFactory.jsonBuilder();
                contentBuilder.startObject();
          // 第一行相当于是一个schema说明,需要过滤掉
                if (str.startsWith("skuId")) {
                    continue;
                }
                String[] arrs = str.split(",");
                contentBuilder.field("skuId", arrs[0]);
                contentBuilder.field("price", arrs[1]);
                contentBuilder.field("skuName", arrs[2]);
                contentBuilder.field("skuDesc", arrs[3]);
                contentBuilder.field("weight", arrs[4]);
                contentBuilder.field("spuId", arrs[5]);
                contentBuilder.field("catalog3Id", arrs[6]);
                contentBuilder.field("saleDate", arrs[7]);
                contentBuilder.field("skuDefaultImg", arrs[8]);
                contentBuilder.endObject();
                // todo type不能少
                IndexRequest indexRequest = new IndexRequest(index, "_doc").source(contentBuilder);
                IndexResponse indexResponse = getClient().index(indexRequest, RequestOptions.DEFAULT);
                System.out.println(indexResponse.getIndex());
                contentBuilder.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

  2.5 Kibana上查看数据

  方法一: 使用ES的API接口  

      

    方法二: 使用Kibana展示         

      

      

    

 

  ps: 之前没有date类型字段时好像是没有第6步操作     

       

       

  2.6 基础搜索相关功能使用

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import java.io.IOException;
import java.util.Map;
import static com.es.api.ClientApp.*;
import static com.es.api.CommonData.*;

/**
 * @Description: 2. 使用搜索相关API
 */
public class SearchApiUseApp {
    /*搜索当前index全部数据 --默认查询前10条*/
    public void searchAll(String index,String [] fields) throws IOException {
        SearchRequest request = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        // 获取指定字段  _id不属于当前索引mapping中定义字段,因此查询不出来
        searchSourceBuilder.fetchSource(fields,null);
        request.source(searchSourceBuilder);
        SearchResponse search = getClient().search(request, RequestOptions.DEFAULT);
        printResult(search);
    }
    @Test
    public void searchAllTest(){
        try {
            searchAll(index,showFields);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /*分页查询*/
    public void pageQuery(String index,int from,int size,String[] fields) throws IOException {
        SearchRequest request = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        searchSourceBuilder.fetchSource(fields,null);

        // 指定分页查询起始点和长度
        searchSourceBuilder.from(from);
        searchSourceBuilder.size(size);
        request.source(searchSourceBuilder);
        SearchResponse search = getClient().search(request, RequestOptions.DEFAULT);
        printResult(search);
    }
    @Test
    public void pageQueryTest(){
        try {
            pageQuery(index, 0, 20,showFields);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*ids查询 --根据ES给定的id查询*/
    public void idsQuery(String index,String[] ids) throws IOException {
        SearchRequest request = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.idsQuery().addIds(ids));

        request.source(searchSourceBuilder);
        SearchResponse search = getClient().search(request, RequestOptions.DEFAULT);
        printResult(search);
    }

    @Test
    public void idsQueryTest(){
        try {
            idsQuery(index, new String[]{"4k-fenoBVullmZMi8ona","4U-fenoBVullmZMi8onG","50-fenoBVullmZMi84ku"});
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /* match匹配查询*/
    @Test
    public void matchQuery() throws IOException {
        SearchRequest request = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // todo matchPhraseQuery精确匹配与matchQuery类模糊匹配的
         searchSourceBuilder.query(QueryBuilders.matchPhraseQuery("skuName","电脑_0212_C"));
         searchSourceBuilder.query(QueryBuilders.matchQuery("skuName","电脑_0212_C"));

        // multi_match多条件匹配  skuDefaultImg字段失败-mapping.json文件中没有将skuDefaultImg字段置为索引字段
        searchSourceBuilder.query(QueryBuilders.multiMatchQuery("手机","skuName","skuDesc"));
      // todo 以上三个不同的query测试哪个就将其余的注释掉 request.source(searchSourceBuilder); SearchResponse search
= getClient().search(request, RequestOptions.DEFAULT); printResult(search); } public static void printResult(SearchResponse search) { SearchHits hit = search.getHits(); SearchHit[] hits = hit.getHits(); for (SearchHit documentFields : hits) { // System.out.println(documentFields.getSourceAsString()); Map<String, Object> sourceAsMap = documentFields.getSourceAsMap(); System.out.println(sourceAsMap); } } /*复杂查询-bool查询*/ @Test public void boolQuery(){ try { SearchRequest request = new SearchRequest(index); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); boolQueryBuilder.must( new MatchQueryBuilder("skuName","手机") ); boolQueryBuilder.filter(new RangeQueryBuilder("price").gte(80).lt(100)); searchSourceBuilder.query(boolQueryBuilder); request.source(searchSourceBuilder); SearchResponse search = getClient().search(request, RequestOptions.DEFAULT); printResult(search); } catch (IOException e) { e.printStackTrace(); } } /*sort-排序使用*/ @Test public void sortQuery(){ try { SearchRequest request = new SearchRequest(index); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.fetchSource(showFields,null); // 综合使用: 按照bool条件查询+根据price排序+分页查询前100 BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); boolQueryBuilder.must( new MatchQueryBuilder("skuName","手机") ); boolQueryBuilder.filter(new RangeQueryBuilder("price").gte(80).lt(1000)); searchSourceBuilder.query(boolQueryBuilder); searchSourceBuilder.sort("price", SortOrder.DESC); searchSourceBuilder.from(0); searchSourceBuilder.size(100); request.source(searchSourceBuilder); SearchResponse search = getClient().search(request, RequestOptions.DEFAULT); printResult(search); } catch (IOException e) { e.printStackTrace(); } } }

  2.7 分组聚合相关功能使用

package com.es.api;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.*;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
import org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.metrics.avg.Avg;
import org.elasticsearch.search.aggregations.metrics.avg.AvgAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.max.Max;
import org.elasticsearch.search.aggregations.metrics.max.MaxAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.min.Min;
import org.elasticsearch.search.aggregations.metrics.min.MinAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.sum.Sum;
import org.elasticsearch.search.aggregations.metrics.sum.SumAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
import static com.es.api.ClientApp.*;
import static com.es.api.CommonData.index;

/**
 * @Description: 分组查询相关API使用
 */
public class GroupSearchUseApp {

    /*根据指定字段分组求个数 */
    @Test
    public void groupCountAgg() {
        SearchRequest request = new SearchRequest(index);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.size(0);
        sourceBuilder.query(QueryBuilders.matchAllQuery());

        AggregationBuilder aggregationBuilder = AggregationBuilders
                .terms("spuId_group")
                .field("spuId");

        sourceBuilder.aggregation(aggregationBuilder);
        request.source(sourceBuilder);
        try {
            SearchResponse aggResponse = getClient().search(request, RequestOptions.DEFAULT);
            Aggregations aggregations = aggResponse.getAggregations();
            Terms terms = aggregations.get("spuId_group");

            List<? extends Terms.Bucket> buckets = terms.getBuckets();
            buckets.forEach(info -> System.out.println("spuId:" + info.getKey() + " count : " + info.getDocCount()); );
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*根据指定字段分组求均值 */
    @Test
    public void groupAvgAgg() {
        SearchRequest request = new SearchRequest(index);

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.size(0);
        sourceBuilder.query(QueryBuilders.matchAllQuery());

        AggregationBuilder aggregationBuilder = AggregationBuilders
                .terms("cata_avg_price")
                .field("catalog3Id");
        AvgAggregationBuilder avgAgg = AggregationBuilders
                .avg("avg_price")
                .field("price");
        aggregationBuilder.subAggregation(avgAgg);

        sourceBuilder.aggregation(aggregationBuilder);
        request.source(sourceBuilder);
        try {
            SearchResponse aggResponse = getClient().search(request, RequestOptions.DEFAULT);
            Aggregations aggregations = aggResponse.getAggregations();
            Terms terms = aggregations.get("cata_avg_price");

            List<? extends Terms.Bucket> buckets = terms.getBuckets();
            buckets.forEach(info -> {
                Aggregations subAggs = info.getAggregations();
                Avg avg = subAggs.get("avg_price");
                System.out.println("cateId:" + info.getKey() + " count : " + info.getDocCount() + "  avg: " + avg.getValue());
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*根据指定字段分组求 价格平均值、最大值、最小值、总和*/
    @Test
    public void groupMoreAgg() {
        SearchRequest request = new SearchRequest(index);

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.size(0);
        sourceBuilder.query(QueryBuilders.matchAllQuery());

        AggregationBuilder aggregationBuilder = AggregationBuilders
                .terms("cata_more_price")
                .field("catalog3Id");
        AvgAggregationBuilder avgAgg = AggregationBuilders
                .avg("avg_price")
                .field("price");
        MaxAggregationBuilder maxAgg = AggregationBuilders
                .max("max_price")
                .field("price");
        MinAggregationBuilder minAgg = AggregationBuilders
                .min("min_price")
                .field("price");
        SumAggregationBuilder sumAgg = AggregationBuilders
                .sum("sum_price")
                .field("price");
        aggregationBuilder.subAggregation(avgAgg);
        aggregationBuilder.subAggregation(maxAgg);
        aggregationBuilder.subAggregation(minAgg);
        aggregationBuilder.subAggregation(sumAgg);

        sourceBuilder.aggregation(aggregationBuilder);
        request.source(sourceBuilder);
        try {
            SearchResponse aggResponse = getClient().search(request, RequestOptions.DEFAULT);
            Aggregations aggregations = aggResponse.getAggregations();
            Terms terms = aggregations.get("cata_more_price");

            List<? extends Terms.Bucket> buckets = terms.getBuckets();
            buckets.forEach(info -> {
                Aggregations subAggs = info.getAggregations();
                Avg avg = subAggs.get("avg_price");
                Max max = subAggs.get("max_price");
                Min min = subAggs.get("min_price");
                Sum sum = subAggs.get("sum_price");
                System.out.println("catalog3Id:" + info.getKey() + " count : " + info.getDocCount() + "  avg: " + avg.getValue() + " " +
                        "min: " + min.getValue() + " max: " + max.getValue() + " sum: " + sum.getValue());
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*根据不同价格区间统计 商品个数*/
    @Test
    public void rangPriceQuery() {
        SearchRequest request = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.size(0);
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        // 使用价格区间统计
        HistogramAggregationBuilder histogramValuesSourceBuilder = AggregationBuilders
                .histogram("price_scope")
                .field("price")
                .interval(500);
        SumAggregationBuilder sumAggregationBuilder = AggregationBuilders
                .sum("sum_price")
                .field("price");
        histogramValuesSourceBuilder.subAggregation(sumAggregationBuilder);

        searchSourceBuilder.aggregation(histogramValuesSourceBuilder);
        request.source(searchSourceBuilder);

        try {
            SearchResponse search = getClient().search(request, RequestOptions.DEFAULT);
            Aggregations aggregations = search.getAggregations();
            Histogram histogram = aggregations.get("price_scope");

            List<? extends Histogram.Bucket> buckets = histogram.getBuckets();
            buckets.forEach(info -> {
                Sum sum = info.getAggregations().get("sum_price");
                System.out.println("id: " + info.getKey() + " count: " + info.getDocCount() + " sum: " + sum.getValue());
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*计算每天|周|月|季度|年的销售总额,并按照总额降序查询*/
    @Test
    public void useDateAgg() {
        SearchRequest request = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.size(0);
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        String flag = null;
        DateHistogramAggregationBuilder histogramAggregationBuilder = null;

       /* histogramAggregationBuilder = AggregationBuilders
                .dateHistogram("day_price")
                .field("saleDate")
                .dateHistogramInterval(DateHistogramInterval.DAY)
                .format("yyyy-MM-dd")
                .order(BucketOrder.aggregation("sum_price",false));
        flag = "day";*/

        histogramAggregationBuilder = AggregationBuilders
                .dateHistogram("week_price")
                .field("saleDate")
                .dateHistogramInterval(DateHistogramInterval.WEEK)
                .format("yyyy-MM-dd")
                .order(BucketOrder.aggregation("sum_price", false));
        flag = "week";

        /*histogramAggregationBuilder = AggregationBuilders
                .dateHistogram("q_price")
                .field("saleDate")
                .dateHistogramInterval(DateHistogramInterval.QUARTER)
                .format("yyyy-MM-dd")
                .order(BucketOrder.aggregation("sum_price", false));
        flag = "q";

        histogramAggregationBuilder = AggregationBuilders
                .dateHistogram("year_price")
                .field("saleDate")
                .dateHistogramInterval(DateHistogramInterval.YEAR)
                .format("yyyy-MM-dd")
                .order(BucketOrder.aggregation("sum_price", false));
        flag = "year";

       histogramAggregationBuilder = AggregationBuilders
                .dateHistogram("month_price")
                .field("saleDate")
                .dateHistogramInterval(DateHistogramInterval.MONTH)
                .format("yyyy-MM-dd")
                .order(BucketOrder.aggregation("sum_price",false));
        flag = "month";*/


        SumAggregationBuilder sumAggregationBuilder = AggregationBuilders
                .sum("sum_price")
                .field("price");

        histogramAggregationBuilder.subAggregation(sumAggregationBuilder);
        searchSourceBuilder.aggregation(histogramAggregationBuilder);

        request.source(searchSourceBuilder);

        try {
            SearchResponse search = getClient().search(request, RequestOptions.DEFAULT);
            Histogram histogram = null;
            switch (flag) {
                case "day":
                    histogram = search.getAggregations().get("day_price");
                    break;
                case "month":
                    histogram = search.getAggregations().get("month_price");
                    break;
                case "year":
                    histogram = search.getAggregations().get("year_price");
                    break;
                case "q":
                    histogram = search.getAggregations().get("q_price");
                    break;
                case "week":
                    histogram = search.getAggregations().get("week_price");
                    break;
            }
            List<? extends Histogram.Bucket> buckets = histogram.getBuckets();
            buckets.forEach(info -> {
                Sum sum = info.getAggregations().get("sum_price");
                System.out.println("id: " + info.getKey() + " count: " + info.getDocCount() + " sum: " + sum.getValue());
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  2.8 Java  Api方法对应Kibana操作命令

1. 创建索引
    PUT sku
    {
      "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 1
      },
      "mappings": {
        "SkuInfo":{
          "properties": {
            "skuName":{
              "type": "text",
              "analyzer": "ik_max_word",
              "index": true
            },
            "price":{
              "type": "double"
            },
            "spuId":{
              "type": "long"
            },
            "weight":{
              "type": "double"
            },
            "catalog3Id":{
              "type": "keyword"
            },
            "skuDefaultImg":{
              "type": "keyword",
              "index": false
            },
            "skuDesc":{
              "type": "text",
              "analyzer": "ik_smart"
            }
          }
        }
      },
      "aliases": {
          "sku_alias": {}
      }
    }

2. 分页查询
    GET /sku/_search
    {
        "query": {
        "match_all": {}
    },
        "_source": ["skuName","price","spuId","skuDesc],
        "from": 0,
        "size": 20
    }

3. ids查询
  GET /sku/_search
       {
           "query": {
           "ids": {
               "values": ["4k-fenoBVullmZMi8ona","4U-fenoBVullmZMi8onG","50-fenoBVullmZMi84ku"]
           }
       }
       }

4. match匹配查询
    todo  精确查出来一条数据
    GET /sku/_search
    {
        "query": {
            "match":{
                "skuName":{
                    "query": "电脑_0212_C",
                    "operator":  "and"
                 }
            }
        }
    }
    查询出来很多数据,默认operator是or操作
    GET /sku/_search
    {
        "query": {
            "match": {
                "skuName": "电脑_0212_C"
            }
        }
    }

5.  多条件匹配match
    GET /sku/_search
    {
        "query": {
        "multi_match": {
            "query": "手机",
            "fields": ["skuName", "skuDesc"]
            }
         }
    }

6. 复杂查询—-bool :#filter不参与相关度评分
 GET /sku/_search
    {
        "query": {
            "bool": {
                "must": [
                {
                    "match": {
                    "skuName": "手机"
                }
                }
          ],
            "filter": {
                "range": {
                    "price": {
                        "gte": 80,
                         "lte": 100
                    }
                }
            }
         }
        }
    }

7. sort-排序查询
GET /sku/_search
{
  "query": {
      "bool": {
          "must": [
          {
              "match": {
              "skuName": "手机"
          }
          }
    ],
      "filter": {
          "range": {
              "price": {
                  "gte": 80,
                   "lte": 100
              }
          }
      }
   }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ],
   "_source": ["skuName","price","spuId","skuDesc"],
  "from": 0,
  "size": 20
}

8. 分组求和操作--统计每个spu对应sku个数
GET /sku/_search
{
  "size": 0,
  "aggs": {
    "spu_group": {
      "terms": {
        "field": "spuId"
      }
    }
  }
}

9. 分组求平均值--统计每个spu对应评均价格
GET /sku/_search
{
  "size": 0,
  "aggs": {
    "cate_group": {
      "terms": {
        "field": "catalog3Id"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

10.  分组求平均值,最值,总和--统计每个spu对应评均价格
GET /sku/_search
{
  "size": 0,
  "aggs": {
    "cate_group": {
      "terms": {
        "field": "catalog3Id"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        },
        "max_price":{
          "max": {
            "field": "price"
          }
        },
        "min_price":{
          "min": {
            "field": "price"
          }
        },
        "sum_price":{
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}

11. 按照售价价格划分范围(500),算出每个区间的商品
    GET /sku/_search
    {
      "size": 0,
      "aggs": {
        "price_scope": {
          "histogram": {
            "field": "price",
            "interval": 500
          },
          "aggs": {
            "sum_price": {
              "sum": {
                "field": "price"
              }
            }
          }
        }
      }
    }

12. 计算每天|周|月|季度|年的销售总额,并按照总额降序查询
GET /sku/_search
{
  "size": 0,
  "aggs": {
    "day_price": {
      "date_histogram": {
        "field": "saleDate",
        "interval": "day",
        "format": "yyyy-MM-dd",
        "order": {
          "sum_price": "desc"
        }
      },
      "aggs": {
        "sum_price": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}

GET /sku/_search
{
  "size": 0,
  "aggs": {
    "week_price": {
      "date_histogram": {
        "field": "saleDate",
        "interval": "week",
        "format": "yyyy-MM-dd",
        "order": {
          "sum_price": "desc"
        }
      },
      "aggs": {
        "sum_price": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}
GET /sku/_search
{
  "size": 0,
  "aggs": {
    "month_price": {
      "date_histogram": {
        "field": "saleDate",
        "interval": "month",
        "format": "yyyy-MM-dd",
        "order": {
          "sum_price": "desc"
        }
      },
      "aggs": {
        "sum_price": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}
GET /sku/_search
{
  "size": 0,
  "aggs": {
    "year_price": {
      "date_histogram": {
        "field": "saleDate",
        "interval": "year",
        "format": "yyyy-MM-dd",
        "order": {
          "sum_price": "desc"
        }
      },
      "aggs": {
        "sum_price": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}

 

posted @ 2021-07-07 10:00  521pingguo1314  阅读(243)  评论(0编辑  收藏  举报