一、简介
ElasticSearch 是一个基于 Apache Lucene 的开源分布式搜索引擎。它通过RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单。不过,Elasticsearch 不仅仅是 Lucene 和全文搜索,我们还能这样去描述它:
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
2004年, 有一个叫Shay Banon的待业工程师跟随他的新婚妻子来到伦敦,他的妻子想在伦敦学习做一名厨师。然后他想为自己的妻子开发一个方便搜索菜谱的应用,他开始使用 Lucene 的一个早期版本。但是尝试之后,他感受到了直接使用 Lucene 开发程序的各种暴击和痛苦,于是他在 Lucene 之上,封装了一个叫作 Compass 的程序框架并且把它开源了。
后来 Shay 找到了一份跟高性能和分布式相关的工作,他在工作中渐渐发现,越来越需要一个易用的高性能、实时、分布式搜索服务,于是他决定重写Compass,将它从一个库打造成了一个独立的server,并将其改名为Elasticsearch。
Shay Banon在2010年2月发布了Elasticsearch的第一个版本。它支持分布式,可以水平扩展,增加了Restful api, 降低了全文检索的学习曲线,可以被任何编程语言调用。
2012年成立了Elasticsearch 公司,主要围绕Elasticsearch及相关软件提供商业服务和产品。2014年6月,在成立公司18个月后,该公司宣布通过C轮融资筹集7000万美元。这轮融资由新企业协会(NEA)牵头。其他投资者包括Benchmark Capital和Index Ventures。这一轮融资总计1.04亿美元。
2015年3月,Elasticsearch公司更名为Elastic。
2018年6月,Elastic提交了首次公开募股申请,估值在15亿到30亿美元之间。公司于2018年10月5日在纽约证券交易所挂牌上市。
二、安装
ElasticSearch 提供了开箱即用的功能,在 7.0 之前还需要安装 Jdk,但是 7.0 之后内置了Jdk,所以只要从官网下载相应平台的压缩包即可。
以下使用 Mac 作为演示
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-darwin-x86_64.tar.gz $ tar -zxvf elasticsearch-7.3.0-darwin-x86_64.tar.gz $ cd elasticsearch-7.3.0-darwin-x86_64
进入 elasticsearch 目录中,然后运行elasticsearch
$ ./bin/elasticsearch
如果启动一切正常,ElasticSearch 默认会监听 9200 端口,此时你可以访问本机的地址: http://localhost:9200, 会返回如下信息:
{ "name" : "chengshengzhangdeMacBook-Pro.local", "cluster_name" : "elasticsearch", "cluster_uuid" : "EsoM4PhOQzyPzGUOYH4E4A", "version" : { "number" : "7.3.0", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "de777fa", "build_date" : "2019-07-24T18:30:11.767338Z", "build_snapshot" : false, "lucene_version" : "8.1.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
ElasticSearch 文件目录如下:
三、基本概念
3.1、Cluster 集群
集群是一个或者多个节点协同工作来承载,并提供跨所有节点的索引和搜索功能。ElasticSearch 通过配置 cluster.name 来唯一标识集群,或者在命令启动时通过 -E cluster.name=my-cluster 指定。
3.2、Node 节点
节点是组成集群的一个 ElasticSearch 实例,用于存储数据并提供集群的搜索和索引功能。与集群一样,ElasticSearch 通过配置 node.name 来唯一标识一个节点,或或者在命令启动时通过 -E node.name=node1 指定。
本质上一个节点就是一个 Java 进程,一台机器上可以运行多个 ElasticSearch 进程,但是生产环境下一般建议一台机器只运行一个 ElasticSearch 实例。
3.3、Index 索引
索引是相同特性的文档集合。比如客户索引,订单索引。
3.4、Type 类型
ElasticSearch 在 7.0 之前,一个Index可以设置多个Type,但是从 6.0 开始,Type已经被 Deprecated,7.0 开始,一个索引只能创建一个 Type, 名字叫 "_doc"。
3.5、Document 文档
ElasticSearch 是面向文档的,文档是所有可搜索数据的最小单位,比如一条日志信息,一笔订单数据等。文档会被序列化成 JSON 格式,保存在 ElasticSearch 中,每个文档都会有一个UniqueID,可以在创建的时候自己指定,也可以通过 ElasticSearch 自动生成。
3.6、Primary Shard and Replicas Shard [主分片和副本]
ElasticSearch 是分布式的,为了解决索引可以存储超过一个节点机器硬件限制的数据的问题。ES 提供了将单个索引分割成多个分片的功能。ES 的分片分为 Primary Shard(主分片) and Replicas Shard(副本) 。
主分片,用户解决数据水平扩展的问题,通过主分片,可以将数据分布到集群内的所有节点上。一个分片本质上是一个运行的 Lucene 实例,主分片在索引创建时指定,后续不允许修改,除非进行 Reindex。
副本,用以解决数据高可用的问题,副本是主分片的拷贝。副本分片数,可以进行动态调整,增加副本数,可以在一定程度上提供服务的可用性(读取的吞吐)。
四、重要配置
4.1、path.data 和 path.logs
如果您正在使用.zip或.tar.gz文件归档,data和logs 目录在 $ES_HOME 下。如果这些重要文件夹保留在默认位置,则Elasticsearch升级到新版本时,很有可能被删除。在生产中使用,肯定要更改数据和日志文件夹的位置:
path: logs: /var/log/elasticsearch data: /var/data/elasticsearch
补充说明:在生产环境下,应用程序的数据和日志一般需要配置到独立的磁盘分区下。比如/data目录作为独立的数据分区,/var/log作为应用程序日志分区。这样做的好处是,防止因应用程序数据或日志增长,撑爆OS分区。
4.2、cluster.name
集群名称,唯一标识一个集群,某个节点只有和集群下的其他节点共享它的 cluster.name 才能加入一个集群。默认是elasticsearch,但是应该修改为更恰当的,用于描述集群目的的名称。
cluster.name: my-cluster
一定要确保不要在不同的环境中使用相同的集群名称。否则,节点可能会加入错误的集群中。
4.3、node.name
节点名称, 唯一标识一个节点,默认情况下,Elasticsearch 将使用随机生成的uuid的前7个字符作为节点id,请注意,节点ID是持久化的,并且在节点重新启动时不会更改,因此默认节点名称也不会更改。也可以使用服务器的 HOSTNAME 作为节点的名称。
node.name: ${HOSTNAME}
4.4、node.master 和 node.data
node.master 表示节点是否参与master的选举,默认为 true。每一个节点上都保存了集群的状态,只有 Master 节点才能修改集群的状态信息。
node.data 表示节点是否是数据节点,默认是 true。负责保存分片数据。
4.5、network.host
默认情况下,ElasticSearch 仅仅绑定回环地址,比如 127.0.0.1 和 [::1], 这足以在服务器上运行单个开发节点。为了与其他服务器上的节点进行通信并形成集群,你的节点将需要绑定到非环回地址。虽然这里有很多网络相关的配置,但通常只需要配置一下 network.host。
network.host: 192.168.60.101
一旦自定义设置了 network.host ,Elasticsearch 会假定你正在从开发模式转移到生产模式,并将许多系统启动检查从警告升级到异常。
默认情况下,Elasticsearch假定您正在开发模式下工作。 如果未正确配置上述任何设置,则会向日志文件写入警告,但您将能够启动并运行Elasticsearch节点。
一旦配置了network.host之类的网络设置,Elasticsearch就会假定您正在转向生产并将上述警告升级为异常。 这些异常将阻止您的Elasticsearch节点启动。 这是一项重要的安全措施,可确保您不会因服务器配置错误而丢失数据。
五、基本操作
5.1、Index 创建文档
Type 名称约定是 _doc, 如果向指定的 /Index/doc 发送 PUT 请求,就可以在该 Index 下面增加一条记录,如果文档ID不存在,则创建新的文档。否则会先删除现有的文档,再创建新的文档,但是版本号会增加。
curl -X PUT http://localhost:9200/my_index/_doc/1 -H 'Content-Type:application/json' -d ' { "user": "zhang san", "title": "Development Engineer" }'
返回值:
{ "_index":"my_index", "_type":"_doc", "_id":"1", "_version":1, "result":"created", "_shards":{ "total":2, "successful":1, "failed":0 }, "_seq_no":0, "_primary_term":1 }
5.2 _create 新建文档
通过 _create 创建新的文档,如果文档ID存在,则会创建失败,如下:
curl -X PUT http://localhost:9200/my_index/_create/1 -H 'Content-Type:application/json' -d ' { "user": "li si", "title": "Development Engineer" }'
返回值:
{ "error":{ "root_cause":[ { "type":"version_conflict_engine_exception", "reason":"[1]: version conflict, document already exists (current version [2])", "index_uuid":"2ow9LqwSQout7C_y9dW-wA", "shard":"0", "index":"my_index" } ], "type":"version_conflict_engine_exception", "reason":"[1]: version conflict, document already exists (current version [2])", "index_uuid":"2ow9LqwSQout7C_y9dW-wA", "shard":"0", "index":"my_index" }, "status":409 }
5.3、查看文档
通过 GET 方式可以读取相应的文档。 找到文档,返回 HTTP 200, 找不到文档,返回 HTTP 404。
curl -X GET http://localhost:9200/my_index/_doc/1
返回值:
{ "_index":"my_index", "_type":"_doc", "_id":"1", "_version":2, "_seq_no":1, "_primary_term":1, "found":true, "_source":{ "user":"zhang san", "title":"Development Engineer" } }
5.4、修改文档
Update 方法不会删除原来的文档,而是实现真正的数据更新。 采用POST请求方式,Payload 需要包含在 "doc" 上。
curl -X POST http://localhost:9200/my_index/_update/1 -H 'Content-Type:application/json' -d ' { "doc": {"user": "lisi"} }'
返回值:
{ "_index":"my_index", "_type":"_doc", "_id":"1", "_version":6, "result":"updated", "_shards":{ "total":2, "successful":1, "failed":0 }, "_seq_no":6, "_primary_term":1 }
5.5、删除文档
Delete 删除文档
curl -X DELETE http://localhost:9200/my_index/_doc/1
返回值:
{ "_index":"my_index", "_type":"_doc", "_id":"1", "_version":3, "result":"deleted", "_shards":{ "total":2, "successful":1, "failed":0 }, "_seq_no":3, "_primary_term":1 }
六、参考资料