什么是搜索引擎?深入搜索引擎原理( 五 )


在 423 和 642 之间找到一个特定的区间:
423-429,640-64243-49,60-635-5
还有一个问题 。比如423会被分割成423、42、4 , 那么4也会被分割成4 , 那么4代表哪一个呢?

什么是搜索引擎?深入搜索引擎原理

文章插图
所以该方法将使用一个额外的字符来保存移位:[0] = (char)( + shift);
比如423分词4的移位为2(这里以十进制为例 , 二进制同理) , 423除以423的移位为0 , 4的移位为0 , 所以前缀必须大于后缀 。
最后 , 由于索引在判断时不需要感知是否为数字 , 所以可以将所有数字视为二进制 , 存储效率更高 。
三、搜索引擎优化
水流职事站思想
LSM(Log Merge Tree)最早是由谷歌的“”提出的 。目标是确保写入性能 , 同时支持更有效的检索 。在很多NoSQL中都有用到 , 也用LSM的思想来写 。
普通的B+树添加记录可能需要seek+操作 , 需要大量的磁盘seeks来移动磁头 。而LSM记录在文件末尾 , 顺序写入减少了摇头/寻道 , 执行效率高于B+树 。LSM的具体原理是什么?
为了保持磁盘的IO效率 , 避免直接修改索引文件 , 所有的索引文件一旦生成 , 都是只读的 , 不能更改 。操作流程如下:
在内存中保存新索引 , 内存缓存(即);当内存中的索引数量达到一定阈值时 , 触发写操作 , 将这部分数据批量写入新文件 , 我们称之为;即 files 新数据生成后 , 无法修改;操作和操作不会立即导致原始数据被修改或删除 , 而是以相同的方式存储和标记;最终会得到大量的数据 , 为了减少资源占用 , 提高检索效率 , 会定期将这些小的合并成大的 。由于map中的数据都是排序好的 , 所以merge中不会出现随机写操作;通过merge , sum操作也能真正有效 , 删除冗余数据 , 节省金钱空间 。
合并过程:
基本
每个文件有N个固定个数 , 超过N则创建一个新的;当数量大于M时 , 合并更大的文件;当较大的数字大于M时 , 合并较大的文件 , 以此类推 。
什么是搜索引擎?深入搜索引擎原理

文章插图
但是 , 这样做的问题是创建了大量文件 , 最坏的情况是搜索所有文件 。
Like and 这个问题的解决方案是实现一个分层 , 而不是根据文件大小执行合并操作 。
每一层维护指定数量的文件 , 以确保键不重叠 。搜索一个键只会找到一个键;每次一个文件只会被合并到上一层的一个文件中 。当一层文件数达到一定数量时 , 合并到上一层 。
所以 , LSM 在日志和传统的单文件索引(B+树 , 哈希索引)之间是中立的 , 它提供了一种机制来管理更小的独立索引文件() 。
通过管理一组索引文件而不是单个索引文件 , LSM 使昂贵的随机 IO 对 B+ 树等结构更快 , 代价是读取操作处理大量索引文件 () 而不是一个 , 在除了一些 IO 被合并操作消耗 。
设计思路
与 LSM 类似 , 但有些不同 。它继承了 LSM 数据写入的优点 , 但只能提供近实时查询 , 不能提供实时查询 。
数据保存在内存中 , 在刷新或刷新之前无法搜索 , 这就是为什么说它提供接近实时而不是实时查询的原因 。看了它的代码 , 发现写数据查查也不是不行 , 只是实现起来比较复杂 。原因是中文数据搜索依赖于建好的索引(比如求逆依赖Term) , 而中文数据索引是在flush时建的 , 而不是实时建的 , 目的是为了建最高效的索引 。当然也可以引入另外一套索引机制 , 在实时写入数据时构建 , 但是这个索引的实现会和现在的内部索引不同 。它需要引入一个额外的写时索引和另一套查询机制 , 具有一定的复杂性 。.