文档章节

ELASTICSEARCH JAVA的增删改查

arthur666
 arthur666
发布于 2017/08/10 20:45
字数 1003
阅读 94
收藏 2
点赞 1
评论 0

操作ES的对象 :TransportClient

<!--elasticsear使用的jar -->
     <dependency>
         <groupId>org.elasticsearch.client</groupId>
         <artifactId>transport</artifactId>
         <version>${elasticsearch.client.version}</version>
     </dependency>
     <!--elasticsear使用的jar -->

我的版本是5.4.0

创建 TransportClient对象

我是使用spring的bean注入的

    

@SuppressWarnings("resource")
@Bean(name="transportClient")
@Lazy
public TransportClient getTransportClient(){
   TransportClient client =null;
   try{
      Settings settings= Settings.builder().put("cluster.name", "elasticsearch").build();
      client=new PreBuiltTransportClient(settings).addTransportAddress(
                        new InetSocketTransportAddress(InetAddress.getByName("192.168.0.11"),9300));
      log.info("创建es客户端对象成功");
   }catch(Exception e){
      log.error("创建es客户端对象失败");
      log.error("失败原因:"+e.getMessage());
      System.exit(-1);
   }
   return client;
}

    创建对象那个成功后,就可以用来操作es库了,他的作用跟spring-jdbctemplate,spring-jdbctemplate一样,提供了对数据库增删改查的功能,

spring也提供了对es操作的对象叫Spring Data Elasticsearch

参考文档:

我用的就是es自己提供的对象 TransportClient

添加数据

    es的添加数据提供了多种方法,跟hql语言有点相似,都是面向对象的。

es支持批量操作的方法,为了提供效率都是用批量的对象

BulkRequestBuilder builder=transportClient.prepareBulk();

BulkRequestBuilder 对象有一个地方需要注意,因为是批量操作,es忽略了数据的不正确性,就算你的数据不对,builder也不会报错,所以在调试阶段需要先确保数据的准确性再用该对象进行操作。

插入数据,其实只需要把你的对象转成json,然后批量插入即可

@Override
public void batchAddMyZu(List<Family> list) {
    BulkRequestBuilder builder=transportClient.prepareBulk();
    for(Family family:list){
        String objstr= JSON.toJSONString(family);
        builder.add(client.prepareIndex("family","myfamily",family.getPrimaryKey()).setSource(objstr, XContentType.JSON));
    }
    builder.execute().actionGet();

System.out.println("此次插入数据的个数是 "+list.size());
}

    setSource方法里面可以指定各种插入类型,我一般都是用json格式。

删除操作

  es可以通过指定index,type,id删除数据,也支持搜索删除deleteByQuery

  1. 通过指定id删除方法
    @Override
    public void batchUndercarriageFamilies(List<String> publishIds) {
       BulkRequestBuilder builder=transportClient.prepareBulk();
       for(String publishId:publishIds){
          builder.add(transportClient.prepareDelete(FAMILY, FAMILY_MARKETFAMILY, publishId).request());
       }
       builder.get();
    }
  2. 通过deleteByQuery删除
  3. @Override
    public void delMyZu(String guid, String userId) {
       DeleteByQueryAction.INSTANCE.newRequestBuilder(transportClient)
             .source(FAMILY)
             .filter(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("zuGUID", guid)).must(QueryBuilders.termQuery("userId", userId)).must(QueryBuilders.typeQuery(FAMILY_MYFAMILY)))
             .get();
    }

QueryBuilder对象可以做任何查询

修改操作

我现在修改是根据指定索引后然后修改指定字段酱样的

@Override
public void updateMyZu_Related4MyZuValue(List<Related4MyZuValue> list) {
   BulkRequestBuilder builder=transportClient.prepareBulk();
   for(Related4MyZuValue value:list){
      try {
         XContentBuilder source=XContentFactory.jsonBuilder().startObject()
                           .field("related4ZuValue",value.getRelated4ZuValue())
                           .field("zuSalePrice",value.getZuSalePrice())
                           .endObject();
         builder.add(transportClient.prepareUpdate(FAMILY, FAMILY_MYFAMILY, value.getPrimaryKey()).setDoc(source));
      } catch (IOException e) {
         continue;
      }
   }
   builder.get();
}

我这种操作是执行id后修改该数据的related4ZuValue的值和zuSalePrice的值

查询操作

es最主要功能就是查询

QueryBuilder就是设置查询条件的对象,你可以通过他设置各种条件

随便贴几个,自己感受吧。。。。

