[ES]ElasticsearchRestTemplate的增删改查写法

org.elasticsearch.client maven 版本 6.8.4
es server版本7.9.2

  • add增加
MsgPO po = new MsgPO();                
po.setTime("2020-11-03T10:50:00+08:00");//这是加了时区的写法,没有写默认是UTC时区,显示的时候会不一致。
//省略赋值过程

// 记录全量日志,同时去除异常数据,入es库
IndexQuery indexQuery = null;
try {
    indexQuery = new IndexQueryBuilder().withIndexName().withId(po.getId())
            .withObject(po).build();    
    template.index(indexQuery);
    log.info("uuid: {} 插入es数据库成功", po.getMsgId());
} catch (Exception e) {
    log.error("uuid: {}新增数据入es库异常", po.getMsgId());
    log.error(e.getMessage(), e);
}
  • update修改
        try {
            UpdateRequest updateRequest =new UpdateRequest();
            updateRequest.retryOnConflict(1);//冲突重试
            Map<String,Object> m=new HashMap<>();
            m.put("content","110");
            updateRequest.doc(m);
            updateRequest.routing(routingID);//默认是_id来路由的,用来路由到不同的shard,会对这个值做hash,然后映射到shard。所以分片
            UpdateQuery uq = new UpdateQueryBuilder().withId(id)
                    .withDoUpsert(true)//不加默认false。true表示更新时不存在就插入
                    
                    .withClass(MsgPO.class).withUpdateRequest(updateRequest).build();
            UpdateResponse updateResponse = elasticsearchTemplate.update(uq);
            log.info("uuid: {} 插入es数据库成功 {}",id,updateResponse.getResult());
        } catch (Exception e) {
            log.error("uuid: {}新增数据入es库异常", id);
            log.error(e.getMessage(), e);
        }
  • query查询
    这里对classify做了个聚合查询,类似于msyql的 group by
    BoolQueryBuilder queryFilter = QueryBuilders.boolQuery()
                .must(QueryBuilders.rangeQuery("time").gte("2020-11-03T10:50:00+08:00").lte("2020-11-03T12:50:00+08:00");
     queryFilter.must(QueryBuilders.termQuery("name", "test"));   
        queryFilter.must(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("type", 1)).should(QueryBuilders.termQuery("type", 2)));//type=1 ||type==2
        AggregationBuilder aggregationBuilder = AggregationBuilders.terms("customer").field("classify");//根据classify做聚合
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.aggregation(aggregationBuilder);
        sourceBuilder.size(0);
        SearchRequest searchRequest = new SearchRequest("indexName");
        searchRequest.source(sourceBuilder);
        sourceBuilder.query(queryFilter);

        SearchResponse response = null;
        Map<Integer, Long> esResultMap = new HashMap<>();

        try {
            response = elasticsearchTemplate.getClient().search(searchRequest, RequestOptions.DEFAULT);
            Aggregations aggregations = response.getAggregations();
            Terms terms = aggregations.get("customer");
            List<? extends Terms.Bucket> buckets = terms.getBuckets();
            //结果汇聚
            for (Terms.Bucket bucket : buckets) {
                esResultMap.put(bucket.getKeyAsNumber().intValue(), bucket.getDocCount());
            }
            return esResultMap;
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }

多字段聚合,用了Script,性能未知

BoolQueryBuilder queryFilter = QueryBuilders.boolQuery()
        .must(QueryBuilders.rangeQuery("time").gte("2020-11-03T10:50:00+08:00");
Script script = new Script("doc['type'] +'#'+doc['classify']+'#'+doc['address']");
AggregationBuilder aggregationBuilder = AggregationBuilders.terms("customer").script(script)
.size(200);//聚合结果大小,不要搞太多,不然要分页
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(aggregationBuilder);
sourceBuilder.size(0);//具体结果大小
SearchRequest searchRequest = new SearchRequest("IndexName");
searchRequest.source(sourceBuilder);
sourceBuilder.query(queryFilter);
SearchResponse response = null;
try {
    response = elasticsearchTemplate.getClient().search(searchRequest, RequestOptions.DEFAULT);
    Aggregations aggregation = response.getAggregations();
    Terms terms = aggregation.get("customer");
    List<? extends Bucket> buckets = terms.getBuckets();
    for (Bucket bucket : buckets) {
        log.info("bucket:{} {}", bucket.getKey(), bucket.getDocCount());
    }

} catch (IOException e) {
    log.error(e.getMessage(), e);
}
  • delete 删除
        DeleteQuery deleteQuery=new DeleteQuery();
        deleteQuery.setIndex("indexName");
        deleteQuery.setType("typeName");//建index没配置就是类名全小写
        deleteQuery.setQuery(new BoolQueryBuilder().must(QueryBuilders.rangeQuery("time").lte("2020-11-03T10:50:00+08:00")));
        elasticsearchTemplate.delete(deleteQuery);

pom包

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
要在Python中进行Elasticsearch增删改查操作,你可以使用Elasticsearch的官方库elasticsearch-py来实现。下面是一个简单的例子来演示如何进行增删改查操作: 引用: 首先,你需要导入Elasticsearch库并连接到Elasticsearch服务器: ```python from elasticsearch import Elasticsearch # 连接到Elasticsearch服务器 es = Elasticsearch([ES_IP], http_auth=('elastic', '123456'), port=ES_PORT) ``` 引用: 查询数据: - 查询所有数据: ```python body = { "size": 111, # 最大显示数量,es默认展示10条 "query": { "match_all": {} } } res = es.search(index='my-index', body=body, request_timeout=30) ``` - 查询具体某个字段: ```python body = { "size": 10000, # 最大显示数量 "query": { "match": { "text": { "query": search_key, "analyzer": "ik_smart", # 用来指定搜索的词语按那种拆词粒度拆词 "operator": "or", # 按拆分后的词查询时,词与词之间是 and 还是 or 的关系 "minimum_should_match": "75%" # 该参数用来控制应该匹配的分词的最少数量,至少匹配几个词才召回查询的结果 } } } } res = es.search(index='my-index', body=body, request_timeout=30) ``` 引用: 获取拆分后的词: 你可以使用Elasticsearch的analyze API来获取拆分后的词,例如: ```python body = { "text": "惠普 p2015dn", "analyzer": "ik_max_word" } res = es.indices.analyze(index='my-index', body=body) key_list = [dic['token'] for dic in res['tokens']] print(key_list) # ['惠普', 'p2015dn', 'p', '2015', 'dn'] ``` 以上是关于在Python中使用Elasticsearch进行增删改查的基本操作。你可以根据具体的需求使用不同的查询方式,并根据返回的结果进行相应的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python 使用 Elasticsearch 增删查改](https://blog.csdn.net/Waller_/article/details/109810964)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值