Elasticsearch与关系数据的类比对应关系如下:
Relational DB ⇒ Databases ⇒ Tables ⇒ Rows ⇒ Columns
Elasticsearch ⇒ Indices ⇒ Types ⇒ Documents ⇒ Fields
【Cluster】
集群,一个ES集群由一个或多个节点(Node)组成,每个集群都有一个cluster name作为标识。
【node】
节点,一个ES实例就是一个node,一个机器可以有多个实例,所以并不能说一台机器就是一个node,大多数情况下每个node运行在一个独立的环境或虚拟机上。
【index】
索引,即一系列documents的集合。
【shard】
1. 分片,ES是分布式搜索引擎,每个索引有一个或多个分片,索引的数据被分配到各个分片上,相当于一桶水用了N个杯子装。
2. 分片有助于横向扩展,N个分片会被尽可能平均地(rebalance)分配在不同的节点上(例如你有2个节点,4个主分片(不考虑备份),那么每个节点会分到2个分片,后来你增加了2个节点,那么你这4个节点上都会有1个分片,这个过程叫relocation,ES感知后自动完成)。
3. 分片是独立的,对于一个Search Request的行为,每个分片都会执行这个Request。
4. 每个分片都是一个Lucene Index,所以一个分片只能存放 Integer.MAX_VALUE - 128 = 2,147,483,519 个docs。[LUCENE-5843] IndexWriter should refuse to create an index with more than INT_MAX docs
【replica】
1. 复制,可以理解为备份分片,相应地有primary shard(主分片)。
2. 主分片和备分片不会出现在同一个节点上(防止单点故障),默认情况下一个索引创建5个分片一个备份(即5primary+5replica=10个分片)
3. 如果你只有一个节点,那么5个replica都无法分配(unassigned),此时cluster status会变成Yellow。
ES集群状态有三种:
Green:所有主分片和备份分片都准备就绪(分配成功),即使有一台机器挂了(假设一台机器一个实例),数据都不会丢失,但会变成Yellow状态
Yellow:所有主分片准备就绪,但存在至少一个主分片(假设是A)对应的备份分片没有就绪,此时集群属于警告状态,意味着集群高可用和容灾能力下降,如果刚好A所在的机器挂了,并且你只设置了一个备份(已处于未就绪状态),那么A的数据就会丢失(查询结果不完整),此时集群进入Red状态
Red:至少有一个主分片没有就绪(直接原因是找不到对应的备份分片成为新的主分片),此时查询的结果会出现数据丢失(不完整)
4. replica的作用主要包括:
a.容灾:primary分片丢失,replica分片就会被顶上去成为新的主分片,同时根据这个新的主分片创建新的replica,集群数据安然无恙
b. 提高查询性能:replica和primary分片的数据是相同的,所以对于一个query既可以查主分片也可以查备分片,在合适的范围内多个replica性能会更优(但要考虑资源占用也会提升[cpu/disk/heap]),另外index request只能发生在主分片上,replica不能执行index request。
5. 对于一个索引,除非重建索引否则不能调整分片的数目(主分片数, number_of_shards),但可以随时调整replica数(number_of_replicas)。
TF/IDF算法:TF词频,DF词条存在的文档数
METHOD:
GET:查询
PUT:添加/更新,幂等,必须指定id,若存在则全量更新
POST:添加/更新,非幂等,可指定id,若未指定id则会自动生成一个,若存在则全量更新,可通过_update指定字段更新
DELETE:删除索引或索引中指定id数据
HEAD:判断数据是否存在,只返回http头文件,存在则返回200,不存在则返回404
feature:
PUT请求:
_mappings:设置索引mapping,PUT请求
type:
properties:
field:
type: text/keyword/long/integer/nested
analyzer:
index:true/false
boost:
copy_to:将多个字段的值拷贝到一个字段中,并建立倒排索引
formate:
store:
POST请求:
_aliases:
actions:
add:添加索引别名
index:索引名
alias:索引别名
is_write_index:被设置为true的索引,当对别名写数据的时候数据会被写到此索引中。
remove:删除索引别名
index:
alias:
remove_index:删除索引
示例:
POST _aliases
{
"actions":[
{"remove": {"index": "parana_item","alias": "index_item"}},
{"add":{"index":"parana_item","alias":"index_item_back"}},
{"remove":{"index":"new_parana_item","alias":"new_parana_item"}},
{"add":{"index":"new_parana_item","alias":"index_item"}}
]
}
_reindex:重构索引
source:原始索引
index:索引名
dest:目标索引
index:索引名
示例:
POST _reindex
{
"source": {
"index": "new_suggest_index"
},
"dest": {
"index": "new_suggest_index2"
}
}
清空索引内容:
POST new_suggest_index1/new_suggest_type/_delete_by_query
{
"query": {"match_all": {}}
}
GET请求:
endpoint:
.percolater:
_all:GET请求,获取所有索引信息
_alias:GET请求,获取索引别名
_analyze:
analyzer:指定分词器,内置分词器standard、simple、whitespace、stop、keyword、
attributes:
char_filter:
explain:
field:字段
text:进行分词的内容
tokenizer:
_cache/clear:
_cat/aliases:显示别名 GET _cat/aliases?v&h=alias,index
_cat/allocation:查看每个数据节点上的分片数(shards),以及每个数据节点磁盘剩余
_cat/count:查看单个或某类或整个集群文档数;#整个集群文档数GET _cat/count?v ;#某类索引文档数 GET _cat/count/.monitoring*?v
_cat/fielddata:查看每个数据节点上fielddata当前占用的堆内存 GET _cat/fielddata?v&h=node,field,size ; #对某一字段进行查看 GET _cat/fielddata?v&h=node,field,size&fields=kibana_stats.kibana.uuid
_cat/health:查看集群健康状况:GET _cat/health?v&h=cluster,status
_cat/indices:查看索引 GET _cat/indices/.monitoring*?v&h=index,health
_cat/master:查看集群master节点信息 GET _cat/master?v
_cat/nodeattrs:查看每个节点的自定义属性 GET /_cat/nodeattrs?v
_cat/nodes:查询集群节点信息;#集群节点: GET _cat/nodes?v ; #磁盘剩余: GET _cat/nodes?v&h=ip,node.role,name,disk.avail
_cat/pending_tasks:查看被挂起任务 GET _cat/pending_tasks?v
_cat/plugins:查看每个节点正在运行的插件 GET _cat/plugins?v
_cat/recovery:查看索引分片的恢复视图;索引分片的恢复视图,包括正在进行和先前已完成的恢复;只要索引分片移动到群集中的其他节点,就会发生恢复事件
_cat/repositories:查看注册的快照仓库 GET _cat/repositories?v
_cat/snapshots:查看快照仓库下的快照;
#可将ES中的一个或多个索引定期备份到如HDFS、S3等更可靠的文件系统,以应对灾难性的故障
#第一次快照是一个完整拷贝,所有后续快照则保留的是已存快照和新数据之间的差异
#当出现灾难性故障时,可基于快照恢复
_cat/segments:查看每个索引的segment :GET _cat/segments/.kibana?v&format=json&pretty
_cat/shards:查看每个索引的分片 GET _cat/shards?v&format=json&pretty&s=index
_cat/tasks:显示当前在集群中执行的任务的信息
_cat/thread_pool:查看每个节点线程池的统计信息 GET _cat/thread_pool/bulk?v&format=json&pretty #查看每个节点bulk线程池的统计信息 # actinve(活跃的),queue(队列中的)和 reject(拒绝的)
_cat/templates:查看索引模板 GET _cat/templates?v&format=json&pretty
verbose显示指令的详细信息
GET _cat/health?v
help显示指令返回参数的说明
GET _cat/health?help
header选择要显示的列
GET _cat/count?h=timestamp,count
format设置返回内容的格式,支持json,yaml,text,smile,cbor
GET _cat/master?format=json&pretty
sort排序
GET _cat/indices?s=store.size:desc
可以多个参数一起使用,用&连接
GET _cat/indices?v&s=store.size:desc
_cluster/health:
_cluster/nodes/stats:
_cluster/pending_tasks:
_cluster/reroute:
_cluster/settinds:
_cluster/state:
_count:GET请求,统计索引数据
_field_stats:
_mapping:查看mapping
_mapping/field:查看某个字段的mapping
_open:
_close:
_flush:
_ingest/pipeline:
_ingest/pipeline/_simulate:
_nodes:
_nodes/hot_threads:
_nodes/stats:
_flush/synced:
_refresh:
_processor:
_recovery:
_reindex:
_render/template:
_scripts:
_segments:
_search:
_source:
存储的原始数据。_source中的内容就是搜索api返回的内容。通过_source指定最终返回的属性字段,如 "_source": ["name","age"]
aggs:对一份数据执行分组聚合操作,每一个分组结果称为一个bucket,对一个数据分组结果执行的统计操作称为metric
aggs_name:聚合的名字
aggs:aggs多次聚合
aggs_name:
...
avg:求平均数
avg_bucket:
bucket_script:
bucket_selector:
cardinality:类似于distinct去重过滤
field:去重字段
precision_threshold:precision_threshold值设置的越大,占用内存越大,1000 * 8 = 8000 / 1000 = 8KB,可以确保更多unique value的场景下,100%的准确
cardinality底层算法:HLL算法,HLL算法的性能
children:
cumulative_sum:
date_histogram:日期范围分组,类似于histogram,按照指定的date类型的日期field,以及日期interval,按照一定的日期间隔,去划分bucket分组
factor:
field:分组字段
format:分组后展示的日期格式
interval:间隔
day:以1天为间隔
hour:以1小时为间隔
minute:以1季度为间隔
month:以1月为间隔
quarter:以1刻钟为间隔
second:以1秒为间隔
week:以1周为间隔
year:以1年为间隔
keyed:
min_doc_count:最小文档数量,设置为0时,该范围没有结果也会展示;不设置时该范围没有结果则不会展示
missing:
order:
extended_bounds:
min:范围起始值
max:范围结束值
date_range:日期范围
derivative:
extended_stats:扩展统计
filter:过滤
filters:
geo_bounds:
geo_distance:
geohash_grid:
global:
histogram:范围分组,类似terms,也是进行bucket分组操作,接收一个field,按照这个field值的各个范围区间,进行bucket分组操作
field:分组字段
interval:区间划分基数,数字类型,如:2000,则分组为:0-2000,2000-4000,4000-6000 ...
keyed:
min_doc_count:最小文档数量,设置为0时,该范围没有结果也会展示;不设置时该范围没有结果则不会展示
missing:
order:
ip_range:
matrix_stats:
max:最大值
max_bucket:
min:最小值
min_bucket:
missing:
moving_avg:
nested:
percentile_ranks:
percentiles:求百分比
range:范围
reverse_nested:
sampler:
scripted_metric:
serial_diff:
significant_terms:
stats:
sum:求和
sum_bucket:
terms:根据指定字段值进行分组
collect_mode:
exclude:排除包含该值的文档
execution_hint:
field:聚合字段
include:匹配出包含该值的文档
min_doc_count:最小文档数量
missing:指定了缺省的字段的处理方式
order:排序方式
_term:desc/asc,根据聚合结果排序,_term可以替换成aggs的name,如avg_price
_count:desc/asc,数量排序
script:
shard_size:每个分片上返回的个数
show_term_doc_count_error:
size:聚合结果最后返回的term个数(默认是10个)
top_hits:
value_count:
explain:解析
from:开始位置
highlight:高亮显示
fields:
post_tags:
pre_tags:
tags_schema:
query:
bool:
boost:搜索条件的权重
filter:不计算相关性,同时可以cache,因此filter的速度快于query
minimum_should_match:去长尾,提升搜索精确度,最少匹配比例
must:数组
match:分词
term:不分词
must_not:必须不
should:数组,匹配一个或多个
term:
bool:
boosting:只有匹配了positive查询的文档才会被包含到结果集中,但是同时匹配了negative查询的文档会被降低其相关度,通过将文档原本的_score和negative_boost参数进行相乘来得到新的_score;negative_boost参数必须小于1.0
positive:正面词条
negative:负面词条
negative_boost:任何包含了指定负面词条的文档的_score都会是其原本_score的negative_boost设置的值的倍数,即_score * negative_boost
constant_score:忽略评分排序
custom_filters_score:
dis_max:最佳字段查询,即分离最大化查询(Disjunction Max Query):
将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回;某一个field中匹配到了尽可能多的关键词,被排在前面;而不是尽可能多的field匹配到了少数的关键词,排在了前面
tie_breaker:通过参数tie_breaker来综合考虑,将其他query的分数,乘以tie_breaker,然后综合与最高分数的那个query的分数,综合在一起进行计算,除了取最高分以外,还会考虑其他的query的分数
field:查询字段
function_score:将某个field的值,跟es内置算出来的分数进行运算,然后由指定的field来进行分数的增强
query:
multi_match:
query:查询内容
fields:查询字段数据
field_value_factor:
field:评分增强字段:如果只有field,那么会将每个doc的分数都乘以指定field的值,如果有的doc 指定field的值是0,那么分数就会变为0,效果很不好
一般会加个modifier的log1p函数,公式会变为,new_score = old_score * log(1 + number_of_votes),这样出来的分数会比较合理
再加个factor,可以进一步影响分数,new_score = old_score * log(1 + factor * number_of_votes)
modifier:
factor:
boost_mode:可以决定分数与指定字段的值如何计算,multiply,sum,min,max,replace
max_boost:限制计算出来的分数不要超过max_boost指定的值
fuzzy:纠错查询,自动将拼写错误的搜索文本,进行纠正,纠正以后去尝试匹配索引中的数据
FIELD:
value:查询内容
fuzziness:搜索文本最多可以纠正几个字母去进行匹配,默认如果不设置,就是2
geo_shape:
has_child:
has_parent:
ids:
indices:查询索引
match:指定字段全文检索,会分词,只要简单的匹配到了一个term,就可以立即将term对应的doc作为结果返回,扫描倒排索引,扫描到了就ok
match_all:查询所有
match_phrase:短语检索,必须包含每个term,term之间顺序位置必须一致;通过slop指定短语之间位置间隔容差值(最多只能移动slop值的次数后匹配);通过近似匹配提升匹配度
FIELD:
query:查询内容
analyzer:内容分词器
slop:关键词离得越近,相关度越高,评分越高
match_phrase_prefix:前缀检索,模糊匹配,通过max_expansions(默认值50,最小值为1)指定模糊匹配通配符数量
原理跟match_phrase类似,唯一的区别,就是把最后一个term作为前缀去搜索
比如查询:hello w
hello就是去进行match,搜索对应的doc
w,会作为前缀,去扫描整个倒排索引,找到所有w开头的doc
然后找到所有doc中,即包含hello,又包含w开头的字符的doc
根据你的slop去计算,看在slop范围内,能不能让hello w,正好跟doc中的hello和w开头的单词的position相匹配
FIELD:
analyzer:
fuzziness:模糊
max_expansions:限制搜索结果中前缀匹配的词所在文档的数量
prefix_length:前缀长度
query:查询内容
slop:词条之间的位置差
mlt:
more_like_this:
multi_match:多字段匹配
query:查询的内容
fields:匹配字段,可以是多个
type:搜索匹配类型
best_fields:最佳匹配,将某一个field匹配尽可能多的关键词的doc优先返回回来
cross_fields:跨多个field查询唯一标识;要求每个term都必须在任何一个field中出现,即每个term必须在field1中出现或者在field2中出现
most_fields:尽可能返回更多field匹配到某个关键词的doc,优先返回回来;不要求所有的term都必须出现在任何一个field;不允许使用minimum_should_match去长尾
phrase:
phrase_prefix:前缀
tie_breaker:多字段评分都参与就按
use_dis_max:
operator: OR
slop: 0
prefix_length: 0
max_expansions: 50,限定最多匹配term数量
lenient: false
zero_terms_query: NONE
boost: 1.0,权重
nested:
prefix:前缀搜索,性能差,prefix query不计算relevance score,与prefix filter唯一的区别就是,filter会cache bitset;前缀越短,要处理的doc越多,性能越差,尽可能用长前缀搜索
query_string:
range:范围查询
regexp:正则查询,
如:C[0-9].+
解释:[0-9]:指定范围内的数字,[a-z]:指定范围内的字母,.:一个字符,+:前面的正则表达式可以出现一次或多次;
wildcard和regexp,与prefix原理一致,都会扫描整个索引,性能很差
script:
span_containing:
span_first:
span_near:
span_not:
span_or:
span_term:
span_within:
term:
terms:
wildcard:通配符搜索,性能差,?代表任意一个字符,*代表0个或多个任意字符,例如:C?5*5,代表C开头+一个任意字符+5+任务多个字符+5结尾的查询
simple_query_string:
size:
sort:
stats:
timeout:
version:
post_filter:
docvalue_fields:
partial_fields:
script_fields:
stored_fields:
_settings:查看索引setting信息
_search/template:
_shard_stores:
_search_shards:
_snapshot:
_snapshot/_status:
_stats:
_template:
_upgrade:
_validate/query:
分词:
什么是ngram:
quick,5种长度下的ngram
ngram length=1,q u i c k
ngram length=2,qu ui ic ck
ngram length=3,qui uic ick
ngram length=4,quic uick
ngram length=5,quick
什么是edge ngram
quick,anchor首字母后进行ngram
q
qu
qui
quic
quick
edge_ngram的分词器,就是从首字开始,按步长,逐字符分词,直至最终结尾文字;ngram呢,就不仅是从首字开始,而是逐字开始按步长,逐字符分词。
如果必须首字匹配的情况,那么用edge_ngram自然是最佳选择,如果需要文中任意字符的匹配,ngram就更为合适了。当然,涉及到中文分词的话,有一些可用的分词插件。
TF/IDF
TF(term frequency):词频,搜索文本中的各个词条在检索字段中中出现了多少次,出现的次数越多,就越相关
tfNorm:词频归一值
计算公式:
tfNorm=(freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength))
freq:检索关键词组在被检索字段的词组中出现的频率,即出现了多少次
k1、b:BM25算法的两个调节因子;k1:词的饱和度值,默认值为1.2;b:长度归一化参数,默认值为0.75;
avgFieldLength:当前分片的平均分词数(当前分片所有文档检索字段的分词个数/当前分片总文档数)
fieldLength:本文档检索字段的分词数
IDF(inverse document frequency):逆文档频率,搜索文本中的各个词条在整个索引的所有文档中出现的次数,出现的次数越多,就越不相关
计算公式:
IDF=log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5))
docFreq:此分片上检索字段中出现检索词的文档数,number of documents containing term
docCount:此分片上的文档总数,total number of documents with field
score:评分
Boost*idf*tfNorm=2*10.060062*1.0356903=20.838219