elasticsearch6.3 +es权威指南+安装+python3操作es

1. elastic search
    1.1 官网 https://www.elastic.co/cn/products
    1.2 书 《Elasticsearch: 权威指南》 https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

2. Elasticsearch: 权威指南
    2.1 对于什么是简单,Clint 有独特的见解并且他很少出错,这对 Elasticsearch 从管理、API 设计和日常使用等各个方面的易用性上面产生了很大的影响。
    2.2 这个世界已然被数据淹没。多年来,我们系统间流转和产生的大量数据已让我们不知所措。 现有的技术都集中在如何解决数据仓库存储以及如何结构化这些数据。 这些看上去都挺美好,直到你实际需要基于这些数据实时做决策分析的时候才发现根本不是那么一回事。Elasticsearch 是一个分布式、可扩展、实时的搜索与数据分析引擎。 它能从项目一开始就赋予你的数据以搜索、分析和探索的能力,这是通常没有预料到的。 它存在还因为原始数据如果只是躺在磁盘里面根本就毫无用处。结构化搜索、数据分析、复杂的语言处理、地理位置和对象间关联关系等。 我们还将探讨如何给数据建模来充分利用 Elasticsearch 的水平伸缩性,以及在生产环境中如何配置和监视你的集群。
    2.3 写给任何想要把他们的数据拿来干活做点事情的人。不管你是新起一项目从头开始还是为了给遗留系统改造换血, Elasticsearch 都能够帮助你解决现有问题和开发新的功能,有些可能是你之前没有想到的功能。
    2.4 Elasticsearch 做了很多努力和尝试来让复杂的事情变得简单,很大程度上来说 Elasticsearch 的成功来源于此。 
    2.5 Wikipedia,Stack Overflow,GitHub 使用 Elasticsearch 对1300亿行代码进行查询
    2.6 大部分数据库在从你的数据中提取可用知识时出乎意料的低效。 当然,你可以通过时间戳或精确值进行过滤,但是它们能够进行全文检索、处理同义词、通过相关性给文档评分么? 它们从同样的数据中生成分析与聚合数据吗?最重要的是,它们能实时地做到上面的那些而不经过大型批处理的任务么?这就是 Elasticsearch 脱颖而出的地方:Elasticsearch 鼓励你去探索与利用数据,而不是因为查询数据太困难,就让它们烂在数据仓库里面。
    2.7 Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库--无论是开源还是私有。但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
    2.8 Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:
        一个分布式的实时文档存储,每个字段 可以被索引与搜索
        一个分布式实时分析搜索引擎
        能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
    2.9 第一个业务需求就是存储雇员数据。 这将会以 雇员文档 的形式存储:一个文档代表一个雇员。存储数据到 Elasticsearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。
    2.10 倒排索引:关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。
    2.11 这里列举了一些在后台自动执行的操作:
        分配文档到不同的容器 或 分片 中,文档可以储存在一个或多个节点中
        按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡
        复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失
        将集群中任一节点的请求路由到存有相关数据的节点
        集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复
    2.12 ElasticSearch 的主旨是随时可用和按需扩容。 而扩容可以通过购买性能更强大( 垂直扩容 ,或 纵向扩容 ) 或者数量更多的服务器( 水平扩容 ,或 横向扩容 )来实现。虽然 Elasticsearch 可以获益于更强大的硬件设备,但是垂直扩容是有极限的。 真正的扩容能力是来自于水平扩容--为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中。
    2.13 如果我们启动了一个单独的节点,里面不包含任何的数据和 索引,那我们的集群就是一个“包含空内容节点的集群”。
    2.14 一个运行中的 Elasticsearch 实例称为一个 节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。当一个节点被选举成为 主 节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 任何节点都可以成为主节点。我们的示例集群就只有一个节点,所以它同时也成为了主节点。作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。
    2.15 Elasticsearch 的集群监控信息中包含了许多的统计数据,其中最为重要的一项就是 集群健康 , 它在 status 字段中展示为 green 、 yellow 或者 red 。
        GET /_cluster/health
    2.16 添加索引:往 Elasticsearch 添加数据时需要用到 索引 —— 保存相关数据的地方。 索引实际上是指向一个或者多个物理 分片 的 逻辑命名空间 。
    2.17 一个 分片 是一个底层的 工作单元 ,它仅保存了 全部数据中的一部分。一个分片是一个 Lucene 的实例,以及它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。一个分片可以是 主 分片或者 副本 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。技术上来说,一个主分片最大能够存储 Integer.MAX_VALUE - 128 个文档,但是实际最大值还需要参考你的使用场景:包括你使用的硬件, 文档的大小和复杂程度,索引和查询文档的方式以及你期望的响应时长。一个副本分片只是一个主分片的拷贝。 副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。
    2.18 在包含一个空节点的集群内创建名为 blogs 的索引。 索引在默认情况下会被分配5个主分片, 但是为了演示目的,我们将分配3个主分片和一份副本(每个主分片拥有一个副本分片):
        PUT /blogs
        {
            "settings" : {
              "number_of_shards" : 3,
              "number_of_replicas" : 1
            }
        }

    2.19 在同一个节点上既保存原始数据又保存副本是没有意义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。
    2.20 当集群中只有一个节点在运行时,意味着会有一个单点故障问题——没有冗余。 幸运的是,我们只需再启动一个节点即可防止数据丢失。为了测试第二个节点启动后的情况,你可以在同一个目录内,完全依照启动第一个节点的方式来启动一个新节点(参考安装并运行 Elasticsearch)。多个节点可以共享同一个目录。当你在同一台机器上启动了第二个节点时,只要它和第一个节点有同样的 cluster.name 配置,它就会自动发现集群并加入到其中。 但是在不同机器上启动节点的时候,为了加入到同一集群,你需要配置一个可连接到的单播主机列表。 详细信息请查看最好使用单播代替组播
    2.21 文档元数据 
        一个文档不仅仅包含它的数据 ,也包含 元数据 —— 有关 文档的信息。 三个必须的元数据元素如下:
        _index
        文档在哪存放
        _type
        文档表示的对象类别
        _id
        文档唯一标识
    2.22 一个文档的 _index 、 _type 和 _id 唯一标识一个文档。 我们可以提供自定义的 _id 值,或者让 index API 自动生成。
    2.23 乐观并发控制 Elasticsearch 是分布式的。当文档创建、更新或删除时, 新版本的文档必须复制到集群中的其他节点。Elasticsearch 也是异步和并发的,这意味着这些复制请求被并行发送,并且到达目的地时也许 顺序是乱的 。 Elasticsearch 需要一种方法确保文档的旧版本不会覆盖新的版本。当我们之前讨论 index , GET 和 delete 请求时,我们指出每个文档都有一个 _version (版本)号,当文档被修改时版本号递增。 Elasticsearch 使用这个 _version 号来确保变更以正确顺序得到执行。如果旧版本的文档在新版本之后到达,它可以被简单的忽略。
    2.24 文档的部分更新 update 请求最简单的一种形式是接收文档的一部分作为 doc 的参数, 它只是与现有的文档进行合并。对象被合并到一起,覆盖现有的字段,增加新的字段。 
    2.25 与 mget 可以使我们一次取回多个文档同样的方式, bulk API 允许在单个步骤中进行多次 create 、 index 、 update 或 delete 请求。 如果你需要索引一个数据流比如日志事件,它可以排队和索引数百或数千批次。
    2.26 当索引一个文档的时候,文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存储在分片 1 还是分片 2 中呢?首先这肯定不会是随机的,否则将来要获取文档的时候我们就不知道从何处寻找了。实际上,这个过程是根据下面这个公式决定的:shard = hash(routing) % number_of_primary_shards ,routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。 routing 通过 hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到 余数 。这个分布在 0 到 number_of_primary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置。
    2.27 搜索——最基本的工具  我们可以将一个 JSON 文档扔到 Elasticsearch 里,然后根据 ID 检索。但 Elasticsearch 真正强大之处在于可以从无规律的数据中找出有意义的信息——从“大数据”到“大信息”。Elasticsearch 不只会存储(stores) 文档,为了能被搜索到也会为文档添加索引(indexes) ,这也是为什么我们使用结构化的 JSON 文档,而不是无结构的二进制数据。文档中的每个字段都将被索引并且可以被查询 。不仅如此,在简单查询时,Elasticsearch 可以使用 所有(all) 这些索引字段,以惊人的速度返回结果。这是你永远不会考虑用传统数据库去做的一些事情。
    2.28 空搜索编辑 搜索API的最基础的形式是没有指定任何查询的空搜索 ,它简单地返回集群中所有索引下的所有文档:GET /_search
    2.29 Elasticsearch 中的数据可以概括的分为两类:精确值和全文。精确值 如它们听起来那样精确。例如日期或者用户 ID,但字符串也可以表示精确值,例如用户名或邮箱地址。对于精确值来讲,Foo 和 foo 是不同的,2014 和 2014-09-15 也是不同的。另一方面,全文 是指文本数据(通常以人类容易识别的语言书写),例如一个推文的内容或一封邮件的内容。
    2.30 倒排索引编辑 Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
    2.31 映射 为了能够将时间域视为时间,数字域视为数字,字符串域视为全文或精确值字符串, Elasticsearch 需要知道每个域中数据的类型。这个信息包含在映射中。如 数据输入和输出 中解释的, 索引中每个文档都有 类型 。每种类型都有它自己的 映射 ,或者 模式定义 。映射定义了类型中的域,每个域的数据类型,以及Elasticsearch如何处理这些域。映射也用于配置与类型有关的元数据。
    2.32 查看映射 通过 /_mapping ,我们可以查看 Elasticsearch 在一个或多个索引中的一个或多个类型的映射 。在 开始章节 ,我们已经取得索引 gb 中类型 tweet 的映射:
