敞开成长之旅!这是我参加「日新计划 12 月更文挑战」的第20天,点击查看活动概况
办理 Elasticsearch 索引和文档
在 es 中,索引和文档是 REST 接口操作的最基本资源,所以对索引和文档的 办理也是咱们有必要要知道的。索引一般是以索引称号出现在 REST 恳求操作的资 源途径上,而文档是以文档 ID 为标识出现在资源途径上。映射类型_doc 也能够 以为是一种资源,但在 es7 中废除了映射类型,所以能够_doc 也视为一种接口。
索引的办理
在前面的学习中咱们现已知道,GET 用来获取资源,PUT 用来更新资源, DELETE 用来删去资源。所以对索引,GET 用来查看索引,PUT 用来创立索引,DELETE 用来删去索引,还有一个 HEAD 恳求,用来查验索引是否存在。除此之外,对索 引的办理还有
列出一切索引 GET /_cat/indices?v
封闭索引和翻开
POST /open-soft/_close
除了删去索引,还能够选择封闭它们。假设封闭了一个索引,就无法经过 Elasticsearch 来读取和写人其中的数据,直到再次翻开它。
在现实世界中,最好永久地保存应用日志,以防要查看好久之前的信息。另 一方面,在 Elasticsearch 中寄存很多数据需求增加资源。对于这种运用案例,关 闭旧的索引十分有含义。你或许并不需求那些数据,可是也不想删去它们。
一旦索引被封闭,它在 Elasticsearch 内存中唯-的痕迹是其元数据,如名字 以及分片的位置。假设有满足的磁盘空间,并且也不确认是否需求在那个数据中 再次查找,封闭索引要比删去索引更好。封闭它们会让你十分安心,永远能够重 新翻开被封闭的索引,然后在其中再次查找。
从头翻开 POST /open-soft/_open
装备索引
经过 settings 参数装备索引,索引的一切装备项都以“index”开头。索引的 办理分为静态设置和动态设置两种。
静态设置
只能在索引创立时或在状态为 closed index(闭合索引)上设置,首要装备 索引主分片、紧缩编码、路由等相关信息
index.number_of_shards 主分片数,默以为 5 , 只能在创立索引时设置,不能 修正
index.shard.check_on_startup 是否应在索引翻开前查看分片是否损坏,当查看到分片损坏将制止分片被翻开。
- false:默许值;
- checksum:查看物理损坏;
- true:查看物理和逻辑损坏,这将消耗很多内存和 CPU;
- fix:查看物理和逻辑损坏。 有损坏的分片将被集群主动删去,这或许导致数据丢掉
index.routing_partition_size 自定义路由值能够转发的意图分片数。默以为 1, 只能在索引创立时设置。此值有必要小于 index.number_of_shards
index.codec 默许运用 LZ4 紧缩办法存储数据,也能够设置为 best_compression,它运用 DEFLATE 办法以牺牲字段存储性能为价值来获得更高 的紧缩比例。
如:
put test1{
"settings":{
"index.number_of_shards":3, "index.codec":"best_compression"
}
}
动态设置
经过接口_settings
进行,一同查询装备也经过这个接口进行,比方:
- get _settings
- get /open-soft/_settings
- get /open-soft,test1/_settings
装备索引则经过以下指令,比方 修正test1 的往磁盘改写数据的频率:
put test1/_settings { "refresh_interval":"2s" }
常用的装备参数如下:
- index.number_of_replicas 每个主分片的副本数。默以为 1
- index.auto_expand_replicas 根据可用节点的数量主动分配副本数量,默以为 false(即禁用此功用)
- index.refresh_interval 履行改写操作的频率。默以为 1s。能够设置为 -1 以 禁用改写。
- index.max_result_window 用于索引查找的 from+size 的最大值。默以为 10000
- index.blocks.read_only 设置为 true 使索引和索引元数据为只读,false 为 答应写入和元数据更改。
- index.blocks.read 设置为 true 可禁用对索引的读取操作
- index.blocks.write 设置为 true 可禁用对索引的写入操作
- index.blocks.metadata 设置为 true 可禁用索引元数据的读取和写入
- index.max_refresh_listeners 索引的每个分片上可用的最大改写侦听器数
- index.max_docvalue_fields_search 一次查询最多包含敞开 doc_values 字段 的个数,默以为 100
- index.max_script_fields 查询中答应的最大 script_fields 数量。默以为 32。
- index.max_terms_count 能够在 terms 查询中运用的术语的最大数量。默许 为 65536。
- index.routing.allocation.enable 操控索引分片分配。All(一切分片)、primaries (主分片)、new_primaries(新创立分片)、none(不分片)
- index.routing.rebalance.enable 索引的分片从头平衡机制。all、primaries、 replicas、none
- index.gc_deletes 文档删去后(删去后版本号)还能够存活的周期,默许 为 60s
- index.max_regex_length 用于正在表达式查询(regex query)正在表达式长度, 默以为 1000
装备映射
经过_mapping 接口进行,在咱们前面的章节中,现已展现过了。get /open-soft/_mapping
或许只看某个字段的特点: get /open-soft/_mapping/field/lang
修正映射,当然便是经过 put 或许 post 办法了。可是要留意,现已存在的 映射只能增加字段或许字段的多类型。可是字段创立后就不能删去,大多数参数 也不能修正,能够改的是 ignore_above。所以规划索引时要做好规划,至少初始 时的必要字段要规划好。
文档的办理
增加文档
增加文档,咱们在前面的内容现已知道了,比方:
假设增加文档时,在 Elasticsearch 中假设有相同 ID 的文档存在,则更新此文 档,比方履行
则会发现已有文档的内容被更新了。
文档的 id
当创立文档的时分,假设不指定 ID,体系会主动创立 ID。主动生成的 ID 是 一个不会重复的随机数。运用 GUID 算法,能够保证在分布式环境下,不同节点 同一时间创立的_id 一定是不冲突的。比方:
查询文档
get /open-soft/_doc/1
更新文档
前面咱们用 put 办法更新了现已存在的文档,可是能够看见他是全体更新文档,假设咱们要更新文档中的某个字段怎么办?需求运用_update 接口。
post /open-soft/_update/1/
{
"doc":{
"year": 2016
}
}
假设文档中存在 year 字段,更新 year 字段的值,假设不存在 year 字段,则会新增 year 字段,并将值设为 2016。 update 接口在文档不存在时提示错误,假设期望在文档不存在时创立文档, 则能够在恳求中增加 upsert 参数,例如:
或:
upsert 参数定义了创立新文档运用的文档内容,而 doc_as_upsert 参数的含 义是直接运用 doc 参数中的内容作为创立文档时运用的文档内容。
删去文档
delete /open-soft/_doc/1
数据检索和剖析
为了方便咱们学习,咱们导入 kibana 为咱们提供的典范数据。
增加完结,进行查询索引
目前为止,咱们现已探索了怎么将数据放入 Elasticsearch, 现在来讨论下怎么将数据从 Elasticsearch 中拿出来,那便是经过查找。毕竟,假设不能查找数据, 那么将其放入查找引擎的含义又何在呢?走运的是,Elasticsearch 提供了丰富的 接口来查找数据,涵盖了 Lucene 一切的查找功用。因为 Elasticsearch 答应构建 查找恳求的格式很灵敏,恳求的构建有无限的或许性。要了解哪些查询和过滤器 的组合适用于你的数据,最佳的办法便是进行试验,因而不要害怕在项意图数据上尝试这些组合,这样才能澄清哪些更适合你的需求。
_search 接口
一切的 REST 查找恳求运用_search 接口,既能够是 GET 恳求,也能够是 POST 恳求,也能够经过在查找 URL 中指定索引来限制范围。
_search 接口有两种恳求办法,一种是根据 URI 的恳求办法,另一种是根据 恳求体的办法,无论哪种,他们履行的语法都是根据 DSL(ES 为咱们定义的查询 言语,根据 JSON 的查询言语),仅仅形式上不同。咱们会根据恳求体的办法来 学习。比方说:
get kibana_sample_data_flights/_search { "query":{ "match_all":{} } }
或
get kibana_sample_data_flights/_search { "query":{ "match_none":{} } }
当然上面的查询没什么太多的用处,因为他们分别代表匹配一切和悉数匹配。
所以咱们经常要运用各种语法来进行查询,一旦选择了要查找的索引,就需 要装备查找恳求中最为重要的模块。这些模块涉及文档回来的数量,选择最佳的 文档回来,以及装备不期望哪些文档出现在成果中等等。
- query 这是查找恳求中最重要的组成部分,它装备了根据评分回来的最 佳文档,也包括了你不期望回来哪些文档。
- size 代表了回来文档的数量。
- from 和 size 一同运用,from 用于分页操作。需求留意的是,为了确认 第 2 页的 10 项成果,Elasticsearch 有必要要核算前 20 个成果。假设成果集合不断 增加,获取某些靠后的翻页将会成为价值高昂的操作。
- _source 指定_ source 字段怎么回来。默许是回来完整的_ source 字段。 经过装备_ source,将过滤回来的字段。假设索引的文档很大,并且无须成果中的 悉数内容,就运用这个功用。请留意,假设想运用它,就不能在索引映射中封闭 _ source 字段。
- sort 默许的排序是根据文档的得分。假设并不关怀得分,或许期望许多 文档的得分相同,增加额外的 sort 将协助你操控哪些文档被回来
成果开端和页面巨细
命名适宜的 from 和 size 字段,用于指定成果的开端点,以及每“页”成果的 数量。举个比方,假设发送的 from 值是 7,size 值是 5,那么 Elasticsearch 将回来 第 8、9、10、 11 和 12 项成果(因为 from 参数是从 0 开端,指定 7 便是从第 8 项成果开端)。假设没有发送这两个参数,Elasticsearch 默许从第一项成果开端 ( 第 0 项成果),在回复中回来 10 项成果。例如:
可是留意,from 与 size 的和不能超过 index. max_result_window 这个索引配 置项设置的值。默许情况下这个装备项的值为 10000,所以假设要查询 10000 条以 后的文档,就有必要要增加这个装备值。例如,要检索第 10000 条开端的 200 条数 据,这个参数的值有必要要大于 10200,不然将会抛出类似“ Result window is too large’的异常。
由此可见,Elasticsearch 在运用 from 和 size 处理分页问题时会将一切数据 悉数取出来,然后再截取用户指定范围的数据回来。所以在查询十分靠后的数据 时,即使运用了 from 和 size 定义的分页机制依然有内存溢出的或许,而 max_ result_ window 设置的 10000 条则是对 Elastiesearch 的一.种保护机制。
那么 Elasticsearch 为什么要这么规划呢?首先,在互联网时代的数据检索应 该经过类似度算法,进步检索成果与用户期望的符和度,而不应该让用户在检索 成果中自己选择满足的数据。以互联网查找为例,用户在浏览查找成果时很少会 看到第 3 页今后的内容。假设用户在翻到第 10000 条数据时还没有找到需求的结 果,那么他对这个查找引擎一定会十分失望。
_source 参数
元字段_source 中存储了文档的原始数据。假设恳求中没有指定_source, Elasticsearch 默许回来整个_ source, 或许假设_ source 没有存储,那么就只返 回匹配文档的元数据:_ id、_type、_index 和_score 例如:
你不只能够回来字段列表,还能够指定通配符。例如,假设想一同回来” DestCountry “和” DestWeather “字段,能够这样装备_ source: “Dest*”。 也能够使 用通配字符串的数组来指定多个通配符,例如_ source:[” Origin*”, “* Weather “]。
不只能够指定哪些字段需求回来,还能够指定哪些字段无须回来。比方:
排序
大多查找最终涉及的元素都是成果的排序( sort )。假设没有指定 sort 排序选 项,Elasticsearch 回来匹配的文档的时分,依照_ score 取值的降序来摆放,这样 最为相关的(得分最高的)文档就会排名在前。为了对字段进行升序或降序摆放,指定映射的数组,而不是字段的数组。经过在 sort 中指定字段列表或许是字段映 射,能够在恣意数量的字段上进行排序。例如:
首要参阅:享学讲堂Mark老师