zoukankan      html  css  js  c++  java
  • 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
    }

    六、参考资料

  • 相关阅读:
    多尺度双边滤波及基于小波变换的非线性扩散
    yum安装CentOS7+nginx+php7.3+mysql5.7
    python学习之特殊魔法__getattr__,__getattribute__
    python学习之特殊魔法__get__,__set__,__delete__
    python学习之装饰器
    python学习之私有属性
    python学习之包装与授权
    python学习之生成器(generator)
    python学习之运用特殊方法,定制类
    python学习之创建迭代器对象
  • 原文地址:https://www.cnblogs.com/Zhangcsc/p/11315170.html
Copyright © 2011-2022 走看看