0.0.1 • Published 5 years ago

lsearch v0.0.1

Weekly downloads
-
License
ISC
Repository
-
Last release
5 years ago

Node.js全文检索引擎

倒排索引

采用简单、直接的多级嵌套引用链式结构来构建数据索引。通过预先构建的聚合多词组数据集,避免了由于实时计算文档交集产生的资源开销,支持海量数据的高效、精准定位。

一、 关键词分词

对用户输入的关键词组进行分词处理(对于属性分组通常不需要做分词)

二、分词排序

当同一关键词组在通过不同的顺序进行组合时会产生多种路径,如词组:a、b、c可以有多种组合顺序,对应的多种路径,在这种状态下需要为所有组合建立引用关系,导创建和更新索引的成本太高。

为了不产生路径分歧,需要对分词后的关键词进行排序,来确保路径的一致性。

弹性扩张

根据当前的表数据总量自动分裂为更小的数据集

跨表多字段排序

在进行跨数据库、集合、表的多字段排序是可以使用定期缓存策略,每间隔一段时间刷新一次。

对于非限定用户数据集进行排序时,通常对实时性要求并高,排序一次后可用供多个用户重复使用,这种状态下使用临时缓存机制是一个不错的解决方案。

字段排序可以通过预先构建的索引来实现,即在内存中提前对每个排序字段构建分区

交集算法

求多个文档集合的交集的算法是突破搜索引擎性能瓶颈最大的阻碍,因此一个高效的交集算法至关重要。

https://www.jianshu.com/p/109c82e19b3c

备选方案

  • 使用拉链法+跳表对有序链表集合求交集

  • 网格字典

深度优先匹配

搜索结果数量受限

建立索引时如果索引库文档树大于一定值时(如限量最大值为5000),则不再建立索引

按相关性进行预排序,然后提前相关的Top N个结果

匹配模式

单字、单词匹配

由于单字、单词查询不需要求交集,因此可以将Top N(N通常不会大于2000)直接放入内存倒排索引树,加快查询速度。

基于搜索引擎面向用户的特性,用户通常没有耐心对搜索结果连续翻阅超过50页,因此在单次查询中搜索引擎会限制返回结果数量(通常在50-100页之间),实际上存在大量的关键词即使被命中了也没有展现的机会。

利用返回结果受限的特征,对单字、单词没有交集的查询可以在内存倒排索引树中直接保存结果集,索引树并不会太大。

词组、短语匹配

  • 词组、短语匹配 - 全量求交集

二级索引

为常用词组建立二级索引集,冷门词使用单独索引集