ES简单使用

GET /bank/_search
{
  "query": { "match": { "address": "mill lane" } }
}

# 匹配address包含mill lane的
GET /bank/_search
{
  "query": {
    "match": {
      "address": "mill lane"
    }
  }, 
  "size": 5
}

# 配置address包含mill lane的 mill
# lane是一个整体不走分词
GET /bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill lane"
    }
  }
}

# 多字段匹配
GET /bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill",
      "fields": ["state","address"]
    }
  }
}

# bool复合查询,must:必须,must_not必须不匹配,shoud  
#:应该匹配
GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "age": "40"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "state": "ID"
          }
        }
      ],
      "should": [
        {
          "match": {
            "lastname": "Wallace"
          }
        }
      ]
    }
  }
}

# match_all:匹配所有,filter:过滤
GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match_all": {}}
      ],
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}


# 查询地址包含mill的分析出年龄分布,平均年龄,平均余
# size:0 不要记录只看分析结果
GET /bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  },
  "aggs": {
    "ageAGG": {
      "terms": {
        "field": "age"
      }
    },
    "aggAVG":{
      "avg": {
        "field": "age"
      }
    },
    "balance":{
      "avg": {
        "field": "balance"
      }
    }
  },
  "size": 0
}

# 新建索引
PUT /my_index
{
  "mappings": {
    "properties": {
      "age":{
        "type": "integer"
      },
      "email":{
        "type": "keyword"
      },
      "name":{
        "type": "text"
      }
    }
  }
}

# 添加字段并设置不可被索引
PUT /my_index/_mapping
{
  "properties":{
    "empId":{
      "type":"keyword",
      "index":false
    }
  }
}
GET /my_index/_search
# 插入数据put是指定id,post是自动生成id
# PUT /my_index/_doc/1
POST /my_index/_doc
{
  "empId":"2",
  "name":"edg",
  "email":"s11EDG",
  "age":11
}

# 修改数据,不填的字段会被置空?pretty不会影响其他字段
PUT /my_index/_doc/SjlRwHwBAoX3eHnJSU9q?pretty
{
  "name":"啥",
  "age":12
}

# 删除数据
DELETE /my_index/_doc/SjlRwHwBAoX3eHnJSU9q

# 对于已创建的字段映射不可以直接修改,
# 可以新建索引把旧数据迁移过去
# step 1
PUT /my_index1
{
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "email": {
        "type": "text"
      },
      "name": {
        "type": "text"
      }
    }
  }
}
# step2
POST _reindex
{
  "source": {
    "index": "my_index"
  },
  "dest": {
    "index": "my_index1"
  }
}


# 默认是英文分词器,如果text为中文的话
# 就会分割成一个个汉字,需要自己的分词器
POST _analyze
{
  "analyzer": "standard",
  "text": "我是中国人"
}

POST _analyze
{
  "analyzer": "ik_max_word",
  "text": "我是中国人"
}

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "我是中国人"
}

package com.ghl.es;

import com.alibaba.fastjson.JSON;
import com.ghl.es.config.ESConfig;
import com.ghl.es.config.EsConstant;
import com.ghl.es.model.Account;
import org.apache.lucene.util.ArrayUtil;
import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateRequestBuilder;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.ElasticsearchClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.*;
import org.elasticsearch.index.reindex.BulkByScrollResponse;
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.elasticsearch.index.reindex.UpdateByQueryRequest;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.ParsedAggregation;
import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedLongTerms;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.ParsedAvg;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

@SpringBootTest
class EsdemoApplicationTests {

    @Resource
    private RestHighLevelClient client;

    /**
     * 匹配address包含mill lane的
     */
    @Test
    void test1() throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices(EsConstant.PRODUCT_INDEX);

        SearchSourceBuilder builder = new SearchSourceBuilder();
        //builder.query(QueryBuilders.matchQuery("address","mill lane"));
        //如果不想分词就用短句匹配
        //builder.query(QueryBuilders.matchPhraseQuery("address","mill lane"));
        //可以多个字段都匹配
        //builder.query(QueryBuilders.multiMatchQuery("mill","address","state"));
        builder.query(QueryBuilders.termQuery("account_number",9));
        builder.size(5);

