导图社区 Elasticsearch详解
这是一篇关于Elasticsearch详解的思维导图es全文检索详细内容解释,基本上涵盖了方方面面,同时会不断的进行优化和补充
编辑于2021-08-12 12:01:50CRUD
文档
搜索
api
过滤器
Bool(复合过滤器)
must
所有的语句都 必须(must) 匹配,与 AND 等价
所有的语句都 必须(must) 匹配,与 AND 等价,并且参与计算分值
should
至少有一个语句要匹配,与 OR 等价
所有的语句都 不能(must not) 匹配,与 NOT 等价
must_not
所有的语句都 不能(must not) 匹配,与 NOT 等价
至少有一个语句要匹配,与 OR 等价
filter
返回的文档必须满足filter子句的条件。但是不会像Must一样,参与计算分值
minimum_should_match
不存在must或filter
minimum_should_match默认的值为1,即至少要满足其中一个条件
有其它must或filter存在
minimum_should_match默认值为0
range(范围过滤器)
"must_not" : { "range" : { "age" : { "from" : 10, "to" : 20 } } }
范围查询
关键字
from
to
gte
lte
missing
过滤掉给定字段有值或缺失的文档 "missing":{ "field":"year", "null_value":0, "existence":true }
exists
field
过滤掉给定字段没有值的文档 "exists":{ "field":"year" }
script(脚本过滤器)
"script":{ "script":"now - doc['year'].value > 100", "params":{"now":2012} }
type(类型过滤器)
Match_all
Query
sort
其他不懂
post_filter
先查询再过滤
filtered
filtered是比较老的的版本的语法。现在目前已经被bool替代。推荐使用bool
先过滤再查询,速度快
这种方式在2.2版本被废弃调用,改用bool的方式
limit(限定过滤器)
"limit":{ "value":1 }
限定每个分片返回的文档数
ids(标识符过滤器)
比如要指定标识符为1,2,3的文档 { "post_filter":{ "ids":{ "type":["book"], "values":[1,2,3] } } }
查询类型
term
"must" : { "term" : { "user" : "kimchy" } }
精准匹配
match_all
查询简单的匹配所有文档。在没有指定查询方式时,它是默认的查询
terms
terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件
match
无论你在任何字段上进行的是全文搜索还是精确查询,match 查询是你可用的标准查询。 如果你在一个全文字段上使用 match 查询,在执行查询前,它将用正确的分析器去分析查询字符串
multi_match
range
查询找出那些落在指定区间内的数字或者时间
exists
missing
概要
exists 查询和 missing 查询被用于查找那些指定字段中有值 (exists) 或无值 (missing) 的文档。这与SQL中的 IS_NULL (missing) 和 NOT IS_NULL (exists) 在本质上具有共性
过滤查询
只是简单的检查包含或者排除,这就使得计算起来非常快。考虑到至少有一个过滤查询(filtering query)的结果是 “稀少的”(很少匹配的文档),并且经常使用不评分查询(non-scoring queries),结果会被缓存到内存中以便快速读取,所以有各种各样的手段来优化查询结果 filter的语法,一般跟着constant_score、bool
实例
GET movies/_search { "query": { "constant_score": { "filter": { "term": { "title": "beautiful" } } } } } GET movies/_search { "query": { "bool": { "filter": [ { "term": { "title": "beautiful" } }, { "range": { "movieId": { "gte": 94, "lte": 1000 } } } ] } } }
评分查询
不仅仅要找出匹配的文档,还要计算每个匹配文档的相关性,计算相关性使得它们比不评分查询费力的多。同时,查询结果并不缓存
全文查询关键字
intervals
match
短语进行分词,进行布尔匹配
常用参数
operator
minimum_should_match
multi_match
在多个字段上执行匹配相同的查询
match_phrase
1、对文本分词 2、匹配所有分词 3、分词的相对位置不变
match_phrase_prefix
把查询文本的最后一个分词只做前缀匹配
match_bool_prefix
query_string
simple_query_string
term级查询关键字
exists
fuzzy
ids
prefix
range
regexp
term
terms
terms_set
type
wildcard
匹配查询
分类
布尔(boolean)查询(默认)
短语(phrase)查询
限制因素
词条顺序
短语前缀(phrase_prefix)查询
受控制参数
"query":{ "match":{ "eventname":"Microsoft Azure Party" } 查询字符串是“Microsoft Azure Party”,被分析器分词之后,产生三个小写的单词:microsoft,azure和party,然后根据分析的结果构造一个布尔查询,默认情况下,引擎内部执行的查询逻辑是:只要eventname字段值中包含有任意一个关键字microsoft、azure或party,那么返回该文档,伪代码是: if (doc.eventname contains "microsoft" or doc.eventname contains "azure" or doc.eventname contains "party") return doc 匹配查询的行为受到两个参数的控制: operator:表示单个字段如何匹配查询条件的分词 minimum_should_match:表示字段匹配的数量 通过调整operator 和 minimum_should_match 属性值,控制匹配查询的逻辑条件,进而控制引擎返回的结果。默认情况下operator的值是or,在构造查询时设置分词之间的逻辑运算符,如果设置为and,那么引擎内部执行的查询逻辑是: if (doc.eventname contains "microsoft" and doc.eventname contains "azure" and doc.eventname contains "party") return doc
operator(默认是or)
用来控制match查询匹配词条的逻辑条件,默认值是or,如果设置为and,表示查询满足所有条件
minimum_should_match(默认是1)
当operator参数设置为or时,该参数用来控制应该匹配的分词的最少数量
复合查询
query
match
constant_score
filter
term
boosting
dis_max(分离最大化查询)
function_socre
clauses
Compound
范围
gt
大于
lt
小于
gte
大于或等于
lte
小于或等于
聚合(aggregations)
GET /megacorp/employee/_search { "aggs": { "all_interests": { "terms": { "field": "interests" } } } }
aggs
all_interests
terms
field
高亮
GET /megacorp/employee/_search { "query" : { "match_phrase" : { "about" : "rock climbing" } }, "highlight": { "fields" : { "about" : {} } } }
highlight
fields
分组
排序
原理
流程
查询阶段
协调节点根据索引找出所有分片
每个分片独立执行搜索
主分片或副分片
每个分片将匹配的结果返回给协调节点
协调节点根据规则排序
概要
该阶段只是利用单词词典,并没有返回原始文档
可能存在分页参数
默认情况下,每个分片将前10个结果发送到协调节点
获取阶段
协调节点生成排序列表后,根据目标信息获取原始文档
所有分片根据对应参数返回原始文档
协调器进行整合并返回
新增/更新/删除文档
流程
请求到达协调节点,写入translog文件,并将该文档加入内存缓冲区
内存缓冲区以固定的时间间隔刷新(默认为1秒),并将内容写入文件系统缓存中的新段(segment)。此分段的内容尚未被fsynced(未被写入文件系统),分段是打开的,内容可用于搜索
选择分片
shard = hash(routing) % number_of_primary_shards
routing
routing 是一个可变值,默认是文档的 _id
所有的文档 API( get 、 index 、 delete 、 bulk 、 update 以及 mget )都接受一个叫做 routing 的路由参数 ,通过这个参数我们可以自定义文档到分片的映射
如分用户进行分片
判断:副分片可用数量大于一半才允许更新/新增
防止脑裂
转发给主分片
只有主分片可以增删改
主分片处理成功后,并行发给所有副分片
主分片和所有副分片的translog被synced后,向客户端返回成功
概要
创建新文档时,Elasticsearch将为该文档分配一个版本号
修改
ES里的文档是不可以修改的,但是可以覆盖,所以ES修改数据本质上是对文档的覆盖
全量更新
客户端会发送全量文档,同时带上ID
es根据ID找到旧的文档,并标记为删除
索引新的全量文档
局部更新
1. 内部先获取到对应的文档;
2. 将传递过来的字段更新到文档的json中(这一步实质上也是一样的);
3. 将老的文档标记为deleted(到一定时候才会物理删除);
4. 索引新文档
概要
1. 无论是整个文档更新还是局部的更新,都是先找到旧的,然后标记删除,然后在添加新的文档
2. 局部更新本质上是更新操作,只有遇到新的东西才更新,没有新的修改就不更新;
3. 局部更新比全局更新的性能好,因此推荐使用局部更新。
4. 文档每更新一次,版本号变化
删除
磁盘上的每个分段(segment)都有一个.del文件与它相关联。当发送删除请求时,该文档未被真正删除,而是在.del文件中标记为已删除。此文档可能仍然能被搜索到,但会从结果中过滤掉。当分段合并时,在.del文件中标记为已删除的文档不会被包括在新的合并段中
分页
查询到达协调结点
查询分发到当前索引的所有分片
每个分片根据分页参数获取数据,并返回给协调结点
协调结点整合所有分片数据,最大条数=分片数*分页数
协调结点,在整合的条数中取前N条数据,N=分页数
索引
新增
修改
删除
查询
settings
number_of_shards
number_of_replicas
集群健康
/_cluster/health
status
green
所有的主分片和副本分片都正常运行。
yellow
所有的主分片都正常运行,但不是所有的副本分片都正常运行
red
有主分片没能正常运行
数据结构
索引(Index)
相当于数据库
注意
名称必须为小写
索引只是一个用来指向一个或多个分片(shards)的“逻辑命名空间
文档(document)
相当于行记录 文档是ES中存储数据的主体,ES中所有的操作都是建立在文档的基础上的,每个文档都是由各种Field组成,每个Field有一个名称和一个或多个值构成。文档展示给用户就是一个JSON对象
注意
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率
_index 、 _type 和 _id 的组合可以唯一标识一个文档
元数据
_index
文档在哪存放
_type
文档表示的对象类别
_id
如果你的数据没有自然的 ID, Elasticsearch 可以帮我们自动生成 ID
文档唯一标识
类型(type)
相当于表 Type是一种逻辑上的概念,类似关系型数据库中的表,每个文档都属于某一种类型,如果没有定义,会有默认值,这里的类型相当于数据库当中的表,ES的每个索引可以包含多种类型。 虚拟的逻辑分组,用来过滤 Document
映射(Mapping)
映射类似关系型数据库中的schema,用于定义field的属性,如字段类型,是否分词等。这里有一点和关系型数据库不同的是ES会在用户没有定义字段属性的情况下,自动嗅探该字段的类型进行自动识别。
相当于表结构
字段
类型
核心数据类型
https://www.cnblogs.com/chy18883701161/p/12723658.html
字符串
text
⽤于全⽂索引,搜索时会自动使用分词器进⾏分词再匹配
keyword
不分词,搜索时需要匹配完整的值
数值型
整数
byte
short
integer
long
浮点型
float
half_float
scaled_float
double
日期类型
date
范围类型
integer_range
long_range
float_range
double_range
date_range
布尔类型
boolean
二进制类型
binary
复杂数据类型
object
数组
专用数据类型
ip
分片(Shard)
Elasticsearch集群允许系统存储的数据量超过单机容量,实现这一目标引入分片策略shard。在一个索引index中,数据(document)被分片处理(sharding)到多个分片上。Elasticsearch屏蔽了管理分片的复杂性,使得多个分片呈现出一个大索引的样子 Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里 拥有6个分片(3个主分片和3个副本分片)的索引可以最大扩容到6个节点
主分片
索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量 在创建索引的时候就确定好主分片的数量 并且永远不会改变这个数量
默认为5
主分片的数量只能在索引创建前指定,且不可更改
理论上主分片能存储的数据大小是没有限制的,限制取决于你实际的使用情况
主分片不是固定的,主分片挂掉的时候,副分片可以升级为主分片
新建、索引和删除请求都是写操作,必须在主分片上面完成之后才能被复制到相关的副本分片
增删改请求发送给某个节点后,节点会根据实际情况将请求发送到主分片对应的节点
主分片接到请求后,自己先持久化,然后同步到副分片,所有副分片成功后,想协调节点报告成功状态
文档变更是数据安全的
副分片
一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。 在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改 为了提升访问压力过大是单机无法处理所有请求的问题,Elasticsearch集群引入了副本策略replica。副本策略对index中的每个分片创建冗余的副本,处理查询时可以把这些副本当做主分片来对待(primary shard),此外副本策略提供了高可用和数据安全的保障,当分片所在的机器宕机,Elasticsearch可以使用其副本进行恢复,从而避免数据丢失
默认为1
副分片的数量是可以修改的
注意
当集群扩大或缩小,es会自动在节点间迁移分片,以使集群保持平衡
索引中的每个文档属于一个单独的主分片
primary shard不能和replica shard在同一个节点上
只有单节点时,副本不会被分配,集群状态为yellow
分片是实际存储数据的Lucene索引,它本身就是一个搜索引擎
运维
常见问题
脑裂
在默认设置下,即使仅仅是在试图执行一个写操作之前,主分片都会要求必须要有规定数量(quorum)(或者换种说法,也即必须要有大多数)的分片副本处于活跃可用状态,才会去执行写操作(其中分片副本可以是主分片或者副本分片)
集群
多个ES节点工作在一起组成一个集群。ES对于集群的支持几乎是无缝的,这也是ES重要的竞争优点之一。 一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch” 集群是由一个或者多个拥有相同 cluster.name 配置的节点组成 当一个节点被选举成为 主 节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 任何节点都可以成为主节点
扩容
方式
垂直扩容(纵向扩容)
即通过提高系统部件的能力来实现
垂直扩容就是升级服务器
水平扩容(横向扩展)
即增加节点
步骤
场景
单节点
所有索引的分片均在当前节点创建,但是不创建副本分片
主分片和副本分片必须位于不同的节点
1扩到2
此时主分片未被分配的副分片会在第二个节点自动创建
2扩到3
rebalance
节点发生变化会触发再平衡机制
重新加入
挂掉的节点重新启动时也会进行数据恢复
错误检测
master节点
master定期想集群中的其他节点发送ping,检查他们是否存活,将失活的成员移除集群,同时将最新的集群状态发布到集群中,集群成员收到最新的集群状态后会进行相应的调整,比如重新选择主分片,进行数据复制等操作
非master
节点发送ping到master检查master是否存活,否则需要发起选主
如果一个节点检测到master连接不上,没有提交的集群状态将会被清楚,发起一个rejoin的请求以加入集群(如果满足选主,那么进行选主)
选主
注意
步骤
节点发现
多播(2.X后已经禁用)
启动后向当前网络发送广播信息
缺点
当elasticsearch集群规模较大的时候,组播的发现机制会产生太多不必要的流量开销
不属于当前集群的es节点会错误的加入集群中
当网络环境发生变动的时候,组播的发现机制也会变得不可靠
单播
类似主动注册的方式
discovery.zen.ping.unicats.hosts
一个节点一旦连接到集群中的一个节点,这个连接信息就会发送集群中其它所有的节点
两个探测进程
发送
用于从主节点向集群中其它节点发送ping请求来检测节点是否正常可用
接收
其它的节点向主节点发送ping请求来验证主节点是否正常且忠于职守
故障转移
扩展
横向扩展/水平扩展
更多扩展
节点(Node)
和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点
元数据
每个节点都知道整个集群的分片分布情况
类型
1个master节点
任务
控制整个集群的元数据
只有Master Node节点可以修改节点状态信息及元数据(metadata)的处理
索引的新增、删除、分片路由分配、所有索引和相关 Mapping 、Setting 配置
n个master备选节点(eligible 节点)
有资格成为Master节点
与集群保持心跳,判断Master是否存活,如果Master故障则参加新一轮的Master选举
n个数据节点
存放数据
不会和主节点打交道
其他
节点对等
master将不会成为整个集群环境的流量入口,即其并不独自承担文档级别的变更和搜索(curd),也就意味着当流量暴增,主节点的性能将不会成为整个集群环境的性能瓶颈。这就是elasticsearch的节点对等特性
每个节点扮演的角色都是平等的,即每个节点都能成为集群的流量入口
协调节点(Coordinating Node)
协调节点接受客户端搜索请求后将请求转发到与查询条件相关的多个data节点的分片上,然后多个data节点的分片执行查询语句或者查询结果再返回给协调节点,协调节点把各个data节点的返回结果进行整合、排序等一系列操作后再将最终结果返回给用户请求。协调节点,是一种角色,而不是真实的Elasticsearch的节点,你没有办法通过配置项来配置哪个节点为协调节点。集群中的任何节点,都可以充当协调节点的角色 当一个节点A收到用户的查询请求后,会把查询子句分发到其它的节点,然后合并各个节点返回的查询结果,最后返回一个完整的数据集给用户。在这个过程中,节点A扮演的就是协调节点的角色。毫无疑问,协调节点会对CPU、Memory要求比较高
请求命中的那个节点
请求进入到某个节点,该节点就会暂时充当协调节点的角色,对请求进行路由和处理
Ingest Node
Ingest节点处理时机——在数据被索引之前,通过预定义好的处理管道对数据进行预处理。默认情况下,所有节点都启用Ingest,因此任何节点都可以处理Ingest任务
集群状态
green
所有的主分片和副本分片都正常运行
yellow
所有的主分片都正常运行,但不是所有的副本分片都正常运行
red
有主分片没能正常运行
多集群间数据同步
配置
cluster.name
配置elasticsearch的集群名称,默认是elasticsearch。elasticsearch会自动发现在同一网段下的集群名为elasticsearch的主机,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。生成环境时建议更改
node
name
节点名,默认随机指定一个name列表中名字,该列表在elasticsearch的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字,大部分是漫威动漫里面的人物名字。生成环境中建议更改以能方便的指定集群中的节点对应的机器
节点名称
master
指定该节点是否有资格被选举成为node,默认是true,elasticsearch默认集群中的第一台启动的机器为master,如果这台机挂了就会重新选举master。
是否可以成为master节点
data
指定该节点是否存储索引数据,默认为true。如果节点配置node.master:false并且node.data: false,则该节点将起到负载均衡的作用 猜测:不存储数据,但是接受客户端请求,并根据请求类型转发并代理,起到负载均衡的作用
节点是否存储数据
index
number_of_shards
设置默认索引分片个数,默认为5片。经本人测试,索引分片对ES的查询性能有很大的影响,在应用环境,应该选择适合的分片大小。
number_of_replicas
设置默认索引副本个数,默认为1个副本。此处的1个副本是指index.number_of_shards的一个完全拷贝;默认5个分片1个拷贝;即总分片数为10。
path
conf
设置配置文件的存储路径,默认是es根目录下的config文件夹。
data
设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开。
数据仓储位置
work
设置临时文件的存储路径,默认是es根目录下的work文件夹。
logs
设置日志文件的存储路径,默认是es根目录下的logs文件夹
plugins
设置插件的存放路径,默认是es根目录下的plugins文件夹
repo
备份数据存储路径
bootstrap
mlockall
设置为true来锁住内存。因为当jvm开始swapping时es的效率会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过ulimit -l unlimited命令。
memory_lock
应用是不锁住jvm内存
system_call_filter
network
bind_host
默认,es只允许本机访问,如果需要远程访问,则设置为0.0.0.0,让任何人都可以访问。线上服务不要这样设置,要设成具体的 IP
publish_host
设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。
host
这个参数是用来同时设置bind_host和publish_host上面两个参数。
网络绑定,这里我绑定 0.0.0.0,支持外网访问
transport
tcp
port
设置节点间交互的tcp端口,默认是9300。
节点间交互的tcp端口,默认是9300
compress
设置是否压缩tcp传输时的数据,默认为false,不压缩。
http
port
设置对外服务的http端口,默认为9200。
对外服务的http端口,默认为9200
max_content_length
设置内容的最大容量,默认100mb
enabled
是否使用http协议对外提供服务,默认为true,开启。
cors
enable
支持跨域访问
http.cors.allow-origin
gateway
type
gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统,分布式文件系统,hadoop的HDFS,和amazon的s3服务器,其它文件系统的设置。
recover_after_nodes
设置集群中N个节点启动时进行数据恢复,默认为1。
recover_after_time
设置初始化数据恢复进程的超时时间,默认是5分钟。
expected_nodes
设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会立即进行数据恢复。
cluster
routing
allocation
node_initial_primaries_recoveries
初始化数据恢复时,并发恢复线程的个数,默认为4。
node_concurrent_recoveries
添加删除节点或负载均衡时并发恢复线程的个数,默认为4。
initial_master_nodes
手动指定可以成为 mater 的所有节点的 name 或者 ip,这些配置将会在第一次选举中进行计算
indices
recovery
max_size_per_sec
设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。
concurrent_streams
设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5。
discovery
zen
minimum_master_nodes
设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
ping
timeout
设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。
multicast
enabled
设置是否打开多播发现节点,默认是true。
address
组播(非广播)网络接口的地址
unicast
hosts
设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
列表不需要配置上集群中的所有节点
minimum_master_nodes
为完成选举所需要的master-eligible节点数量
防止集群脑裂,在生产环境需要配置
此项设置还会影响到集群状态的update,当主节点收到来自其他节点的状态更新数据,更新数据是否接受前,必须由大于此设置的master-eligible数量承认,才说明此集群的更新成功,才会同步到其他所有的节点
fd
ping_interval
默认值是1s,指定了本节点隔多久向目标结点发送一次ping请求
ping_timeout
默认值是30s,指定了节点等待ping请求的回复时间
ping_retries
默认为3,指定了在目标节点被认定不可用之前ping请求重试的次数
master_election
ignore_non_master_pings
集群在选举master时,不考虑非master-eligible的选票
ping_timeout
一类行为的超时时间,这类行为发生在两种场景
在集群需要重新选举master时,在timeout时间内,相关节点会ping3次,从而做出选举的结果,若ping3次后在timeout时间内ping3次后,仍然没有做出决定,则再进行一遍此类操作
在一个节点准备加入集群时,会向msater节点发送请求,这里有个超时时间为timeout的20倍(默认情况下),从而确定四否加入成功。discovery.zen.join_timeout
seed_hosts
集群发现的节点ip
xpack
用户权限配置,不止的用户的可以忽略
security
enabled
transport
ssl
enabled
verification_mode
keystore
path
truststore
path
评分机制
Lucene
TF(Term Frequency)
IDF(Inveres Document Frequency)
倒排索引
单词词典
搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针
分词/单词+倒排文件指针
倒排列表
倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词
单词与倒排文件记录为一对多
倒排文件
所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件
分词器
Standard(默认)
Simple
Stop
Whitespace
Keyword
Patter
Language
Customer
中文
ik_max_word
会将文本做最细粒度的拆分;尽可能多的拆分出词语
ik_smart
会做最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有
SpringBoot
spring-boot-starter-data-elasticsearch
配置
spring.data.elasticsearch
cluster-name
集群名
cluster-nodes
默认 9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口
local
repositories
enable
开启 Elasticsearch 仓库(默认值:true)
properties
用来配置客户端的额外属性
transport
tcp
connect_timeout
连接超时的时间
path
home
存储索引的位置
常用注解
@Document
标示映射到Elasticsearch文档上的领域对象
属性
indexName
索引库名称
type
类型
shards
默认分片数
replicas
默认副本数
refreshInterval
刷新间隔
useServerConfiguration
indexStoreType
索引文件存储类型
createIndex
是否创建索引
@Id
文档的id
注意
一般id字段或是域不需要存储也不需要分词
@Field
属性
type
文档中字段的类型
index
是否建立倒排索引
值
FieldIndex.not_analyzed
不会分词,只能根据原词索引Field
FieldIndex.analyzed
根据分词器分词,可以根据原词和分词后的词条索引Field;
FieldIndex.no
该字段不会被索引,查不到
store
是否进行存储
analyzer
分词器名次
format
时间类型的字段格式化
pattern
fielddata
searchAnalyzer
指定字段使用搜索时的分词
ignoreFields
如果某个字段需要被忽略
includeInParent
注意
不需要中文分词的字段设置成@Field(type = FieldType.Keyword)类型
需要中文分词的设置成@Field(analyzer = "ik_max_word",type = FieldType.Text)类型
@Query
接口/类
ElasticsearchRepository
public interface MonitorAlarmRepository extends ElasticsearchRepository<MonitorAlarmVO, Long>
CrudRepository
FunctionScoreQueryBuilder
QueryStringQueryBuilder
QueryBuilders
NativeSearchQueryBuilder
操作
新增
删除
修改
查询
聚合
分页
远程交互
Java中es内置客户端
节点客户端
节点客户端作为一个非数据节点加入到本地集群中。换句话说,它本身不保存任何数据,但是它知道数据在集群中的哪个节点中,并且可以把请求转发到正确的节点
传输客户端
轻量级的传输客户端可以将请求发送到远程集群。它本身不加入集群,但是它可以将请求转发到集群中的一个节点上
概要
两个 Java 客户端都是通过 9300 端口并使用 Elasticsearch 的原生 传输 协议和集群交互
集群中的节点通过端口 9300 彼此通信
Java 客户端作为节点必须和 Elasticsearch 有相同的 主要 版本;否则,它们之间将无法互相理解
Elasticsearch
Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API ES是一种p2p(peer to peer)的分布式架构设计,集群中的每个节点都可以与其他任意节点进行通讯
特点
一个分布式的实时文档存储,
每个字段 可以被索引与搜索
一个分布式实时分析搜索引擎
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
rebalance(再平衡)
集群中节点数量发生变化时,将会触发es集群的rebalance,即重新分配shard