• Elasticsearch快速入门案例


    写在前面的话:读书破万卷,编码如有神
    --------------------------------------------------------------------

    参考内容:

      《Elasticsearch顶尖高手系列-快速入门篇》,中华石杉

    --------------------------------------------------------------------

    主要内容包括:

    • es的document数据格式和数据库的关系型数据格式的区别
    • 简单的集群管理
    • 电商网站商品管理案例背景介绍
    • 商品的CRUD操作(document 的CRUD操作 )

    --------------------------------------------------------------------

    1、es的document数据格式和数据库的关系型数据格式的区别

    比如有如下的json:

     1 {
     2 "email":"zhangsan@sina.com",
     3 "first_name":"san",
     4 "last_name":"zhang",
     5 "info":{
     6     "bio":"curious and modest",
     7     "age":30,
     8     "interests":["bike","climb"]
     9     "join_date":"2017/01/01"
    10 }
    11 }

    es的docuement可以直接用上面的json数据格式来表达。

    但是在java中需要两个类来表达:

     1 public class Employee {
     2 
     3   private String email;
     4   private String firstName;
     5   private String lastName;
     6   private EmployeeInfo info;
     7 
     8 }
     9 
    10 private class EmployeeInfo {
    11   
    12   private String bio; // 性格
    13   private Integer age;
    14   private String[] interests; // 兴趣爱好
    15   private Date joinDate;
    16 }

    可以看出employee对象里面包含了Employee类自己的属性,而且还有一个EmployeeInfo对象。

    在数据库中的话,就需要两张表:employee表、employee_info表,将employee对象的数据重新拆开来,变成Employee数据和EmployeeInfo数据

    employee表:email,first_name,last_name,join_date,4个字段
    employee_info表:bio,age,interests,3个字段;此外还有一个外键字段,比如employee_id,关联着employee表。

    我们就明白了es的document数据格式和数据库的关系型数据格式的区别:

    • 应用系统的数据结构都是面向对象的,复杂的
    • 对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,相当麻烦
    • ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档数据结构,es可以提供复杂的索引、全文检索、分析聚合等功能
    • es的document用json数据格式来表达

    --------------------------------------------------------------------

    2、简单的集群管理

    (2.1)快速检查集群的健康状况

    在Kibana中执行如下命令:  GET _cat/health?v

    1 epoch      timestamp cluster                 status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
    2 1518657893 09:24:53  huobaopaocai-es-cluster yellow          1         1      1   1    0    0        1             0                  -                 50.0%

    如何快速的了解集群的健康状态? green、yellow、red

    • green: 每个索引的primary shard和replica shard都是active状态
    • yellow: 每个索引的primary shard都是active状态,但是部分replica shard不是active状态,处于不可用状态
    • red: 不是所有索引的primary shard都是active状态的,部分索引有数据丢失

    为什么现在我们的是处于yellow状态?

      我们现在就一个笔记本电脑,就启动了一个es进程,相当于就只有一个node。现在es中有一个index,就是kibana自己内置建立的index。由于默认的配置是给每个index分配5个primary shard和5个replica shard,而且primary shard和replica shard不能在同一台机器上(为了容错)。现在kibana自己建立的index是1个primary shard和1个replica shard。当前就一个node,所以只有1个primary shard被分配了和启动了,但是一个replica shard没有第二台机器去启动。

    (2.2)快速查看集群中有些索引

    在Kibana中执行如下命令:  GET _cat/indices?v

    1 health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    2 yellow open   .kibana CaxZ5uJGSJy3rCzv_3RIzQ   1   1          1            0      3.1kb          3.1kb

    (2.3)简单的索引操作

    创建索引: PUT /test_index?pretty

    1 {
    2   "acknowledged": true,
    3   "shards_acknowledged": true
    4 }

    再次查看索引:

    1 GET _cat/indices?v
    2 
    3 health status index      uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    4 yellow open   .kibana    CaxZ5uJGSJy3rCzv_3RIzQ   1   1          1            0      3.1kb          3.1kb
    5 yellow open   test_index i2LdlSIqRXCZQCLauVBiRw   5   1          0            0       650b           650b

    删除索引: DELETE /test_index?pretty

    {
      "acknowledged": true
    }

     再次查看索引:

    1 GET _cat/indices?v
    2 
    3 health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    4 yellow open   .kibana CaxZ5uJGSJy3rCzv_3RIzQ   1   1          1            0      3.1kb          3.1kb

    --------------------------------------------------------------------

    3、电商网站商品管理案例背景介绍

    有一个电商网站,需要为其基于ES构建一个后台系统,提供以下功能:

    • 对商品信息进行CRUD操作
    • 执行简单的结构化查询
    • 可以执行简单的全文检索,以及复杂的phrase(短语)检索
    • 对于全文检索的结果,可以进行高亮显示
    • 对数据进行简单的聚合分析

    --------------------------------------------------------------------

    4、商品的CRUD操作(document 的CRUD操作 )

    (4.1)新增商品:新增文档、建立索引

    基本语法格式:

    1 PUT /index/type/id
    2 {
    3   "json数据"
    4 }

    准备三条数据:

     1 PUT /ecommerce/product/1
     2 {
     3     "name" : "gaolujie yagao",
     4     "desc" :  "gaoxiao meibai",
     5     "price" :  30,
     6     "producer" :      "gaolujie producer",
     7     "tags": [ "meibai", "fangzhu" ]
     8 }
     9 
    10 PUT /ecommerce/product/2
    11 {
    12     "name" : "jiajieshi yagao",
    13     "desc" :  "youxiao fangzhu",
    14     "price" :  25,
    15     "producer" :      "jiajieshi producer",
    16     "tags": [ "fangzhu" ]
    17 }
    18 
    19 PUT /ecommerce/product/3
    20 {
    21     "name" : "zhonghua yagao",
    22     "desc" :  "caoben zhiwu",
    23     "price" :  40,
    24     "producer" :      "zhonghua producer",
    25     "tags": [ "qingxin" ]
    26 }

    执行每条新增语句的结果:

     1 {
     2   "_index": "ecommerce",
     3   "_type": "product",
     4   "_id": "1",
     5   "_version": 1,
     6   "result": "created",
     7   "_shards": {
     8     "total": 2,
     9     "successful": 1,
    10     "failed": 0
    11   },
    12   "created": true
    13 }

    (ps:es会自动建立index和type,不需要提前创建,而且es默认会对document每个field建立倒排索引,让其可以被搜索。)

    用java来实现往es中添加docuemnt操作

    Elasticsearch - java客户端连接

        @Autowired
        private ElasticsearchConstant elasticsearchConstant;
    
        /**
         * 新增es的docuemnt
         */
        @Test
        public void createDocumentTest() throws IOException {
            TransportClient client = elasticsearchConstant.getClient();
            IndexResponse response = client.prepareIndex(elasticsearchConstant.getEsIndex(), elasticsearchConstant.getEsType(),"1")
                    .setSource(XContentFactory.jsonBuilder()
                            .startObject()
                            .field("name","gaolujie yagao")
                            .field("desc", "gaoxiao meibai")
                            .field("price", 30)
                            .field("producer", "gaolujie producer")
                            .endObject())
                    .get();
            LOG.info(String.format("新增es的docuemnt结果: %s",response.toString()));
        }
    
    
    执行结果:
    2018-02-15 11:37:24  INFO [main] (EcommerceTest.java:56) createDocumentTest - 新增es的docuemnt结果: IndexResponse[index=ecommerce,type=product,id=1,version=1,result=created,shards={"total":2,"successful":1,"failed":0}]

    (4.2)检索索引:检索文档

    基本语法格式:

    1 GET /index/type/id

    用java来实现查询es中docuemnt操作

    Elasticsearch - java客户端连接

     1 @Autowired
     2 private ElasticsearchConstant elasticsearchConstant;
     3  
     4    /**
     5      * 查询es的document
     6      */
     7     @Test
     8     public void getDocumentTest() throws IOException{
     9         TransportClient client = elasticsearchConstant.getClient();
    10         GetResponse response = client.prepareGet(elasticsearchConstant.getEsIndex(), elasticsearchConstant.getEsType(), "1").get();
    11         LOG.info(String.format("查询es的docuemnt结果: %s",response.toString()));
    12     }
    13 
    14 执行结果:
    15 2018-02-15 11:42:19  INFO [main] (EcommerceTest.java:68) getDocumentTest - 查询es的docuemnt结果: {"_index":"ecommerce","_type":"product","_id":"1","_version":1,"found":true,"_source":{"name":"gaolujie yagao","desc":"gaoxiao meibai","price":30,"producer":"gaolujie producer"}}

    (4.3)修改商品:替换文档

    (ps:替换方式有一个不好:必须带上所有的field才能去进行信息的修改。)

    (4.4)修改商品:更新文档

    用java来实现编辑es中的docuement:

    Elasticsearch - java客户端连接

     1 @Autowired
     2 private ElasticsearchConstant elasticsearchConstant;
     3 
     4     /**
     5      * 更新es的docuemnt
     6      * @throws IOException
     7      */
     8     @Test
     9     public void  updateDocument() throws IOException {
    10         TransportClient client = elasticsearchConstant.getClient();
    11         UpdateResponse updateResponse = client.prepareUpdate(elasticsearchConstant.getEsIndex(), elasticsearchConstant.getEsType(), "1")
    12                 .setDoc(jsonBuilder()
    13                         .startObject()
    14                         .field("name", "jiaqiang gaolujie yagao")
    15                         .endObject())
    16                 .get();
    17         LOG.info(String.format("更新es的docuemnt结果: %s",updateResponse.toString()));
    18     }
    19 
    20 运行结果:
    21 2018-02-15 15:55:13  INFO [main] (EcommerceTest.java:73) updateDocument - 更新es的docuemnt结果: UpdateResponse[index=ecommerce,type=product,id=1,version=2,result=updated,shards=ShardInfo{total=2, successful=1, failures=[]}]

    (4.5)删除商品:删除文档

    用java来实现删除es中的docuement:

    Elasticsearch - java客户端连接

     1 @Autowired
     2 private ElasticsearchConstant elasticsearchConstant;
     3  
     4    /**
     5      * 删除es中的document
     6      */
     7     @Test
     8     public void deleteDocument(){
     9         TransportClient client = elasticsearchConstant.getClient();
    10         DeleteResponse response = client.prepareDelete(elasticsearchConstant.getEsIndex(), elasticsearchConstant.getEsType(), "1").get();
    11         LOG.info(String.format("删除es的docuemnt结果: %s",response.toString()));
    12     }
    13 
    14 运行结果:
    15 2018-02-15 16:00:04  INFO [main] (EcommerceTest.java:84) deleteDocument - 删除es的docuemnt结果: DeleteResponse[index=ecommerce,type=product,id=1,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]

     

     

  • 相关阅读:
    class的方式创建组件
    function创建组件
    JSX语法
    React开发
    特征的标准化和归一化
    GSpan-频繁子图挖掘算法
    Linux下的ASLR(PIE)内存保护机制
    Linux下利用Ret2Libc绕过DEP
    通过fork进程爆破canary
    通过格式化字符串漏洞绕过canary
  • 原文地址:https://www.cnblogs.com/xinhuaxuan/p/8442223.html
Copyright © 2020-2023  润新知