ElasticSearch笔记

本文介绍了Elasticsearch的倒排表压缩算法,如FrameOfReference和RoaringBitmap,以及如何利用它们节省存储空间。同时,讨论了分片的概念,主分片与副分片的角色,并展示了基本的DSL查询操作,包括分析器的配置和不同类型的查询。此外,还探讨了字符过滤器和正则过滤器的使用,以及聚合查询在统计分析中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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节点类型与分片

Snipaste_2022-07-28_20-10-25.png

分片
    一个索引对应多个数据分片,每个分片是一个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(分析)

  1. 分桶聚合(Bucket agregations)
    使用场景:京东每月统计手机销量top 10,类似于mysql的group by,ELK日志分析等
  2. 指标聚合(Metrics agregations)
    max min avg sum count等
  3. 管道聚合(Pipeline agregations)
    对聚合的再次聚合,嵌套aggregations
get product/_search
{
  "size": 0,
  "aggs" :{
    "avg_price":{
      "avg":{
        "field":"price.keyword"
      }
    },
    "count":{
      "value_count":{
        "field":"price.keyword"
      }
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值