Elasticsearch索引的创建、数据的增删该查操作

  上一章节已经在Linux系统上安装Elasticsearch并且可以外网访问,这节主要通过Java代码操作Elasticsearch

1、创建Maven工程

  添加pom依赖,pom.xml代码如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sun.elasticsearch</groupId>
    <artifactId>Elasticsearch01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <!-- Elasticsearch核心依赖包 -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- 日志依赖 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.0</version>
        </dependency>
    </dependencies>
</project>

2、通过Java程序连接Elasticsearch

  需要注意的是,上一章节我们通过浏览器http://192.168.1.140:9200访问可以正常访问,这里需要知晓,9200端口是用于Http协议访问的,如果通过客户端访问需要通过9300端口才可以访问

,具体调用代码如下  

 package com.sun.elasticsearch;

 import java.net.InetAddress;
 import java.net.UnknownHostException;

 import org.elasticsearch.client.transport.TransportClient;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.transport.InetSocketTransportAddress;
 import org.elasticsearch.transport.client.PreBuiltTransportClient;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

 /**
  * Elasticsearch的基本测试
  * @ClassName: ElasticsearchTest1
  * @author sunt
  * @date 2017年11月22日
  * @version V1.0
  */
 public class ElasticsearchTest1 {

     private Logger logger = LoggerFactory.getLogger(ElasticsearchTest1.class);

     public final static String HOST = "192.168.1.140";

     public final static int PORT = 9300;//http请求的端口是9200,客户端是9300

     /**
      * 测试Elasticsearch客户端连接
      * @Title: test1
      * @author sunt
      * @date 2017年11月22日
      * @return void
      * @throws UnknownHostException
      */
     @SuppressWarnings("resource")
     @Test
     public void test1() throws UnknownHostException {
         //创建客户端
         TransportClient client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddresses(
                                  new InetSocketTransportAddress(InetAddress.getByName(HOST),PORT));

         logger.debug("Elasticsearch connect info:" + client.toString());

         //关闭客户端
         client.close();
     }
 }    

3、Elasticsearch索引库的创建

  为了简化代码,我们在修改Junit测试类,在方法执行之前连接Elasticsearch,方法调用之后自动执行关闭Elasticsearch,通过@Before和@After注解实现,具体代码如下

 private Logger logger = LoggerFactory.getLogger(ElasticsearchTest2.class);

     public final static String HOST = "192.168.1.140";

     public final static int PORT = 9300; //http请求的端口是9200,客户端是9300

     private TransportClient client = null;
     /**
      * 获取客户端连接信息
      * @Title: getConnect
      * @author sunt
      * @date 2017年11月23日
      * @return void
      * @throws UnknownHostException
      */
     @SuppressWarnings({ "resource", "unchecked" })
     @Before
     public void getConnect() throws UnknownHostException {
         client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddresses(
                  new InetSocketTransportAddress(InetAddress.getByName(HOST),PORT));
         logger.info("连接信息:" + client.toString());
     }

     /**
      * 关闭连接
      * @Title: closeConnect
      * @author sunt
      * @date 2017年11月23日
      * @return void
      */
     @After
     public void closeConnect() {
         if(null != client) {
             logger.info("执行关闭连接操作...");
             client.close();
         }
     }

创建索引库:

/**
     * 创建索引库
     * @Title: addIndex1
     * @author sunt
     * @date 2017年11月23日
     * @return void
     * 需求:创建一个索引库为:msg消息队列,类型为:tweet,id为1
     * 索引库的名称必须为小写
     * @throws IOException
     */
    @Test
    public void addIndex1() throws IOException {
        IndexResponse response = client.prepareIndex("msg", "tweet", "1").setSource(XContentFactory.jsonBuilder()
                .startObject().field("userName", "张三")
                .field("sendDate", new Date())
                .field("msg", "你好李四")
                .endObject()).get();

        logger.info("索引名称:" + response.getIndex() + "\n类型:" + response.getType()
                    + "\n文档ID:" + response.getId() + "\n当前实例状态:" + response.status());
    }

PS: 索引库名称必须为小写,如果为大写会包如下错误信息

第二、Elasticsearch是5.5.2版本,最新的6.0版本代码运行会报如下错误,折腾了半天还是没有调试成功,最后无奈只能换为5.5.2版本,

这里重点说明,可能当初写的比较粗略,这里指得版本号是安装软件的版本号,maven版本号最好跟软件的大版本号保持一致

