ElasticSearch 入门

一、简介

  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
}

六、参考资料

 

posted @ 2019-08-07 14:43  七步丶  阅读(491)  评论(0编辑  收藏  举报