ElasticSearch 入门

1、简介

  ElasticSearch 是一个基于 Apache Lucene 的开源分布式搜索引擎。它经过RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单。不过,Elasticsearch 不只仅是 Lucene 和全文搜索,咱们还能这样去描述它:html

  • 分布式的实时文件存储,每一个字段都被索引并可被搜索
  • 分布式的实时分析搜索引擎
  • 能够扩展到上百台服务器,处理PB级结构化或非结构化数据

  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日在纽约证券交易所挂牌上市。服务器

2、安装

  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 文件目录以下:

  

3、基本概念

3.一、Cluster 集群

  集群是一个或者多个节点协同工做来承载,并提供跨全部节点的索引和搜索功能。ElasticSearch 经过配置 cluster.name 来惟一标识集群,或者在命令启动时经过 -E cluster.name=my-cluster 指定。

3.二、Node 节点

  节点是组成集群的一个 ElasticSearch 实例,用于存储数据并提供集群的搜索和索引功能。与集群同样,ElasticSearch 经过配置 node.name 来惟一标识一个节点,或或者在命令启动时经过 -E node.name=node1 指定。

  本质上一个节点就是一个 Java 进程,一台机器上能够运行多个 ElasticSearch 进程,可是生产环境下通常建议一台机器只运行一个 ElasticSearch 实例。

3.三、Index 索引

  索引是相同特性的文档集合。好比客户索引,订单索引。

3.四、Type 类型

  ElasticSearch 在 7.0 以前,一个Index能够设置多个Type,可是从 6.0 开始,Type已经被 Deprecated,7.0 开始,一个索引只能建立一个 Type, 名字叫 "_doc"。

3.五、Document 文档

  ElasticSearch 是面向文档的,文档是全部可搜索数据的最小单位,好比一条日志信息,一笔订单数据等。文档会被序列化成 JSON 格式,保存在 ElasticSearch 中,每一个文档都会有一个UniqueID,能够在建立的时候本身指定,也能够经过 ElasticSearch 自动生成。

3.六、Primary Shard and Replicas Shard [主分片和副本]

  ElasticSearch 是分布式的,为了解决索引能够存储超过一个节点机器硬件限制的数据的问题。ES 提供了将单个索引分割成多个分片的功能。ES 的分片分为 Primary Shard(主分片) and Replicas Shard(副本) 。

  主分片,用户解决数据水平扩展的问题,经过主分片,能够将数据分布到集群内的全部节点上。一个分片本质上是一个运行的 Lucene 实例,主分片在索引建立时指定,后续不容许修改,除非进行 Reindex。

  副本,用以解决数据高可用的问题,副本是主分片的拷贝。副本分片数,能够进行动态调整,增长副本数,能够在必定程度上提供服务的可用性(读取的吞吐)。

4、重要配置

4.一、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.二、cluster.name

   集群名称,惟一标识一个集群,某个节点只有和集群下的其余节点共享它的 cluster.name 才能加入一个集群。默认是elasticsearch,可是应该修改成更恰当的,用于描述集群目的的名称。

cluster.name: my-cluster

  必定要确保不要在不一样的环境中使用相同的集群名称。不然,节点可能会加入错误的集群中。

4.三、node.name

  节点名称, 惟一标识一个节点,默认状况下,Elasticsearch 将使用随机生成的uuid的前7个字符做为节点id,请注意,节点ID是持久化的,而且在节点从新启动时不会更改,所以默认节点名称也不会更改。也可使用服务器的 HOSTNAME 做为节点的名称。

node.name: ${HOSTNAME}

4.四、node.master 和 node.data

  node.master 表示节点是否参与master的选举,默认为 true。每个节点上都保存了集群的状态,只有 Master 节点才能修改集群的状态信息。

  node.data 表示节点是不是数据节点,默认是 true。负责保存分片数据。

4.五、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、基本操做

5.一、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.三、查看文档

  经过 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.四、修改文档

  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.五、删除文档

  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
}

6、参考资料

相关文章
相关标签/搜索