ElasticSearch 是一个基于 Apache Lucene 的开源分布式搜索引擎。它经过RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单。不过,Elasticsearch 不只仅是 Lucene 和全文搜索,咱们还能这样去描述它:html
2004年, 有一个叫Shay Banon的待业工程师跟随他的新婚妻子来到伦敦,他的妻子想在伦敦学习作一名厨师。而后他想为本身的妻子开发一个方便搜索菜谱的应用,他开始使用 Lucene 的一个早期版本。可是尝试以后,他感觉到了直接使用 Lucene 开发程序的各类暴击和痛苦,因而他在 Lucene 之上,封装了一个叫做 Compass 的程序框架而且把它开源了。node
后来 Shay 找到了一份跟高性能和分布式相关的工做,他在工做中渐渐发现,愈来愈须要一个易用的高性能、实时、分布式搜索服务,因而他决定重写Compass,将它从一个库打形成了一个独立的server,并将其更名为Elasticsearch。编程
Shay Banon在2010年2月发布了Elasticsearch的第一个版本。它支持分布式,能够水平扩展,增长了Restful api, 下降了全文检索的学习曲线,能够被任何编程语言调用。json
2012年成立了Elasticsearch 公司,主要围绕Elasticsearch及相关软件提供商业服务和产品。2014年6月,在成立公司18个月后,该公司宣布经过C轮融资筹集7000万美圆。这轮融资由新企业协会(NEA)牵头。其余投资者包括Benchmark Capital和Index Ventures。这一轮融资总计1.04亿美圆。api
2015年3月,Elasticsearch公司改名为Elastic。安全
2018年6月,Elastic提交了首次公开募股申请,估值在15亿到30亿美圆之间。公司于2018年10月5日在纽约证券交易所挂牌上市。服务器
ElasticSearch 提供了开箱即用的功能,在 7.0 以前还须要安装 Jdk,可是 7.0 以后内置了Jdk,因此只要从官网下载相应平台的压缩包便可。网络
如下使用 Mac 做为演示app
$ 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 文件目录以下:
集群是一个或者多个节点协同工做来承载,并提供跨全部节点的索引和搜索功能。ElasticSearch 经过配置 cluster.name 来惟一标识集群,或者在命令启动时经过 -E cluster.name=my-cluster 指定。
节点是组成集群的一个 ElasticSearch 实例,用于存储数据并提供集群的搜索和索引功能。与集群同样,ElasticSearch 经过配置 node.name 来惟一标识一个节点,或或者在命令启动时经过 -E node.name=node1 指定。
本质上一个节点就是一个 Java 进程,一台机器上能够运行多个 ElasticSearch 进程,可是生产环境下通常建议一台机器只运行一个 ElasticSearch 实例。
索引是相同特性的文档集合。好比客户索引,订单索引。
ElasticSearch 在 7.0 以前,一个Index能够设置多个Type,可是从 6.0 开始,Type已经被 Deprecated,7.0 开始,一个索引只能建立一个 Type, 名字叫 "_doc"。
ElasticSearch 是面向文档的,文档是全部可搜索数据的最小单位,好比一条日志信息,一笔订单数据等。文档会被序列化成 JSON 格式,保存在 ElasticSearch 中,每一个文档都会有一个UniqueID,能够在建立的时候本身指定,也能够经过 ElasticSearch 自动生成。
ElasticSearch 是分布式的,为了解决索引能够存储超过一个节点机器硬件限制的数据的问题。ES 提供了将单个索引分割成多个分片的功能。ES 的分片分为 Primary Shard(主分片) and Replicas Shard(副本) 。
主分片,用户解决数据水平扩展的问题,经过主分片,能够将数据分布到集群内的全部节点上。一个分片本质上是一个运行的 Lucene 实例,主分片在索引建立时指定,后续不容许修改,除非进行 Reindex。
副本,用以解决数据高可用的问题,副本是主分片的拷贝。副本分片数,能够进行动态调整,增长副本数,能够在必定程度上提供服务的可用性(读取的吞吐)。
若是您正在使用.zip或.tar.gz文件归档,data和logs 目录在 $ES_HOME 下。若是这些重要文件夹保留在默认位置,则Elasticsearch升级到新版本时,颇有可能被删除。在生产中使用,确定要更改数据和日志文件夹的位置:
path: logs: /var/log/elasticsearch data: /var/data/elasticsearch
补充说明:在生产环境下,应用程序的数据和日志通常须要配置到独立的磁盘分区下。好比/data目录做为独立的数据分区,/var/log做为应用程序日志分区。这样作的好处是,防止因应用程序数据或日志增加,撑爆OS分区。
集群名称,惟一标识一个集群,某个节点只有和集群下的其余节点共享它的 cluster.name 才能加入一个集群。默认是elasticsearch,可是应该修改成更恰当的,用于描述集群目的的名称。
cluster.name: my-cluster
必定要确保不要在不一样的环境中使用相同的集群名称。不然,节点可能会加入错误的集群中。
节点名称, 惟一标识一个节点,默认状况下,Elasticsearch 将使用随机生成的uuid的前7个字符做为节点id,请注意,节点ID是持久化的,而且在节点从新启动时不会更改,所以默认节点名称也不会更改。也可使用服务器的 HOSTNAME 做为节点的名称。
node.name: ${HOSTNAME}
node.master 表示节点是否参与master的选举,默认为 true。每个节点上都保存了集群的状态,只有 Master 节点才能修改集群的状态信息。
node.data 表示节点是不是数据节点,默认是 true。负责保存分片数据。
默认状况下,ElasticSearch 仅仅绑定回环地址,好比 127.0.0.1 和 [::1], 这足以在服务器上运行单个开发节点。为了与其余服务器上的节点进行通讯并造成集群,你的节点将须要绑定到非环回地址。虽然这里有不少网络相关的配置,但一般只须要配置一下 network.host。
network.host: 192.168.60.101
一旦自定义设置了 network.host ,Elasticsearch 会假定你正在从开发模式转移到生产模式,并将许多系统启动检查从警告升级到异常。
默认状况下,Elasticsearch假定您正在开发模式下工做。 若是未正确配置上述任何设置,则会向日志文件写入警告,但您将可以启动并运行Elasticsearch节点。
一旦配置了network.host之类的网络设置,Elasticsearch就会假定您正在转向生产并将上述警告升级为异常。 这些异常将阻止您的Elasticsearch节点启动。 这是一项重要的安全措施,可确保您不会因服务器配置错误而丢失数据。
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 }
经过 _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 }
经过 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" } }
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 }
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 }