Lucene index由许许多多的Segment组成,每一个Segment里面包含着文档的Term字典、Term字典的倒排表、文档的列式存储DocValues以及正排索引 。它能够独立的直接对外提供搜索功能,几乎是一个缩小版的Lucene index 。
(3)Term字典和倒排表
文章插图
上图是Term字典和其倒排表的大致样子
当然这里还有些重要数据结构,比如:
- FST:term索引,在内存中构建 。可以快速实现单Term、Term范围、Term前缀和通配符查询 。
- BKD-Tree:用于数值类型(包括空间点)的快速查找 。
- SkipList:倒排表的数据结构
有了Term字典和倒排表我们就能直接拿到搜索条件匹配的结果集了,接下来只需要通过docID去正排索引中取回整个doc然后返回就完事儿了 。
这是ES的基本盘理论上不会慢,我们猜测慢查询发生在排序上 。那给请求加一个排序会发生什么呢?比如:
GET /content-alias/_search { "track_total_hits":false, "query": { "bool": { "filter": [ { "term": { "category_id.keyword": "xxxxxxxx" } } ] } }, "sort": [ { "publish_time": { "order": "desc" } } ], "size": 10 }通过倒排表拿到的docId是无序的,现在指定了排序字段,最简单直接的办法是全部取出来,然后排序取前10条 。这样固然能实现效果,但是效率却是可想而知 。那么Lucene是怎么解决的呢?
(4)DocValues
倒排索引能够解决从词到文档的快速映射,但需要对检索结果进行分类、排序、数学计算等聚合操作时需要文档号到值的快速映射 。而正排索引又过于臃肿庞大,怎么办呢?
这时候各位大佬可能就直接想到了列式存储,没有错,Lucene就引入了基于docId的列式存储结构——DocValues
文档号
列值
列值映射
0
2023-01-13
2
1
2023-01-12
1
2
2023-03-13
3
比如上表中的DocValues=[2023-01-13, 2023-01-12,2023-03-13]
如果列值是字符串,Lucene会把原来的字符串值按照字典排序生成数字ID,这样的预处理能进一步加快排序速度 。于是我们得到了DocValues=[2, 1, 3]
Docvalues的列式存储形式可以加快我们的遍历的速度 。到这里一个常规的搜索取前N条记录的请求算是真正的拆解完成 。这里不讨论词频、相关性打分、聚合等功能的分析,所以本文对整个过程和数据结构做了大幅简化 。如果对这部分感兴趣,欢迎一起讨论 。
此时排序慢的问题也逐渐浮出了水面:尽管Docvalues又是列式存储,又是将复杂值预处理为简单值避免了查询时的复杂比较,但是依旧架不住我们需要排序的数据集过大 。
看起来ES尽力了,它好像确实不擅长解决我们这个场景的慢查询问题 。
不过有灵性的各位读者肯定想到了, 如果能把倒排表按照我们预先指定的顺序存储好,就能省下整个排序的时间 。
2.2.2 IndexSorting
很快ES官方文档《How to tune for search speed》中提到了一个搜索优化手段——索引排序(Index Sorting)出现在了我们的视野中 。
从文档上的描述我们可以知道,索引排序对于搜索性能的提升主要在两个方面:
- 对于多条件并列查询(a and b and ...),索引排序可以帮助我们把不符合条件的文档存在一起,跳过大量的不匹配的文档 。但是此技巧仅适用于经常用于筛选的低基数字段 。
- 提前中断:当搜索排序和索引排序指定的顺序一样时,只需要比较每个段的前 N 个文档,其他的文档仅需要用于总数计算 。比如:我们的文档中有一个时间戳,而我们经常需要按照时间戳来搜索和排序,这时候如果指定的索引排序和搜索排序一致,通常能够极大的提高搜索排序的效率 。
(1)开启索引排序
PUT /content { "settings": { "index": { "sort.field": "publish_time", // 可指定多个字段 "sort.order": "desc" } }, "mAppings": { "properties": { "content_id": { "type": "long" }, "publish_time": { "type": "long" }, ... } } }如上面的例子,文档在写入磁盘时会按照 publish_time 字段的递减序进行排序 。
推荐阅读
- Kafka实时数据即席查询应用与实践
- 用.NET爬虫轻松获取招标网站数据
- 量化交易—Python基础语法与数据结构
- 抖音小店搜索流量怎么做?怎么提升搜索流量?
- 数据结构与算法 --- “哨兵”思想
- |剑宗,重剑轻剑皆有神器,数据远超全职业,成为版本热门选择!
- |胡胖单飞后,“青春老男孩”数据下滑明显,团队分裂的真相是什么
- 苹果|销毁核心数据,裁员700人!摆了9年架子后,260亿巨头扛不住了
- 文件丢三落四?玩机十年经验告诉你,这个方法精准搜索文件
- |郭德纲严重警告!曹云金用数据强势反击:30万人在线,6400万点赞!