        request.source(builder);
        SearchResponse response = client.search(request, ESConfig.COMMON_OPTIONS);
        printData(response,Account.class);
        printDSL(builder);
    }

    /**
     * # bool复合查询,must:必须,must_not必须不匹配,shoud应该匹配
     */
    @Test
    void test2() throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices(EsConstant.PRODUCT_INDEX);

        SearchSourceBuilder builder = new SearchSourceBuilder();
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.matchQuery("age",40));
        boolQuery.mustNot(QueryBuilders.matchQuery("state","ID"));
        boolQuery.should(QueryBuilders.matchQuery("lastname","Wallace"));
        builder.query(boolQuery);
        builder.size(5);

        request.source(builder);

        SearchResponse response = client.search(request, ESConfig.COMMON_OPTIONS);
        printData(response,Account.class);
        printDSL(builder);
    }

    /**
     * 匹配所有并过滤出余额在20000-30000的人
     */
    @Test
    void test3() throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices(EsConstant.PRODUCT_INDEX);

        SearchSourceBuilder builder = new SearchSourceBuilder();
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.matchAllQuery());

        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("balance");
        rangeQuery.gte(20000);
        rangeQuery.lte(30000);

        boolQuery.filter(rangeQuery);

        builder.query(boolQuery);
        builder.size(5);

        request.source(builder);

        SearchResponse response = client.search(request, ESConfig.COMMON_OPTIONS);
        printData(response,Account.class);
        printDSL(builder);
    }

    /**
     *
     * 查询地址包含mill的分析出年龄分布,平均年龄,平均余额(
     * size:0 不要记录只看分析结果
     */
    @Test
    void test4() throws IOException{
        SearchRequest request = new SearchRequest();
        request.indices(EsConstant.PRODUCT_INDEX);

        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.matchQuery("address","mill"));
        builder.size(0);

        TermsAggregationBuilder aggAgg = AggregationBuilders.terms("ageAgg").field("age");
        aggAgg.subAggregation(AggregationBuilders.terms("numberAgg").field("account_number"));
        builder.aggregation(aggAgg);

        AvgAggregationBuilder aggAVG = AggregationBuilders.avg("aggAVG").field("age");
        builder.aggregation(aggAVG);

        AvgAggregationBuilder balanceAgg = AggregationBuilders.avg("balance").field("balance");
        builder.aggregation(balanceAgg);

        request.source(builder);
        SearchResponse response = client.search(request, ESConfig.COMMON_OPTIONS);
        printDSL(builder);
        printData(response,Account.class);
        printAGG(response);
    }

    /**
     * 添加数据单条
     */
    @Test
    void add() throws IOException {
        IndexRequest request = new IndexRequest(EsConstant.PRODUCT_INDEX);
        //如果id已经存在es将做修改操作
        request.id("1003");
        Account account = new Account();
        account.setAccount_number(1000);
        account.setAddress("河南省");
        account.setAge(22);
        account.setBalance(100000000);
        account.setCity("上海市");
        account.setEmail("201176170@qq.com");
        account.setEmployer("熊二");
        account.setFirstname("光头强");
        account.setLastname("熊大");
        account.setGender("男");
        account.setState("OK");
        String data = JSON.toJSONString(account);

        request.source(data,XContentType.JSON);
        IndexResponse index = client.index(request, ESConfig.COMMON_OPTIONS);
        System.out.println(request);
    }

    /**
     * 批量插入
     */
    @Test
    void bulkAdd() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        for (int i = 1028; i < 1058; i++) {
            IndexRequest request = new IndexRequest(EsConstant.PRODUCT_INDEX);
            //如果id已经存在es将覆盖原数据
            request.id(String.valueOf(i));
            Account account = new Account();
            account.setAccount_number(i);
            account.setAddress("俄罗斯"+i);
            request.source(JSON.toJSONString(account),XContentType.JSON);
            bulkRequest.add(request);
        }
        BulkResponse bulk = client.bulk(bulkRequest, ESConfig.COMMON_OPTIONS);
        if (bulk.hasFailures()){
            List<String> collect = Arrays.asList(bulk.getItems()).stream().map(item -> item.getId()).collect(Collectors.toList());
            System.out.println("插入失败的id");
            collect.forEach(System.out::println);
        }
    }

    /*
    单个删除
     */
    @Test
    void del() throws IOException {
        DeleteRequest request = new DeleteRequest();
        request.index(EsConstant.PRODUCT_INDEX);
        request.id("1002");
        DeleteResponse delete = client.delete(request, ESConfig.COMMON_OPTIONS);
        System.out.println(delete);
    }
    /*
    批量删除
     */
    @Test
    void batchDel1() throws IOException {
        DeleteByQueryRequest request = new DeleteByQueryRequest();
        request.indices(EsConstant.PRODUCT_INDEX);
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.matchQuery("address","俄罗斯"));

        request.setQuery(boolQueryBuilder);
        BulkByScrollResponse deleteByQuery = client.deleteByQuery(request, ESConfig.COMMON_OPTIONS);
        System.out.println(deleteByQuery);
        System.out.println("=");
        System.out.println(boolQueryBuilder);
    }

    /*
    单个修改
     */
    @Test
    void edit() throws IOException {
        UpdateRequest request = new UpdateRequest();
        request.index(EsConstant.PRODUCT_INDEX);
        request.id("1002");
        Account account = new Account();
        account.setAddress("河南");
        request.doc(JSON.toJSONString(account),XContentType.JSON);

        UpdateResponse update = client.update(request, ESConfig.COMMON_OPTIONS);
        System.out.println(update);
    }
    /*
    按条件修改
   */
    @Test
    void batchEdit() throws IOException {
        UpdateByQueryRequest request = new UpdateByQueryRequest(EsConstant.PRODUCT_INDEX);
        request.setQuery(QueryBuilders.matchQuery("address", "河南"));
        request.setScript(
                new Script(
                        ScriptType.INLINE, "painless",
                        "if (ctx._source.address == '河南') {ctx._source.address == '开封'}",
                        Collections.emptyMap()));
        client.updateByQuery(request,ESConfig.COMMON_OPTIONS);
    }



    private <T> void printData(SearchResponse esResponse, Class<T> classType){
        System.out.println("===========================================查询结果=======================================");
        SearchHit[] hits1 = esResponse.getHits().getHits();
        if ((hits1 == null || hits1.length == 0) || classType == null){
            System.out.println("没有查询到数据");
            return;
        }
        SearchHit[] hits = esResponse.getHits().getHits();
        List<T> modelList = null;
        if (hits != null && hits.length > 0){
            modelList = new ArrayList<>();
            for (SearchHit hit : hits) {
                String sourceAsString = hit.getSourceAsString();
                T t = JSON.parseObject(sourceAsString, classType);
                modelList.add(t);
            }
        }
        modelList.forEach(System.out::println);
    }
    private void printDSL(SearchSourceBuilder dsl){
        System.out.println("===========================================查询DSL=======================================");
        System.out.println(dsl.toString());
    }
    private void printAGG(SearchResponse response){
        System.out.println("===========================================解析聚合=======================================");
        Aggregations aggregations = response.getAggregations();
        Map<String, Aggregation> asMap = aggregations.getAsMap();
        for (Map.Entry<String, Aggregation> map : asMap.entrySet()) {
            recursionAgg(map.getKey(),map.getValue());
        }

    }

    private void recursionAgg(String name,Aggregation agg) {
        System.out.println("====================================="+name+"聚合==============================");
        String type = agg.getType();
        if ("avg".equalsIgnoreCase(type)){
            ParsedAvg parseAgg = (ParsedAvg) agg;
            double value = parseAgg.getValue();
            System.out.println(value);
        }else if ("lterms".equalsIgnoreCase(type)){
            ParsedLongTerms parseAgg = (ParsedLongTerms) agg;
            List<? extends Terms.Bucket> buckets = parseAgg.getBuckets();
            for (Terms.Bucket bucket : buckets) {
                Aggregations aggregations = bucket.getAggregations();
                if (aggregations != null){
                    System.out.println("----"+name+"子聚合");
                    Map<String, Aggregation> subAggs = aggregations.asMap();
                    for (Map.Entry<String, Aggregation> sub : subAggs.entrySet()) {
                        recursionAgg(sub.getKey(),sub.getValue());
                    }
                }
                System.out.println(bucket.getKeyAsString());
                System.out.println(bucket.getDocCount());
            }
        }else {
            System.out.println("...");
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值