GET /gb/_mapping/tweet
    2.33 自定义域映射 尽管在很多情况下基本域数据类型 已经够用,但你经常需要为单独域自定义映射 ,特别是字符串域。
    2.34 复杂核心域类型 除了我们提到的简单标量数据类型, JSON 还有 null 值,数组,和对象,这些 Elasticsearch 都是支持的。


3. 部署es
    3.1 操作系统  ubuntu 16.04 2核16g,按量付费。
    3.2 机器配置
        root:2018ESawe
        ssh -o ServerAliveInterval=10 root@101.*.*.66
    3.3 先安装jdk 1.8
    3.3 获取es源码
        https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz
    3.5 创建用户,es不能用root用户启动,必需创建新用户
        adduser esuser
        esuser:123BN
        su esuser
    3.4 tar xvf elasticsearch-6.3.1.tar.gz
    3.5 进入./elasticsearch-6.3.1/bin,执行./elasticsearch,log输出稳定后,表明es启动成功了。
    3.6 另开一个命令行,以http方式执行rest,以操作es
    3.7 例子:获取es的基础信息 
        curl 'http://localhost:9200/?pretty' 
        curl 'http://localhost:9200/?' 
        两个任选一个
    3.8 curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
        VERB 适当的 HTTP 方法 或 谓词 : GET`、 `POST`、 `PUT`、 `HEAD 或者 `DELETE`。
        PROTOCOL http 或者 https`(如果你在 Elasticsearch 前面有一个 `https 代理)
        HOST Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。
        PORT 运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。
        PATH API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。
        QUERY_STRING 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)
        BODY 一个 JSON 格式的请求体 (如果请求需要的话)
        例如,计算文档数量   curl -XGET 'http://localhost:9200/_count?pretty' -d '{"query":{"match_all":{}}}'
        注意,在有些机器上,执行这个命令可能会报错,形如"Content-Type header [application/x-www-form-urlencoded] is not supported",加参数
        curl -XGET 'http://localhost:9200/_count?pretty'  -H 'Content-Type: application/json'-d '{"query":{"match_all":{}}}'
        后面的-d可以换行写,可读性更好。
        所有的curl命令,都可以进行在kibana执行,形式更简单一些,比如上述命令就是 GET /_count?pretty