此时运行代码控制台打印出如下结果,说明此时已经在ElasticSearch中创建成功一个为msg的索引库

4、向索引库中添加json字符串

 /**
      * 添加索引:传入json字符串
      * @Title: addIndex2
      * @author sunt
      * @date 2017年11月23日
      * @return void
      */
     @Test
     public void addIndex2() {
         String jsonStr = "{" +
                 "\"userName\":\"张三\"," +
                 "\"sendDate\":\"2017-11-30\"," +
                 "\"msg\":\"你好李四\"" +
             "}";
         IndexResponse response = client.prepareIndex("weixin", "tweet").setSource(jsonStr,XContentType.JSON).get();
         logger.info("json索引名称:" + response.getIndex() + "\njson类型:" + response.getType()
         + "\njson文档ID:" + response.getId() + "\n当前实例json状态:" + response.status());

     }

执行结果如下:CREATED说明向索引库添加数据成功

5、向索引库添加一个Map集合

 /**
      * 创建索引-传入Map对象
      * @Title: addIndex3
      * @author sunt
      * @date 2017年11月23日
      * @return void
      */
     @Test
     public void addIndex3() {
         Map<String, Object> map = new HashMap<String,Object>();
         map.put("userName", "张三");
         map.put("sendDate", new Date());
         map.put("msg", "你好李四");

         IndexResponse response = client.prepareIndex("momo", "tweet").setSource(map).get();

         logger.info("map索引名称:" + response.getIndex() + "\n map类型:" + response.getType()
         + "\n map文档ID:" + response.getId() + "\n当前实例map状态:" + response.status());
     }

执行结果:

6、向索引库添加JsonObject

 /**
      * 传递json对象
      * 需要添加依赖:gson
      * @Title: addIndex4
      * @author sunt
      * @date 2017年11月23日
      * @return void
      */
     @Test
     public void addIndex4() {
         JsonObject jsonObject = new JsonObject();
         jsonObject.addProperty("userName", "张三");
         jsonObject.addProperty("sendDate", "2017-11-23");
         jsonObject.addProperty("msg","你好李四");

         IndexResponse response = client.prepareIndex("qq", "tweet").setSource(jsonObject, XContentType.JSON).get();

         logger.info("jsonObject索引名称:" + response.getIndex() + "\n jsonObject类型:" + response.getType()
         + "\n jsonObject文档ID:" + response.getId() + "\n当前实例jsonObject状态:" + response.status());
     }

执行结果:

7、从索引库获取数据

 /**
      * 从索引库获取数据
      * @Title: getData1
      * @author sunt
      * @date 2017年11月23日
      * @return void
      */
     @Test
     public void getData1() {
         GetResponse getResponse = client.prepareGet("msg", "tweet", "1").get();
         logger.info("索引库的数据:" + getResponse.getSourceAsString());
     }

执行结果:

8、更新索引库数据

/**
     * 更新索引库数据
     * @Title: updateData
     * @author sunt
     * @date 2017年11月23日
     * @return void
     */
    @Test
    public void updateData() {
        JsonObject jsonObject = new JsonObject();

        jsonObject.addProperty("userName", "王五");
        jsonObject.addProperty("sendDate", "2008-08-08");
        jsonObject.addProperty("msg","你好,张三,好久不见");

        UpdateResponse updateResponse = client.prepareUpdate("msg", "tweet", "1")
                                        .setDoc(jsonObject.toString(),XContentType.JSON).get();

        logger.info("updateResponse索引名称:" + updateResponse.getIndex() + "\n updateResponse类型:" + updateResponse.getType()
        + "\n updateResponse文档ID:" + updateResponse.getId() + "\n当前实例updateResponse状态:" + updateResponse.status());
    }

执行结果:

更新结束之后,再次调用从索引库获取数据执行结果如下:

9、删除索引库的数据

 /**
      * 根据索引名称,类别,文档ID 删除索引库的数据
      * @Title: deleteData
      * @author sunt
      * @date 2017年11月23日
      * @return void
      */
     @Test
     public void deleteData() {
         DeleteResponse deleteResponse = client.prepareDelete("msg", "tweet", "1").get();

         logger.info("deleteResponse索引名称:" + deleteResponse.getIndex() + "\n deleteResponse类型:" + deleteResponse.getType()
         + "\n deleteResponse文档ID:" + deleteResponse.getId() + "\n当前实例deleteResponse状态:" + deleteResponse.status());
     }

