• Elastic Stack 笔记(四)Elasticsearch5.6 索引及文档管理


    博客地址:http://www.moonxy.com

    一、前言

    在 Elasticsearch 中,对文档进行索引等操作时,既可以通过 RESTful 接口进行操作,也可以通过 Java 也可以通过 Java 客户端进行操作。本文主要讲解基于 RESTful 的文档索引与管理方法,后面章节再讲面向 Java 客户端的编程方法。

    使用 RESTful API 时,主要有如下四种方式可以选择:

    方式一:可以使用终端中的 curl 命令,如果还没有安装,按照系统的不同,执行不同的安装命令,CentOS 用 yum -y install curl 安装,Ubuntu 用 sudo apt-get install curl 安装。

    方式二:可以使用 Elasticsearch-head 插件,通过切换不同的页签,可以执行不同的操作。

    方式三:Elastic Stack 官方推出的 Kibana 提供了 Dev Tools,专用于执行此类代码,其前身为 Chrome 的 Sense 插件。

    方式四:使用 Chrome 谷歌浏览器的 Sense 插件,唯一的缺点是对中文的支持不太理想,也可以使用 Postman 插件。

    以下我们方式三,使用 Kibana 提供的 Dev Tools 工具。

    在创建索引之前,首先了解 RESTful API 的调用风格,在管理和使用 ElasticSearch 服务时,常用的 HTTP 动词有下面五个:

    GET 请求:获取服务器中的对象

    相当于 SQL 的 Select 命令
    GET /blogs:列出所有博客

    POST 请求:在服务器上更新对象

    相当于 SQL 的 Update 命令
    POST /blogs/ID:更新指定的博客

    PUT 请求:在服务器上创建对象

    相当于 SQL 的 Create 命令
    PUT /blogs/ID:新建一个博客  

    DELETE 请求:删除服务器中的对象

    相当于 SQL 的 Delete 命令
    DELETE /blogs/ID:删除指定的博客

    HEAD 请求:仅仅用于获取对象的基础信息

    二、索引管理

    2.1 创建索引

    PUT blog

    返回响应结果:

    {
        "acknowledged": true,
        "shards_acknowledged": true,
        "index": "blog"
    }

    本文章内的命令,如无特别说明,默认均在 Kibana 的 Dev Tools 中执行,如下图所示:

    创建索引时,也可以在指定索引数据的 shards 分片数量 和 replicas 副本数量,如果不指定,系统会采用默认值,分别是 shards 数量为 5,replicas 数量为1。Elasticsearch 默认给一个索引设置 5 个分片和 1 个副本,一个索引的分片数一经指定后就不能再修改,副本数可以通过命令随时修改。如果想创建自定义分片数和副本数的索引,可以通过 settings 参数在索引时设置初始化信息。

    PUT blog
    {
        "settings": {
            "number_of_shards": 5,
            "number_of_replicas": 1
        }
    }

    2.2 查看索引

    使用 HTTP 的操作类型 GET,GET {index}/_settings 子句,则可以获取当前索引文件的较为详细的配置信息。

    GET blog/_settings

    返回响应结果:

    {
       "blog": {
          "settings": {
             "index": {
                "creation_date": "1527989901762",
                "number_of_shards": "5",
                "number_of_replicas": "1",
                "uuid": "HKq5wwD3S8ObJq7Q2tZn2g",
                "version": {
                   "created": "5060099"
                },
                "provided_name": "blog"
             }
          }
       }
    }

     该命令对应的 curl 命令为:

    curl -XGET 'http://192.168.56.110:9200/blog/_settings'

     或

    curl -XGET "http://192.168.56.110:9200/blog/_settings"

     以上两天 curl 命令在 Linux 上,使用单引号或者双引号包裹请求内容均可。

    但在 Windows 上只能使用第二种,即用双引号包裹,用单引号时会出现错误 curl: (1) Protocol "'http" not supported or disabled in libcurl,如下:

    C:UsersAdministrator>curl -XGET 'http://192.168.56.110:9200/blog/_settings'
    curl: (1) Protocol "'http" not supported or disabled in libcurl
    
    C:UsersAdministrator>curl -XGET "http://192.168.56.110:9200/blog/_settings"
    {"blog":{"settings":{"index":{"creation_date":"1527989901762","number_of_shards"
    :"5","number_of_replicas":"1","uuid":"HKq5wwD3S8ObJq7Q2tZn2g","version":{"create
    d":"5060099"},"provided_name":"blog"}}}}

     2.3 更新副本数

    Elasticsearch 支持修改一个已经存在索引的副本数,命令如下:

    PUT blog
    {
        "settings": {
            "number_of_replicas": 1
        }
    }

    2.4 关闭和打开索引

    一个关闭的索引将禁止读取和写入其中的数据,而一个打开的索引文件可以允许用户对其中的数据进行相应的操作。

    关闭索引:

    POST blog/_close

    打开索引:

    POST blog/_open

    2.5 删除索引

    DELETE blog

    三、文档管理

    Mapping 也称为映射,映射可分为动态映射和静态映射。在关系型数据库中写入数据之前首先要建表,在建表语句中声明字段的属性,在 Elasticsearch 中则不必如此,Elasticsearch 最重要的功能之一就是让你尽可能地开始探索数据,文档写入 Elasticsearch 中,它会根据字段的类型自动识别,这种机制称为动态映射,而静态映射则是写入数据之前对字段的属性进行手工设置。

    上面只创建了一个索引,并没有设置 mapping,查看一下索引 mapping 的内容:

    GET blog/_mapping

    返回响应结果:

    {
        "blog": {
            "mappings": {}
        }
    }

    可以看到 mapping 为空,我们只创建了一个索引,并没有进行 mapping 配置,所以 mapping 为空。

    下面给 blog 这个索引加一个 type,type name 为 article,并设置 mapping:

    POST blog/article/_mapping
    {
        "article": {
            "properties": {
                "id": {
                    "type": "text"
                },
                "title": {
                    "type": "text"
                },
                "postdate": {
                    "type": "date"
                },
                "content": {
                    "type": "text",
                    "analyzer": "ik_max_word"
                }
            }
        }
    }

    返回响应结果:

    {
        "acknowledged": true
    }

    也可以在创建索引时就定义好映射,如下:

    PUT forum
    {
        "mappings": {
            "article": {
                "properties": {
                    "id": {
                        "type": "text"
                    },
                    "title": {
                        "type": "text"
                    },
                    "postdate": {
                        "type": "date"
                    },
                    "content": {
                        "type": "text",
                        "analyzer": "ik_max_word"
                    }
                }
            }
        }
    }

    返回响应结果:

    {
      "acknowledged": true,
      "shards_acknowledged": true,
      "index": "forum"
    }

    3.1 新建文档

    此处需要注意 PUT 和 POST,一般认为 POST 方法用来创建资源(具有非幂等性),而 PUT 方法则用来更新资源(具有幂等性)。

    PUT blog/article/1
    {
        "id": "1001",
        "title": "Git简单介绍",
        "postdate": "2018-06-03",
        "content": "Git是一款免费、开源的分布式版本控制系统"
    }

    返回响应结果:

    {
      "_index": "blog",
      "_type": "article",
      "_id": "1",
      "_version": 1,
      "result": "created",
      "_shards": {
        "total": 2,
        "successful": 2,
        "failed": 0
      },
      "created": true
    }

    3.2 查看文档

    GET blog/article/1

    返回响应结果:

    {
      "_index": "blog",
      "_type": "article",
      "_id": "1",
      "_version": 1,
      "found": true,
      "_source": {
        "id": "1001",
        "title": "Git简单介绍",
        "postdate": "2018-06-03",
        "content": "Git是一款免费、开源的分布式版本控制系统"
      }
    }

    返回结果中前4个属性表明文档的位置和版本信息,found 属性表明是否查询到文档,_source 字段中是文档的内容。

    如果某个文档不存在,如下:

    GET blog/article/1008611

    返回响应结果:

    {
      "_index": "blog",
      "_type": "article",
      "_id": "1008611",
      "found": false
    }

    可以看出,found 属性值为 false,因为文档不存在,当然也就没有版本信息和 source 字段。

    使用 HEAD 命令可以检查一个索引或文档是否存在:

    HEAD blog/article/1

    返回响应结果:

    200 - OK

    如果文档存在,返回 "200 - OK",反之返回 "404 - Not Found"。

    3.3 更新文档

    POST blog/article/1/_update
    {
        "doc": {
            "title":"Git分布式版本控制工具简介"
        }
    }

    返回响应结果:

    {
      "_index": "blog",
      "_type": "article",
      "_id": "1",
      "_version": 2,
      "result": "noop",
      "_shards": {
        "total": 2,
        "successful": 2,
        "failed": 0
      }
    }

    3.4 删除文档

    DELETE blog/article/1

    返回响应结果:

    {
      "found": true,
      "_index": "blog",
      "_type": "article",
      "_id": "1",
      "_version": 3,
      "result": "deleted",
      "_shards": {
        "total": 2,
        "successful": 2,
        "failed": 0
      }
    }

    可以看到 _shards 中的 total 参数为 2,表示该文档存在与两个分片中(一个主分片,一个副本分片),successful 也为 2,表示执行成功了两个分片中的文档(表示分别从主分片中删除了一条文档,从副本分片中删除了一条文档),所以执行失败的文档数量 failed 为 0。

    3.5 批量操作

    Elasticsearch 中不仅提供了一个一个操作文档文档的 API,还提供了文档的批量操作机制,通过 Bulk API 可以执行批量索引、批量删除、批量更新等操作。

    可以从 https://github.com/bly2k/files/blob/master/accounts.zip 下载一个样本数据集,然后解压到 /opt/elk 目录下,然后批量索引文档:

    [root@masternode elk]# pwd
    /opt/elk
    [root@masternode elk]# ll
    total 240
    -rwxr-xr-x   1 root   root   244848 Jun  3 20:15 accounts.json
    drwxr-xr-x.  9 esuser esuser    155 May 26 23:08 elasticsearch-5.6.0
    drwxrwxr-x  12 esuser esuser    232 Sep  7  2017 kibana-5.6.0-linux-x86_64
    [root@masternode elk]# curl -XPOST 'http://192.168.56.110:9200/bank/account/_bulk?pretty' --data-binary @accounts.json

    查看索引

    GET _cat/indices?v

    返回响应结果:

    health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    green  open   forum   9M7dtsGDSTWOJAKTJxejXQ   5   1          0            0      1.5kb           810b
    green  open   moonxy  rkQ2UUsZR-iSyOIt1HJzdw   5   1          0            0      1.8kb           955b
    green  open   .kibana 1lJLwJHZTKWgbNfBpzIXXA   1   1          2            0     17.5kb          8.7kb
    green  open   blog    HKq5wwD3S8ObJq7Q2tZn2g   5   1          2            0     18.4kb          9.2kb
    green  open   bank    zFkIZRe5Rj6gwhejxV-Wog   5   1       1000            0      1.2mb        640.8kb

    四、数据查询

    4.1 返回所有文档

    GET blog/article/_search

    返回响应结果:

    {
      "took": 12,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 2,
        "max_score": 1,
        "hits": [
          {
            "_index": "blog",
            "_type": "article",
            "_id": "2",
            "_score": 1,
            "_source": {
              "id": "1002",
              "title": "SVN简介",
              "postdate": "2018-06-03",
              "content": "SVN是一款免费、开源的集中式版本控制系统"
            }
          },
          {
            "_index": "blog",
            "_type": "article",
            "_id": "1",
            "_score": 1,
            "_source": {
              "id": "1001",
              "title": "Git简单介绍",
              "postdate": "2018-06-03",
              "content": "Git是一款免费、开源的分布式版本控制系统"
            }
          }
        ]
      }
    }

    上面代码中,返回结果的 took 字段表示该操作的耗时(单位为毫秒),timed_out 字段表示是否超时,hits 字段表示命中的记录,里面子字段的含义如下。

    total:返回记录数,本例是2条。

    max_score:最高的匹配程度,本例是1.0。

    hits:返回的记录组成的数组。

    返回的记录中,每条记录都有一个_score 字段,表示匹配的程序,默认是按照这个字段降序排列。

    4.2 全文检索

    GET blog/article/_search
    {
      "query" : { "match" : { "content" : "分布式版本控制工具" }}
    }

    返回响应结果:

    {
      "took": 21,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 2,
        "max_score": 1.6194323,
        "hits": [
          {
            "_index": "blog",
            "_type": "article",
            "_id": "1",
            "_score": 1.6194323,
            "_source": {
              "id": "1001",
              "title": "Git简单介绍",
              "postdate": "2018-06-03",
              "content": "Git是一款免费、开源的分布式版本控制系统"
            }
          },
          {
            "_index": "blog",
            "_type": "article",
            "_id": "2",
            "_score": 0.80971617,
            "_source": {
              "id": "1002",
              "title": "SVN简介",
              "postdate": "2018-06-03",
              "content": "SVN是一款免费、开源的集中式版本控制系统"
            }
          }
        ]
      }
    }

    可以看到两个文档的 _score 得分不一样,含有分词项多的文档相应的得分也高。

  • 相关阅读:
    C# Trick
    DotNet Resource
    人员角色权限
    Verticles for Web Application
    Node Addon
    EventBus
    怎么实现员工和工资大数据分析,echarts+js实现
    winform怎么实现财务上凭证录入和打印
    WPF实现大数据分析
    非常经典的面试题,方案很多,一起交流学习
  • 原文地址:https://www.cnblogs.com/cnjavahome/p/9127492.html
Copyright © 2020-2023  润新知