` es(一) | 听云轩

es(一)

    Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;可以处理PB级别的数据。

1、工作原理

    当ES的节点启动以后,它会利用多播寻找集群中的其他节点,并与之建立起连接:

eTKgr6.png

2、相关概念

  • 集群

    ES可以作为一个独立的单个搜索服务器,不过为了处理大量的数据集,实现容错和高可用性,ES可以运行在许多相互合作的服务器上,这些服务器的集合叫做集群。

  • 节点

    形成服务器集群的每个服务器叫做节点,它存储你的数据,并参与集群的索引和搜索。和集群一样,节点也是通过唯一的名字去区分,默认名字是一个随机的UUID,当服务器启动的时候就会设置到节点。当然也可以自定义节点的名称。名称对于管理员来说十分重要,它可以帮助你辨认出集群中的各个服务器与哪个节点相对应。

    节点通过配置集群的名称,就可以加入到集群中。默认,节点都加入到一个叫elasticsearch的集群,这意味着如果你在网络中启动了大量的节点,并且假如他们都能相互通讯的话,那么他们将会被自动的加入到一个叫elasticsearch集群。

  • 分片(shard)

    当有大量文档的时候,由于内存的限制,磁盘处理能力不足,无法足够快的响应客户端的请求等,一个节点可能不够,这种情况下,数据可以分成较小的分片,每个分片放在不同的服务器上,当你查询的索引分布在多个分片上的时候,ES会把查询发送给相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。

  • 副本

    为提高查询吞吐量或实现高可用,可以使用分片副本。副本是一个分片的精确复制,每个分片可以有一个或者多个副本,es中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。

  • 全文检索

    全文检索就是对一篇文章进行索引,可以根据关键字进行搜索,它把内容根据词的意义进行分词,然后分别创建索引。

  • 索引

    索引 (index)是许多文档的集合,这些文档都具备一些相似的特征。

  • 类型

    类型是索引的一个逻辑分类或者划分。

  • 文档

    文档是可以被索引的基本单位。文档使用一种互联网广泛存在的数据交换格式保存(json),尽管文档本质是存放在索引中,但实际是被索引到一个索引中的一个类型中。

3、与mysql的对比(可能并不准确,为了便于理解)

eT8TzQ.png

4、索引的基本操作:

新建一个index可以直接向elasticsearch服务器发出PUT请求。比如:

1
curl -X PUT 'localhost:9200/weather'

创建成功以后会返回一个json:

eTYDiV.png

如果加上一个pretty表示美化json格式的返回结果:

eTYcM4.png

此时查询索引:

1
curl -X GET 'localhost:9200/_cat/indices?v'

eTtMy4.png

    可以看见我们刚才创建的index,但是状态是yellow,这是因为还有一个复制分片没有下发还没有被分发,就是说es默认在索引中创建一个复制分片,因为这个时候我们仅仅运行一个节点,并且在没有新的节点加入集群之前,这个复制分片是不可以被分发的(复制分片和主分片不能在同一个节点上)。这个复制分片一旦被分配到第二节点中,集群的健康状态就会变成green。

其中各字段表示的意义:

index:索引名
UUID:UUID值
pri:主分片数
rep:副本分片数
docs.count:文档数
docs.deleted:删除文档数
store.size:全部分片存储大小
pri.strore:主分片存储大小

删除索引:

1
curl -X DELETE 'localhost:9200/weather'

5、文档基本操作

创建文档:

    创建一个文档,我们必须告诉es,要把文档保存到索引的哪个类型中。比如将一个简单的文档索引到customer索引的external类型中,并把文档的ID设置为1:

eTd2Us.png

    需要说明的是,如果你在创建一个文档之前,索引不存在,它会自动给你创建。然后用GET查询:

eTwMZQ.png

    查看所有已经创建好的文档:

1
curl -X GET 'localhost:9200/weather/external/_search?pretty'

eT0ClV.png

total:返回的记录数

max_score:最高的匹配程度

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

6、索引/替换文档

    如果我们创建已经存在的ID的文档,则新的这个文档会替换以前的文档,索引新文档的时候,如果没有指定一个id,es会随机为文档生成一个随机的id,实际生成的id将会保存在调用api接口的返回结果中。此时,如果索引文档没有指定id,我们需要用POST方法取代之前的 PUT方法。

eT7sMT.png

7、更新文档

    es更新文档在底层是删除旧的文档然后索引新的文档,比如先创建好一个dzl的文档,只有name一个字段,然后更新:

eTbJEQ.png

    此时增加了一个新的字段。

8、批处理

    通过_bulk API批量执行,它会使用一种非常有效的机制去执行多个操作,使其能够尽可能快并且减少网络往返次数。比如通过一个bulk操作索引两个文档:

eTLzNQ.png

    其中,每两行构成一次操作,第一行是操作类型:可以是index,create,update或者是delete。第二行就是可选的数据体,不同的操作类型,第二行里面的可选的数据体是不一样的:

  • index 和 create 第二行是source数据体
  • delete 没有第二行
  • update 第二行可以是partial doc,upsert或者是script

    需要注意的是,每一行都必须要有一个换行符,所以json格式只能在一行里面不能使用格式化后的内容。

关于_bulk的请求路径:

(1) /_bulk

(2)/{index}/_bulk

(3)/{index}/{type}/_bulk

    如果提供了index和type那么数据体里面的action就可以不提供,缺少type需要在数据体里面去添加。

此外,还有几个参数可以用来控制一些操作:

(1)数据体里面可以使用_version字段

(2)数据体里面可以使用_routing字段

(3)可以设置wait_for_active_shards参数,数据拷贝到多个shard之后才进行bulk操作

(4)refresh控制多久间隔多搜索可见

    删除操作没有第二行数据体,因为他只需要知道文档的id就行。
如:{“delete”:{“_id”:“2”}}’

    批量API会按顺序的执行所有的操作,如果某个操作因为某些原因执行失败,它会继续执行剩下的操作。api返回结果的时候,会提供每一个操作的状态。

------ 本文结束 ------
您的支持将鼓励我继续创作