BoolQueryBuilder boolQueryBuilder=QueryBuilders.boolQuery();
if(keyword!=null&&!keyword.equals("")){
   QueryBuilder nameBuilder=QueryBuilders.matchQuery("zuName", keyword).analyzer("ik_max_word").boost(10);
   QueryBuilder labelBuilder=QueryBuilders.matchQuery("zuLabelName", keyword).analyzer("ik_max_word").boost(10);
   QueryBuilder categoryBuilder=QueryBuilders.matchQuery("categoryName", keyword).analyzer("ik_max_word").boost(10);
   boolQueryBuilder.should(nameBuilder).should(labelBuilder).should(categoryBuilder);
}else{
   boolQueryBuilder.must(QueryBuilders.matchAllQuery());
}
SearchResponse response=transportClient.prepareSearch(FAMILY).setTypes(FAMILY_MARKETFAMILY)
      .setQuery(boolQueryBuilder)
      .setFrom((page-1)*pageSize).setSize(pageSize)
      .setExplain(true)
      .get();

SearchHits hits=response.getHits();

 

BoolQueryBuilder builders=new BoolQueryBuilder();
//加上条件
builders.must(QueryBuilders.termQuery("userId", userId));
if(relatedValue==RelatedValue.MyBuyerZu.value()){
   builders.must(QueryBuilders.nestedQuery("related4ZuValue",
         QueryBuilders.boolQuery()
                  .must(QueryBuilders.termQuery("related4ZuValue.nameValue", UserReltatedValueUtil.getUserRelatedValue(relatedValue)))
                  //.must(QueryBuilders.rangeQuery("endTime").lte(LongformStringDate(System.currentTimeMillis())))
         ,ScoreMode.None));
}else{
   builders.must(QueryBuilders.nestedQuery("related4ZuValue", QueryBuilders.termQuery("related4ZuValue.nameValue", UserReltatedValueUtil.getUserRelatedValue(relatedValue)), 
         ScoreMode.None));
}
SearchResponse response=transportClient.prepareSearch(FAMILY).setTypes(FAMILY_MYFAMILY)
      .setQuery(builders).setFrom((page-1)*pageSize)
      .setSize(pageSize)
      .get();
SearchHits hits=response.getHits();
@Override
public MarketFamily getMarketFamily(String guid) {
   MarketFamily marketFamily=new MarketFamily();
   SearchResponse response=transportClient.prepareSearch(FAMILY)
         .setTypes(FAMILY_MYFAMILY).setQuery(QueryBuilders.termQuery("zuGUID", guid))
         .setSize(1)
         .get();
   SearchHits hits=response.getHits();
   for(SearchHit hit:hits.getHits()){
      marketFamily=JSON.parseObject(hit.getSourceAsString(),MarketFamily.class);
   }
   return marketFamily;
}

取查询结果总和count

@Override
public long countMyAllZu(String userId, int relatedValue) {
   BoolQueryBuilder builders=new BoolQueryBuilder();
   builders.must(QueryBuilders.termQuery("userId", userId));
   if(relatedValue==RelatedValue.MyBuyerZu.value()){
      builders.must(QueryBuilders.nestedQuery("related4ZuValue",
            QueryBuilders.boolQuery()
                     .must(QueryBuilders.termQuery("related4ZuValue.nameValue", UserReltatedValueUtil.getUserRelatedValue(relatedValue)))
                     .must(QueryBuilders.rangeQuery("endTime").lte(LongformStringDate(System.currentTimeMillis())))
            ,ScoreMode.None));
   }else{
      builders.must(QueryBuilders.nestedQuery("related4ZuValue", QueryBuilders.termQuery("related4ZuValue.nameValue", UserReltatedValueUtil.getUserRelatedValue(relatedValue)), 
            ScoreMode.None));
   }
   SearchResponse response=transportClient.prepareSearch(FAMILY).setTypes(FAMILY_MYFAMILY)
         .setQuery(builders)
         .setSize(1)
         .get();
   SearchHits hits=response.getHits();
   return hits.getTotalHits();
}

聚合求和sum

@Override
public long getPlatformZuOrdersTotalAmount(String keyword,String startTime,String endTime) {
   BoolQueryBuilder boolQueryBuilder=QueryBuilders.boolQuery();
   if(keyword==null||keyword.equals("")){
      QueryBuilder queryBuilder=QueryBuilders.matchAllQuery();
      boolQueryBuilder.must(queryBuilder);
   }else{
      QueryBuilder zuNameBuilder=QueryBuilders.matchQuery("zuName", keyword);
      QueryBuilder buyerNameBuilder=QueryBuilders.matchQuery("buyerName", keyword);
      QueryBuilder sellerNameBuilder=QueryBuilders.matchQuery("sellerName", keyword);
      boolQueryBuilder.should(zuNameBuilder).should(buyerNameBuilder).should(sellerNameBuilder);
      
   }
   if(!startTime.equals("")){
      QueryBuilder addTimeBuilder=QueryBuilders.rangeQuery("addTime").from(startTime).to(endTime);
      boolQueryBuilder.must(addTimeBuilder);
   }
   SearchResponse response=transportClient.prepareSearch(FAMILY).setTypes(FAMILY_FAMILYORDER)
         .setQuery(boolQueryBuilder)
         .addAggregation(AggregationBuilders.sum("price").field("price"))
         .get();
   Sum sum=response.getAggregations().get("price");
   return (long) sum.getValue();
}

