《Elasticsearch技术解析与实战》读书笔记

第一章 ES入门

倒排索引:
一般表示为一个关键词,然后是它的频度、位置等信息

Lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件(positions)保存

概念

Term:索引词,一个能够被索引的精确值
Text:一段普通的非结构化文字
Analysis:将文本转换为索引词的过程,分析的结果依赖于分词器

Index:具有相同结构的文档集合
Type:在索引中,可以定义一个或多个类型,类型是索引的逻辑分区
Document:存储在ES中的一个JSON格式的字符串。类似于关系数据库中表的一行。每个存储在索引中的一个文档都有一个类型和一个ID。原始的JSON文档被存储在一个叫作_source的字段中。
Mapping:类似于关系数据库中的表结构,每一个索引都有一个映射,定义索引中每一个字段类型,以及一个索引范围内的设置。一个映射可以事先被定义,或在第一次存储文档时自动识别。
Field:文档中包含零个或者多个字段,字段可以是一个简单类型,也可以是一个数组或对象的嵌套结构。类似于关系数据库中表的列。每个字段都对应一个字段类型。字段还可以指定如何分析该字段的值。
source field:默认情况下,你的原文档将被存储在_source这个字段中,当你查询的时候也是返回这个字段。这允许你可以从搜索结果中访问原始的对象,这个对象返回一个精确的JSON字符串,这个对象不显示索引分析后的其他任何数据

Cluster:
Node:
Routing:

第二章 索引

创建索引时可以通过修改number_of_shardsnumber_of_replicas参数的数量来修改分片和副本的数量。分片默认是5个,副本默认是1个。

更新索引副本数:update-index-settings

删除索引:delete,为了防止误删除,设置elasticsearch.yml属性action.destructive_requires_name=true,禁止使用通配符或_all删除索引,必须使用名称或别名。

打开/关闭索引:POST 127.0.0.1:9200/book/_close,关闭的索引只能显示索引元数据信息,不能进行读写操作。关闭的索引会继续占用磁盘空间但不能使用,所以关闭索引接口可能造成磁盘空间浪费。禁止使用关闭索引功能,可设置settingscluster.indices.close.enable=false,默认是true。

如果指向不存在的索引会抛出错误。配置ignore_unavailable=true不显示异常。

HEAD:判断类型是否存在

索引别名

类似于数据库视图,只能增加或删除,一个别名可以关联多个索引,使用通配符模式为索引增加别名时,只对现有的索引有效,新增的索引不适用于通配符模式。

索引模板

索引模板就是创建好一个索引参数设置(settings)和映射(mapping)的模板,在创建新索引时指定模板名称就可以使用模板定义好的参数设置和映射。

模板匹配
存在template_1、template_2两个模板,使用te*会匹配2个模板,最后合并两个模板的配置。如果配置重复,这时应该设置order属性,order是从0开始的数字,先匹配order数字小的,再匹配数字大的,如果有相同的属性配置,后匹配的会覆盖之前的配置。

重建索引

拷贝文件从一个索引到另一个索引。

在接口参数中可以增加dest来进行乐观并发控制。
version_type:

  • internal会导致ES盲目转储文件到目标索引,任何具有相同类型和ID的文档将被重写
  • external将会导致Elasticsearch保护源索引的版本,如果在目标索引中有一个比源索引旧的版本,则会更新文档。对于源文件中丢失的文档在目标中也会被创建

设置op_type为create将导致_reindex在目标索引中仅创建丢失的文件。所有现有的文件将导致版本冲突。

参数:

  • pretty
  • refresh:会导致所有写入请求的索引被刷新。与索引接口中的refresh参数不同,只有接收到新数据的分片会进行刷新
  • wait_for_completion:设置为false时,ES将进行执行前检查后启动请求,然后返回一个task可用于任务API取消或得到任务的状态,现在一旦请求完成任务就不见了,找任务的最终结果的唯一地方是在ES日志文件中
  • consistency:控制每次写请求必须多少份分片被响应
  • timeout:控制每个写请求等待可用的分片的时间

查看任务:
GET http://127.0.0.1:9200/_tasks/?pretty&detailed=true&actions=*reindex

索引监控

索引统计
GET http://127.0.0.1:9200/_stats
GET http://127.0.0.1:9200/index1,index2/_stats

统计数据选项

指定统计数据 说明
docs
store 索引大小
indexing
get 获取
search
completion
fielddata
flush
merge
request_cache
refresh
suggest
translog