执行结果:

删除之后再次执行从索引库获取数据,结果如下

索引库的数据变为null了,说明删除成功

10、完整源代码svn地址:svn://gitee.com/SunnySVN/Elasticsearch

欢迎各位加群讨论:534073451

Elasticsearch入门系列~通过Java一系列操作Elasticsearch的更多相关文章

  1. 使用Java客户端操作elasticsearch(二)

    承接上文,使用Java客户端操作elasticsearch,本文主要介绍 常见的配置 和Sniffer(集群探测) 的使用. 常见的配置 前面已介绍过,RestClientBuilder支持同时提供一 ...

  2. 使用Java客户端操作elasticsearch

    Java REST客户端有两种风格: Java低级别REST客户端(Java Low Level REST Client,以后都简称低级客户端算了,难得码字):Elasticsearch的官方low- ...

  3. Elasticsearch 入门,基本概念和操作

    基本概念 Node 与 Cluster Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例. 单个 Elastic 实例称为一个节点(nod ...

  4. ElasticSearch入门系列(一)是什么以及安装和运行

    一.是什么 ElasticSearch是一个基于Apache Lucene的开源搜索引擎. Elasticsearch: 分布式的实时文件存储,每个字段都被所用并可被搜索 分布式的实时分析搜索引擎 可 ...

  5. linux入门系列2--CentOs图形界面操作及目录结构

    上一篇文章"linux入门系列1--环境准备及linux安装"直观演示了虚拟机软件VMware和Centos操作系统的安装,按照文章一步一步操作,一定都可以安装成功.装好系统之后, ...

  6. Kafka系列三 java API操作

    使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

  7. ElasticSearch入门系列(六)分布式操作

    一.路由文档到分片 当你索引一个文档的时候,他被存储在单独一个主分片上.Elasticsearch根据一个算法来找到所在分片上. shard=hash(routing)%number_of_prima ...

  8. Java代码操作Elasticsearch

    创建maven项目,导入依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</a ...

  9. ElasticSearch 5.0.1 java API操作

    今天来说下使用ES 5.0.1的API来进行编码. 开始之前,简单说下5.0.1跟之前的几个变化.之前的ES自身是不支持delete-by-query的,也就是通过查询来删除,可以达到批量的效果,是因 ...

随机推荐

  1. 当我们谈论Erlang Maps时,我们谈论什么 Part 1

         Erlang 添加 Maps数据类型并非非常突然,由于这个提议已经进行了2~3年之久,仅仅只是Joe Armstrong老爷子近期一篇文章Big changes to Erlang掀起不小了 ...

  2. Redis封装之Hash

    RedisHashService: /// <summary> /// Hash:类似dictionary,通过索引快速定位到指定元素的,耗时均等,跟string的区别在于不用反序列化,直 ...

  3. lslpp 总结

    lslpp action 字段状态值: APPLY应用文件集 CLEANUP清理文件集进行 COMMIT提交文件集 REJECT拒绝指定文件集     status 字段状态值: 标识安装操作历史记录 ...

  4. 昼猫笔记 -- 面向对象(II) - 继承

    继承 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念. 所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现,还有就是js可以 ...

  5. SSH—指定登录的IP

    设置ssh安全--指定的IP登陆 为了服务器更加具有安全性,我们可以设置ssh安全只允许用户从固定的IP进行登陆, 首先获取要登录服务器的电脑的IP地址 登录http://www.ip138.com/ ...

  6. libc.so.6: version GLIBC_2.14 not found

    https://blog.csdn.net/heylun/article/details/78833050

  7. 【Henu ACM Round#17 E】Tree Construction

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 做这题之前先要知道二叉排序树的一个性质. 就是它的中序遍历的结果就是这个数组升序排序. (且每个节点的左边的节点都是比这个节点的值小 ...

  8. JAVA实现排队论

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/50401727 http://www.llwjy.com/blogdetail/3 ...

  9. 最简单的基于FFmpeg的移动端样例:Android 视频转码器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

  10. MongoDB + node-mongoskin简单演示样例

    特点 无模式 MongoDB 中的每一条文档,都是一个 JSON 对象,因此你无需提前定义一个集合的结构,集合中的每一个文档也能够有不同的结构. 异步写入 MongoDB 默认全部的写操作都是『不安全 ...