我是使用java操作es的,大家可以在扣扣群互相交流

要下班了,暂时更新到这里

 

 

 

© 著作权归作者所有

共有 人打赏支持
arthur666
粉丝 12
博文 19
码字总数 7305
作品 0
杨浦
前端工程师
spring boot2集成ES详解

一:运行环境 JDK:1.8 ES:5.6.4 二:学习内容 如何构建spring-data-elasticsearch环境? 如何实现常用的增删改查? 如何实现对象嵌套也就是1对多这种关系? 三:JAVA依赖环境 根据spring-...

woter
07/09
0
0
Centos6搭建elk系统,监控IIS日志

**所需程序: 服务器端:java、elasticsearch、kikbana 客 户 端:IIS、logstash** 一、服务器端(192.168.10.46)操作: 先建立一个ELK专门的目录: [root@Cent65 ~]mkdir /elk/ 上传到elk...

D杀手D
04/24
0
0
Grafana、elasticsearch、kafka、logstash和pinpoint结合

一、Grafana 1)下载安装 wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.2.0-1.x8664.rpm sudo yum localinstall grafana-4.2.0-1.x86_64.rpm 2)启动 serv......

半船水
2017/10/25
0
0
ELK 实验(二)安装Elastic Search 单节点

Linux 安装 java -version echo $JAVA_HOME 木有返回,环境没有设置好。。。 vi /etc/profile export JAVAHOME=/usr/java/jdk1.8.0162 export JREHOME=$JAVAHOME/jre export CLASSPATH=$JAV......

pcdog
04/15
0
0
centos 7 安装 elasticsearch-6.2.4

安装ES mkdir /data/software/ tar xvf elasticsearch-6.2.4.tar.gz -C /data/software/ cd /data/software/ ln -sv elasticsearch-6.2.4/ elasticsearch 或者 rpm -ivh elasticsearch-6.2.4......

会说话的鱼
07/04
0
0
The Future of Compass & ElasticSearch

Posted by: Shay Banon on 07/07/2010 Its been a long time since I blogged about Compass, and I guess its about time to discuss Compass, ElasticSearch, and how they relate to one ......

杨尚川
2015/04/08
0
0
ElasticSearch使用

安装之前,请参考https://github.com/richardwilly98/elasticsearch-river-mongodb根据你的MongoDB版本号决定需要的elasticsearch版本号和插件号。 1)安装ES 下载ElasticSearch_版本号.tar....

强子哥哥
2014/04/09
0
0
elasticsearch 集群部署

Elasticsearch是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard的方式保证数据安全,并且提供自动resharding的功能,github等大型的站点也都采用Elasticsearch作为其搜索...

wx5b30a7c097b85
06/27
0
0
Elasticsearch的配置(1)

配置Elasticsearch Elasticsearch提供良好的默认设置,只需要很少的配置。使用群集更新设置 API,可以在运行的群集上更改大多数设置 。 https://www.elastic.co/guide/en/elasticsearch/refe...

yzy121403725
06/13
0
0
elasticsearch 支持中英文搜索和混合搜索

环境: ubuntu16.04 安装: elasticsearch 5.22 1. 第一步,安装java apt-get install default-jre apt-get install default-jdk 2.第二步,安装elasticsearch. 5.22 wget https://artifacts.......

wensongyu
07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

流利阅读笔记29-20180718待学习

高等教育未来成谜,前景到底在哪里? Ray 2018-07-18 1.今日导读 在这个信息爆炸的年代,获取知识是一件越来越容易的事情。人们曾经认为,如此的时代进步会给高等教育带来众多便利。但事实的...

aibinxiao
4分钟前
2
0
第15章FTP服务搭建与配置

15.1FTP介绍 FTP多用于Windows传文件到linux rz sz在文件超过4G,就无法使用了——>安装包yum install -y install lrzsz rz把 window 上的文件传输到 linux 上 sz 把 linux 上的文件传输到 ...

Linux学习笔记
12分钟前
0
0
OSChina 周三乱弹 —— 你被我从 osc 老婆们名单中踢出了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小鱼丁:分享五月天的单曲《后来的我们 (电影《后来的我们》片名曲)》: 《后来的我们 (电影《后来的我们》片名曲)》- 五月天 手机党少年们想...

小小编辑
17分钟前
6
1
Spring Boot Admin 2.0开箱体验

概述 在我之前的 《Spring Boot应用监控实战》 一文中,讲述了如何利用 Spring Boot Admin 1.5.X 版本来可视化地监控 Spring Boot 应用。说时迟,那时快,现在 Spring Boot Admin 都更新到 ...

CodeSheep
36分钟前
0
0
Python + Selenium + Chrome 使用代理 auth 的用户名密码授权

米扑代理,全球领导的代理品牌,专注代理行业近十年,提供开放、私密、独享代理,并可免费试用 米扑代理官网:https://proxy.mimvp.com 本文示例,是结合米扑代理的私密、独享、开放代理,专...

sunboy2050
今天
0
0
实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部