ES知识图谱
2021-01-14 17:03:47 4 举报
AI智能生成
ES知识图谱
作者其他创作
大纲/内容
分页优化
from+size: 不适合深度分页
scroll: 不适合实时搜索
search_after: 不能调页查询
API
Restful API
reindex: 讲一个数据重新索引到另一个index
update
版本控制: 默认使用ES内部版本控制即可
更新的时候ES会先去GET文档的version, 然后进行_reindedx
如果在此期间版本号发生了变化就会更新失败,
可以设置重试次数, 默认为0 不重试
更新的时候ES会先去GET文档的version, 然后进行_reindedx
如果在此期间版本号发生了变化就会更新失败,
可以设置重试次数, 默认为0 不重试
更新部分字段: POST /website/blog/1/_update
即 /index/type/doc_id/_update
即 /index/type/doc_id/_update
更新整个文档 PUT /website/blog/1
即 /index/type/doc_id
即 /index/type/doc_id
_buck API: 批量操作,可以大幅提升效率
refresh: 立即刷新到磁盘, 立即可见
Restful API
URL Search
GET /twitter/_search?q=user:kimchy
Rquest Body Search
GET /_search
属性
query
source
子主题
子主题
docvalue_fields:
返回指定字段的值, 如果_source被禁用了, 可以使用它来返回字段值
返回指定字段的值, 如果_source被禁用了, 可以使用它来返回字段值
version: 返回文档版本号
explain: 返回文档的评分解释
min_score:限制最低得分
post_filter: 完成搜索后返回数据前,对数据进行过滤
sort: 排序
可以设置missing:_last / _first, 类似于mysql: null first
可以设置missing:_last / _first, 类似于mysql: null first
collapse: 根据某个字段对返回结果去重,
可以用size来指定去重的程度, 即可以返回多少条一样的
可以用size来指定去重的程度, 即可以返回多少条一样的
search after : 用于深度分页,
使用from+size 不能进行深度分页
使用from+size 不能进行深度分页
高亮: highlight
profile: 用于调优, 可以查看详细的查询步骤
Query DSL
Query Context: 会进行相关性评分, 查询效率低
Filter Context : 不进行相关性评分, 查询效率高
由filter, must not 包含的查询条件为Filter Context
由filter, must not 包含的查询条件为Filter Context
full text query
match_all: 查询全部
match_none
match
"operator": "and"
{"query":{"match":{"address":{"query":"湖南","operator":"and"}}}}
"fuzziness": 2
minimum_should_match
{"query":{"match":{"address":{"query":"湖北市","minimum_should_match":"3"}}}}
match_phrase:
match: 分词后能够匹配上即可
match_phrase需要分词后的词条顺序和文档中的一致而且要是连续的,
当然可以设置一个slop, 表示词条不一定要连续,可以偏移slop个位置
match: 分词后能够匹配上即可
match_phrase需要分词后的词条顺序和文档中的一致而且要是连续的,
当然可以设置一个slop, 表示词条不一定要连续,可以偏移slop个位置
slop
match_phrase_prefix: match_phrase的前缀匹配
multi_match: 在多个字段上进行匹配
term level query
term: 被查询的字段中是否包含该词条,
match会把输入的搜索条件分词
term不会对输入的搜索条件分词
match会把输入的搜索条件分词
term不会对输入的搜索条件分词
terms
range query
exists: 是否包含该字段
prefix
wildcard query: 通配符匹配
regexp query: 正则匹配
bool query
should
must
must not
filter
suggest api
类似于百度搜索是的关联性搜索
Aggs API
指标聚合
sum, avg, count ......
Percentiles:百分比统计
桶聚合bucket aggs
range aggs: 根据字段值的范围进行聚合
term aggs: 根据字段值进行聚合
嵌套聚合
filter: 过滤后聚合
Date Histogram Aggregation
Missing Aggregation
java api
Java Low Level REST Client:
通过http与集群交互,用户需自己编组请求JSON串,及解析响应JSON串
通过http与集群交互,用户需自己编组请求JSON串,及解析响应JSON串
Java High Level REST Client
子主题
聚合问题
数据不准确,
一般是准确的, 但是计算top10这种是不准确的
一般是准确的, 但是计算top10这种是不准确的
举例: 商品的索引有'厂家','商品名称','数量'等字段 ;
需要统计商品数量 前三的厂家 . 每个分片会返回它认为的前三
最后到汇总节点进行汇总, 这种情况可能会有问题
比如每个分片排名第四的厂家都是"捷顺", 有可能汇总后. "捷顺"的总量会大于第三名
需要统计商品数量 前三的厂家 . 每个分片会返回它认为的前三
最后到汇总节点进行汇总, 这种情况可能会有问题
比如每个分片排名第四的厂家都是"捷顺", 有可能汇总后. "捷顺"的总量会大于第三名
解决: 每次汇总的时候让分片返回更多的值,
但是只能减少误差
但是只能减少误差
导出导入数据
安装工具
先安装node环境,一定要是最新版,
安装npm命令
安装ElasticDump : npm install elasticdump -g
安装npm命令
安装ElasticDump : npm install elasticdump -g
导出导入
#入场ES数据导出
elasticdump --input=http://10.10.203.105:9200/dumpidxparkin --output=tianan-parkin.json --searchBody '{"query":{"bool":{"must":{"term":{"subsystemCode":"p202001031"}},"filter":{"range":{"inTime":{"gte":"1578769842000","lte":"1598769842000" }}}}}}'
#入场ES数据导入
elasticdump --input tianan-parkin.json --output=http://10.10.203.105:9200/dumpidxparkin
集群搭建
节点发现: discovery.zen.ping.unicast.hosts
配置一个master节点列表, 新的节点通过请求该列表的节点加入集群
配置一个master节点列表, 新的节点通过请求该列表的节点加入集群
脑裂: discovery.zen.minimum_master_nodes 至少需要多少个master节点才能形成集群. 建议设置为master节点数/2+1
ES扩容后节点会自动负载均衡,
redis,kafka都需要执行命令
redis,kafka都需要执行命令
副本数据同步
数据一致性保证
数据一致性保证
index.write.wait_for_active_shards, 需要多少个副本保存成功后才会返回成功
数据写入主分片后, 会同步发送到副本分片,副本返回成功后才会提交,并返回客户端
读流程
客户端请求任一节点
节点根据路由计算数据所在的分片,把请求转发到相应的节点
各个分片把结果返回, 进行汇总后返回客户端
写流程
客户端请求任一节点, 节点将请求根据路由策略,
将请求转发到对应的主分片所在的节点
将请求转发到对应的主分片所在的节点
shard = hash(routing) % number_of_primary_shards
routing默认为文档_id
routing默认为文档_id
主分片收到请求后,将数据写入 index buffer
写完Index Buffer 后,数据写入translog
translog实时刷新到磁盘
将请求发送给副分片, 等待分片返回成功后才将结果返回客户端
索引管理
ES7之前索引版本下面还有type, ES7之后版本TYPE被废弃
新增索引
分片设置: index.number_of_shards
默认5个
默认5个
别名设置: aliases , 可以设置多个别名
副本设置: index.number_of_replicas
默认1个
默认1个
索引映射
常用数据类型
text(会进行分词) , keyworld (不会进行分词) , java 基本数据类型
ES会识别字段是否是字符串格式, 如果是,会自动转换为date类型的数据
字段属性
index: 该字段是否可以被索引, 默认true .
设置为false, 不会生成倒排索引,也不能用该字段进行搜索, 否则报错
设置为false, 不会生成倒排索引,也不能用该字段进行搜索, 否则报错
fielddata: 废弃
store: 是否将该字段原始值写入索引, 默认no
copy_to: 将某个字段值复制到另一个字段,
可以将多个字段复制到某个字段上, 这样可以形成一个 _all_ 属性
可以将多个字段复制到某个字段上, 这样可以形成一个 _all_ 属性
fileds: 可以将某个字段进行映射为多个属性, 比如把某个字符串字段同时映射为 text和keyworld .
doc_values: 用于进行聚合是使用的属性, 对于非分词字段默认为true, 分词字段为false
boost: 查询是的得分权重
null_value: 将null值设置一个默认值
文档属性(type级别)
"_source":{"enable:"false""}
_source 是传入的文档的原始JSON字符串
禁用后该字段不会被存储, 在查询的时候也无法被返回
禁用后无法使用_reindex, 无法高亮显示, 无法进行update(update本质是reindex)
_source 是传入的文档的原始JSON字符串
禁用后该字段不会被存储, 在查询的时候也无法被返回
禁用后无法使用_reindex, 无法高亮显示, 无法进行update(update本质是reindex)
dynamic
文档写入一个没有创建映射的字段如何处理
true: 自动映射,
false: 会存储该字段,但是不创建映射,也不能被搜索
stric: 直接报错
文档写入一个没有创建映射的字段如何处理
true: 自动映射,
false: 会存储该字段,但是不创建映射,也不能被搜索
stric: 直接报错
_routing
使用哪个字段来路由, 默认由_id字段决定文档路由到哪个分片
使用哪个字段来路由, 默认由_id字段决定文档路由到哪个分片
分片管理
收缩分片
增加分片:
只有在创建时指定了index.number_of_routing_shards 的索引才可以进行拆分,
ES7开始将不再有这个限制。
只有在创建时指定了index.number_of_routing_shards 的索引才可以进行拆分,
ES7开始将不再有这个限制。
索引模板: 建一个模板, 以后可以用这个模板创建索引
Rollover Index 别名滚动指向新建索引 :
RESTURI: /logs_write/_rollover, 注:logs_write为别名,
即: 当满足一定的条件后可以自动创建新的索引, 而且索引的别名会指向新的索引.,
最佳实践: 可以给索引再设置一个logs_read别名, 这个别名不滚动,新建的索引和旧的索引都会有这个别名
这样就可以写入新的索引, 读取所有索引;
别名滚动条件:
"max_age": "7d", 七天滚动一次
"max_docs": 1000, 1000个文档滚动一次
"max_size": "5gb" 5GB大小滚动一次
RESTURI: /logs_write/_rollover, 注:logs_write为别名,
即: 当满足一定的条件后可以自动创建新的索引, 而且索引的别名会指向新的索引.,
最佳实践: 可以给索引再设置一个logs_read别名, 这个别名不滚动,新建的索引和旧的索引都会有这个别名
这样就可以写入新的索引, 读取所有索引;
别名滚动条件:
"max_age": "7d", 七天滚动一次
"max_docs": 1000, 1000个文档滚动一次
"max_size": "5gb" 5GB大小滚动一次
节点类型
node.master=true;
可以作为master节点:
1: 创建删除索引
2: 分配分片到节点
2: 分配分片到节点
最好将master和数据几点分开
节点变更时,将集群的元数据广播到所有节点
node.data=true
可以作为数据节点
索引和搜索,存储数据
node.master=false;
node.data=false
node.data=false
客户端节点: 转发请求到其他节点
持久化
transLog: translog 有一个配置为 index.translog.durability ,
用配置translog刷新到磁盘的策略.
默认为request. 即每次请求都将translog刷入磁盘,这样写入性能较低,
但是可以保证数据不丢失
如果数据不重要, 可以设置为异步刷到磁盘
用配置translog刷新到磁盘的策略.
默认为request. 即每次请求都将translog刷入磁盘,这样写入性能较低,
但是可以保证数据不丢失
如果数据不重要, 可以设置为异步刷到磁盘
segment: lucense会先把数据写入内存,条件满足后在刷新到磁盘,
此时会形成一个segment, segment是一个目录, 里面包含了各种数据,索引文件
此时会形成一个segment, segment是一个目录, 里面包含了各种数据,索引文件
分词
自定义分词器
内置分词器
IK_smart分词器安装
正排/倒排索引
倒排索引
把字段值分词后,按词条进行储存, 并储存对应的文档ID即词条出现的位置信息
正排索引doc_values
使用倒排索引无法进行聚合, 因为字段被拆分成一个个词条了,
得先拼接起来才能聚合
得先拼接起来才能聚合
即 储存每个文档 的每个字段的原始值
选举
master选举
clusterStateVersion
nodeId
节点数
节点状态
Green: 正常
Yellow: 副本不可用
Red: primary不可用
分片选举
应该是随机取一个
当一个主分片宕机, 那么其他节点上的副本分片会成为主分片
当一个主分片宕机, 那么其他节点上的副本分片会成为主分片
内存分配
lucense内存: Segment内存 最好占比50%
ES内存: 缓存数据
Lucense
segment: lucense会先把数据写入内存,条件满足后在刷新到磁盘,
此时会形成一个segment, segment是一个目录, 里面包含了各种数据,索引文件
此时会形成一个segment, segment是一个目录, 里面包含了各种数据,索引文件
数据丢失问题
实时性: index buffer 中的数据无法被搜索到,
ES有一个TransLog ,会去TransLog中读取最新数据
ES有一个TransLog ,会去TransLog中读取最新数据
物理文件
原始json字符串:_source
属性值filed的元数据, 不会像mysql一样存储每个字段的值
倒排索引
doc_values
0 条评论
下一页