ElasticSearch中压缩算法LZ4的使用

本文介绍了ElasticSearch中LZ4压缩算法的原理和应用。LZ4侧重于快速压缩和解压,而非高压缩比。文章详细讲解了LZ4的压缩格式,包括Sequence结构、字面序列长度和匹配长度的表示,以及特定的压缩规则。通过实例展示了压缩过程,包括计算hash和找到相同数据区间的步骤。同时提供了Lucene 7.7.3版本中的LZ4压缩代码示例。
摘要由CSDN通过智能技术生成

简介

lz4是目前效率最高的压缩算法,更加侧重压缩解压速度,而不是压缩比。LZ4是ElasticSearch数据存储的默认编码(压缩)方式,通过index.codec来设置。

压缩原理

lz4压缩算法原理比较简单,如下面例子:

输入:abcde_bcdefgh_abcdefghxxxxxxx
输出:abcde_(5,4)fgh_(14,5)fghxxxxxxx

其中两个括号内的便代表的是压缩时检测到的重复项,(5,4) 代表向前5个byte,匹配到的内容长度有4,即"bcde"是一个重复。当然也可以说"cde"是个重复项,但是根据算法实现的输入流扫描顺序,我们取到的是第一个匹配到的,并且长度最长的作为匹配。

压缩格式

Sequence是LZ4最小数据单元,格式如下:

Token(1字节) Literal length+ 字面序列长度(0~n字节) 字面序列 Offset(2字节) Match length+ 匹配长度(0~n字节)
匹配长度(低4位) 字面序列长度(高4位)

在这里插入图片描述

  1. token占一字节,其中高四位表示字面序列长度,低四位表示匹配长度。
  2. 字面序列长度即使字面序列的字符个数;匹配长度即是匹配序列的字符个数
  3. 因为字面序列长度以及匹配长度都占四个字节,最大为15。如果长度比15大的话,则将剩余的部分存到Literal length+和Match length+中。例如,字面序列长度为375,则Token的高4位为全1(即15),Token的后一个字节为255,再后一个字节为105。
  4. offset为匹配序列的偏移量。
  5. 当Token足以存下字面序列长度时,Token后面就是字面序列。当Token足以存下匹配长度时,Offset后面的字节将是EOF或者另外一个sequence。

LZ4算法还有一些特定的规则:

  1. 被压缩文本的最后5个byte只能用原文表示。
  2. 最后一次匹配的开始位置到文本末尾不能少于12个byte。
  3. 如果被压缩文本的长度小于13个byte,那么用原文表示会更节省空间。

举例

压缩过程分为两步
步骤一:计算hashÿ

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Cloud Alibaba使用Elasticsearch的KNN算法进行查询,需要进行以下步骤: 1. 首先需要在pom.xml文件添加elasticsearch-rest-high-level-client和elasticsearch-repository-spring-data依赖。 ``` <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>4.0.3</version> </dependency> ``` 2. 创建一个POJO类,用于映射Elasticsearch的文档数据。 ``` @Data @Document(indexName = "knn_index", type = "knn_type") public class KnnEntity { @Id private String id; private String name; private float[] vector; } ``` 3. 创建一个Repository接口,继承自ElasticsearchRepository,用于对Elasticsearch进行操作。 ``` public interface KnnRepository extends ElasticsearchRepository<KnnEntity, String> { Page<KnnEntity> findByName(String name, Pageable pageable); Page<KnnEntity> findByVector(float[] vector, Pageable pageable); //查询距离指定向量最近的k个文档 @Query("{\"knn\":{\"vector\":{\"vector\":\"?0\",\"field\":\"vector\"},\"k\":?1}}") List<KnnEntity> findNearest(float[] vector, int k); } ``` 4. 在Spring Boot配置文件,设置KNN算法相关的配置。 ``` spring: elasticsearch: rest: uris: http://localhost:9200 connection-timeout: 1000ms socket-timeout: 30000ms max-conn-per-route: 10 max-conn-total: 30 username: elastic password: changeme repositories: enabled: true # KNN plugin settings knn: enabled: true space-type: l2 ``` 5. 在代码使用KNN算法进行查询。 ``` @Autowired private KnnRepository knnRepository; //根据名称查询 Page<KnnEntity> page = knnRepository.findByName("test", PageRequest.of(0, 10)); //查询距离指定向量最近的k个文档 float[] vector = {1.0f, 2.0f, 3.0f}; List<KnnEntity> list = knnRepository.findNearest(vector, 5); ``` 以上就是在Spring Cloud Alibaba使用Elasticsearch的KNN算法进行查询的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值