索引分片

索引恢复

映射

映射是定义存储和索引的文档类型以及字段的过程。索引中的每一个文档都有一个类型,每种类型都有它自己的映射。一个映射定义文档结构内每个字段的数据类型。映射通过配置来定义字段类型与该类型相关联的元数据的关系。例如,可以通过映射来定义日期类型的格式、数字类型的格式或者文档中所有字段的值是否应该被_all字段索引等。

元字段

每个文档都有与之关联的元数据,元字段是为了保证系统正常运转的内置字段。

_all:特殊的包含全部内容的字段,在一个大字符串中关联所有其他字段的值,使用空格作为分隔符。可以被分析和索引但不会被存储。使用_all字段可以对文档的值进行搜索而不必知道包含所需值的字段名。字符串类型字段。

关联字段值时,丢失短字段(高相关性)和长字段(低相关性)之间的区别。当相关性是重要搜索条件时,应该明确指出查询字段。_all字段的使用需要额外的处理器周期,并耗费更多的磁盘空间。如果不需要的话,可以完全禁用或在每个字段的基础上自定义。

_field_names:索引文档中所有包含非空值的字段名称。用于存在查询和缺失查询的情况下,查找指定字段拥有非空值的文档是否存在。_field_name字段的值可以用于查询、聚合以及脚本:

_id:没有索引,它的值可以从_uid字段自动生成。字段的值可以在查询以及脚本中访问,但是在聚合或者排序时,要使用_uid而不能用_id

_uid_type#_id,两个字段的组合。

_size_source元字段占用的字节数,通过mapper-size插件提供,

_index:虚拟字段,不作为一个真实的字段添加到Lucene索引中。这意味着可以在term或terms查询(或任何重写term查询的查询,如match、query_string或simple_query_string)中使用_index字段,但是不支持prefix、wildcard、regexp或fuzzy查询

_meta:字段

_parent:在同一个索引中通过创建映射类型可以在文档间建立父子关系。父类型和子类型必须是不同的,即父子关系不能建立在相同类型的文档之间。_parent的type设置只能指向一个当前不存在的类型。这意味着一个类型被创建之后就无法成为父类型。

父子文档必须索引在相同的分片上。parent编号用于作为子文档的路由值,确保子文档被索引到父文档所在的分片中。这意味着当获取、删除或更新子文档的时候,需要提供相同的parent值。

_routing:文档在索引中利用下面的公式路由到特定的分片:shard_num=hash(_routing)%num_primary_shards
_routing字段的默认值使用的是文档的_id字段。如果存在父文档,则使用文档的_parent编号。

_source:字段包含索引时原始的JSON文档内容,字段本身不建立索引(无法搜索)会被存储,所以当执行获取请求的时候可以返回_source字段。虽然很方便,但是_source字段确实会对索引产生存储开销。因此,可以禁用_source字段。

但是,_source字段被禁用,会造成大量的功能无法使用:

  • 更新接口
  • 高亮显示
  • 重建索引,不论是修改映射或分析,还是升级索引到一个新版本
  • 通过查看索引时的原始文档对查询或聚合进行调试
  • 自动修复索引
  • _source字段中移除内容相当于精简版的禁用功能,尤其是无法重建文档索引

_type:增加此字段,通过类型名加快搜索进度。

映射参数

analyzer

boost

对一个字段进行加权,默认的相关性计算需要考虑字段长度,因此短字段会有一个更高的加权。

索引时最好不要进行加权,主要有这几个原因:

  • 除非重索引所有的文档,索引加权值不会发生改变
  • 每个查询都支持查询加权,会产生同样的效果。不同的地方在于不需要重索引就可以调整加权值
  • 索引加权值作为norm的一部分,只有一个字节。这降低了字段长度归一化因子的分辨率,会导致低质量的相关性计算。

索引加权的唯一优势在于作用于_all字段。当查询_all字段时,短字段的词比长字段的词有更高的分数。这个功能是以计算成本为代价的:当索引加权被使用时,查询_all字段会变得更加缓慢。

coerce

同一个索引中相同名称的字段可以拥有不同的coerce设置。可以利用PUT映射接口来更新已存在字段的coerce值。

全局设置:index.mapping.coerce设置可以在索引级别上对所有映射类型整体禁用强制类型转换:

number_one字段继承索引级别的强制类型转换设置,number_two字段覆盖索引级别的设置来启用强制类型转换。

第四章

第五章

posted @   johnny233  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示