一、ES简介
ElasticSearch基于Lucene,而Lucene是apache软件基金会项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,在2000年开始开 发,于2001年9月加入到Apache软件基金会的 Jakarta家族中,作者是Doug Cutting。因此,ES也是开源的。ES提供了一个分布式、多用户能力的全文搜索引擎,api采用RESTful方式设计,同时ES基于java而开发,高可用,企业级的搜索引擎。
二、下载及安装
1.因为ES是基于java的,所以需要去安装java的环境。具体请参考:http://jingyan.baidu.com/article/e75aca85b29c3b142edac6a8.html
2.请下载对应环境的es包并解压。地址:http://www.elasticsearch.org/download/
3.测试es是否可用。win+R输入cmd进入,cd到解压缩后的bin目录如D:\elasticsearch-5.2.1\bin(win10需要先切换盘到 解压缩的盘再cd)。命令行中输入elasticsearch.bat运行。之后会打开一个es节点,类似下图:
此时,表明es的已经开启。可以通过浏览器进行测试。此处,假设已经配置了本地的环境。浏览器中输入localhost:9200 结果如下:
4.这里比较推荐读者安装elasticsearch-head插件,安装与前几代版本不太一样,可以参考:http://blog.youkuaiyun.com/yx1214442120/article/details/55102298
三、ES基础概念
1.集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。在产品环境中显式地设定这个名字是一个好习惯,但是使用默认值来进行测试/开发也是不错的。
2.节点(node)
一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于Elasticsearch集群中的哪些节点。一个集群可以拥有任意多个节点。
3.索引(index)
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,如果你想,可以定义任意多的索引。
4.类型(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
5.文档(document)
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。
6.分片和复制(shards & replicas)
Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。分片的重要性在于:①允许你水平分割/扩展你的内容容量。 ②允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。
在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。复制的重要性在于:①在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要分片置于同一节点上。②扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行。
四、ES基本命令入门
curl 命令需要安装(已安装请忽略,或者自行安装其他工具)。参考:http://jingyan.baidu.com/article/7e440953c9691b2fc0e2effa.html
1.集群健康
使用curl访问本地的ES。curl 127.0.0.1/_cat/health?v 结果如下:
可以看到,我们集群的名字是“elasticsearch”,正常运行,并且状态是绿色。 当我们询问集群状态的时候,我们要么得到绿色、黄色或红色。绿色代表一切正常(集群功能齐全),黄色意味着所有的数据都是可用的,但是某些复制没有被分配(集群功能齐全),红色则代表因为某些原因,某些数据不可用。注意,即使是集群状态是红色的,集群仍然是部分可用的(它仍然会利用可用的分片来响应搜索请求),但是可能你需要尽快修复它,因为你有丢失的数据。
如图所示:总共有1个节点(node.total),0个分片(shards)。
2.节点列表
使用 curl 127.0.0.1:9200/_cat/nodes?v
如图所示:只有1个名字(name)为1Q1Ikir的节点。
3.索引列表使用 curl 127.0.0.1:9200/_cat/indices?v
图中表明我们没有任何节点。
4.创建索引curl -XPUT 127.0.0.1:9200/customer?pretty
上面我们使用的是PUT方式创建了一个叫customer的索引,并且让结果以pretty美观地打印。之后可以用索引列表的命令查看。
5.索引并查询一个文档为了索引一个文档,我们必须告诉Elasticsearch这个文档要到这个索引的哪个类型(type)下。将一个简单的客户文档索引刚才 的customer索引、“external”类型中,如下:(windows下不识别单引号使用双引号和反斜杠代替)
curl -XPUT localhost:9200/customer/external/1?pretty -d "{\"name\": \"John Doe\"}"
读取刚刚的索引:curl -XGET localhost:9200/customer/external/1?pretty
6.删除一个索引curl -XDELETE localhost:9200/customer?pretty
7.创建索引文档ID的指定curl -XPUT localhost:9200/customer/external/1?pretty -d "{\"name\": \"Jane\"}" 该操作将替换文档的值
curl -XPUT localhost:9200/customer/external/2?pretty -d "{\"name\": \"John\"}" 该操作将指定一个ID为2的索引
curl -XPOST localhost:9200/customer/external?pretty -d "{\"name\": \"Doe\"}" 该操作没有指定ID将随机产生ID,同时使用的是post方式
8.索引文档的更新除了替换索引文档,也可以采用更新的方式。curl -XPOST localhost:9200/customer/external/1/_update?pretty -d "{\"doc\":{\"name\": \"Jane\",\"age\":\"25\"}}" 该操作更新文档的值
curl -XPOST localhost:9200/customer/external/1/_update?pretty -d "{\"script\" : \"ctx._source.age += 5\"}" 该操作使用脚本方式更新
9.索引文档的删除curl -XDELETE localhost:9200/customer/external/2?pretty 该操作删除customer中ID为2的文档
curl -XDELETE localhost:9200/customer/external/_query?pretty -d "{\"match\":{\"name:\":\"john\"}}" 该操作删除文档名字包含john的文档
10.批处理批处理是通过使用_bulk API实现的。这个功能之所以重要,在于它提供了非常高效的机制来尽可能快的完成多个操作,与此同时使用尽可能少的网络往返。
curl -XPOST localhost:9200/customer/external/_bulk?pretty -d "{\"index\":{"\_id\":\"1\"}}{\"name\":\"a\"}{\"index\":{\"_id\":\"3\"}}{\"name\":\"b\"}"
五、结语
在此仅介绍简单的环境安装和命令方便读者入门,linux的安装与windows类似,要想进阶请阅读权威指南或参考其他博文。