4.kibana:es可视化
    4.1 安装kibana
        参考文献  https://www.elastic.co/guide/en/kibana/6.3/console-kibana.html#console-kibana
        wget https://artifacts.elastic.co/downloads/kibana/kibana-6.3.1-linux-x86_64.tar.gz 
        tar -xzf kibana-6.3.1-linux-x86_64.tar.gz
        cd kibana-6.3.1-linux-x86_64/
    4.2 启动kibana
        ./bin/kibana
    4.3 kibana端口5601,要ecs的安全组开放这个端口
        浏览器打开 http://101.*.*.66:5601
        注意,要修改配置server.host="0.0.0.0",否则无法从外网访问。
    4.4 在浏览器,打开dev tools --> console,进入执行界面。
        所有的命令,都在这里执行。
    4.5 console 执行 "GET _search",获取es基本信息  
    4.6 console 执行 "GET /_cat/nodes?v",检查es节点
    4.7 GET /_cat/indices?v   #列出所有节点
    4.8 创建索引
        4.8.1 PUT /customer?pretty  #创建索引 
        4.8.2 GET /_cat/indices?v   #检查创建结果
    4.9 创建一个文档,也就是索引一个文档  #索引是动词,这里会自动创建一个索引 megacorp
        PUT /megacorp/employee/1
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}
    4.10 获取雇员  GET /megacorp/employee/1
    4.11 搜索雇员
        GET /megacorp/employee/_search?

5. py3 操作 elastic rearch
    5.1 pip3 install elasticsearch
    5.2 一个简单的demo

#!/usr/bin/env python3
 
from elasticsearch import Elasticsearch
 
es = Elasticsearch([{'host':'localhost','port':9200}])
 
res = es.search()
for i in res:
    print(i,":",res[i])

猜你喜欢

转载自blog.csdn.net/weixin_42126327/article/details/81206827