ElasticSearch笔记
倒排表压缩算法
Frame Of Reference (FOR)压缩算法
需要存储每个词对应的id,如果我们每个id都真实存储下来,每个id需要一个int 4Byte。
但是如果我们每次计算一下差值,每次计算最大差值,根据最大差值得出需要的大小。
以73,300,302,332,343,372为例: 前后差值分别为73,227,2,30,11,29,最大差值为227,因此我们设置大小为8bit就够用了。
RoaringBitmap
int 4Byte 32bit,除以65535 前16位表示商后16位表示余数,前16位用一个short表示,后边最多有65535个short,最多占用65535 + 1 Byte
识别和存储单词用trie和fst
es节点类型与分片
分片
一个索引对应多个数据分片,每个分片是一个luccence实例,分布在不同节点,每个节点又是不同的elasticsearch实例
主分片一旦确定数量就不能变化了,副分片可以动态调整。es会将请求尽量均衡的分配到每一个luccence实例(即每一个分片)。副本提升了效率,提升可用性。
每一份数据(doc)不可能存在多个主分片中
基本操作示例(DSL查询)
一个analyzer即分析器,无论是内置的还是自定义的,只是一个包含character filters(字符过滤器)、
tokenizers(分词器)、token filters(令牌过滤器)三个细分模块的包。
一个分析器必须有且只有一个分词器,分析器可能有零个或多个 token过滤器,它们按顺序应用生效。
put /product
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
},
"mappings": {
"properties": {
"commodity_id": {
"type": "long"
},
"commodity_name": {
"type": "text",
"analyzer": "ik_max_word"
},
"picture_url": {
"type": "keyword"
},
"price": {
"type": "double"
}
}
}
}
delete product
POST /product/_doc/1
{
"commodity_id": 2,
"commodity_name": "我爱中华人民共和国,我爱伟大的中华民族",
"picture_url":"celebrity",
"price":3.25
}
get product/_search
get product/_mappings
get product/_settings
get product/_search
{
"query":{
"match":{
"commodity_name":"我 我们 中华"
}
}
}
match_phrase 会被分词,他和match的区别在于其必须包含每一个词并且顺序不变,match只包含其中任意一个词就会被搜索出来
get product/_search
{
"query":{
"match_phrase":{
"commodity_name":"我爱 伟大"
}
}
}
term 他和match_phrase的区别在于term不会被分词
get product/_search
{
"query":{
"term":{
"commodity_name":"中华人民共和国"
}
}
}
字符过滤器,令牌过滤器
自定义字符过滤器
put my_index
{
"settings": {
"analysis": {
"char_filter": {
"my_char_filter": {
"type": "mapping",
"mappings": [
"滚 => *",
"垃 => *",
"圾 => *"
]
}
},
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"char_filter": "my_char_filter"
}
}
}
}
}
post my_index/_analyze
{
"analyzer":"my_analyzer",
"text":"垃圾,滚吧"
}
正则过滤器
put my_index
{
"settings": {
"analysis": {
"char_filter": {
"my_char_filter": {
"type": "pattern_replace",
"pattern":"(\\d{3})\\d{4}(\\d{4})",
"replacement":"$1****$2"
}
},
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"char_filter": "my_char_filter"
}
}
}
}
}
post my_index/_analyze
{
"analyzer":"my_analyzer",
"text":"客户手机号:13084577878"
}
聚合查询 Aggregation(分析)
- 分桶聚合(Bucket agregations)
使用场景:京东每月统计手机销量top 10,类似于mysql的group by,ELK日志分析等 - 指标聚合(Metrics agregations)
max min avg sum count等 - 管道聚合(Pipeline agregations)
对聚合的再次聚合,嵌套aggregations
get product/_search
{
"size": 0,
"aggs" :{
"avg_price":{
"avg":{
"field":"price.keyword"
}
},
"count":{
"value_count":{
"field":"price.keyword"
}
}
}
}