文章目录加载中

实战案例-分词检索

# 中文分词

对于中文的全文索引,需要借助「分词算法」,将句子拆分为词语。再根据词语建立字典树。比较成熟的分词库是「jieba 分词」:

# 常见方法:全文索引与 Like

# 原理

全文索引的单位是「词语」,Like 的基本单位是字符。比如对于“我爱中国”这句话,如果是全文索引,“我”、“中国”、“爱”都可以匹配到,但是“爱中”就不行。但是对于 Like,则都可以。

全文索引的数据结构是一颗 Trie 树,或者基于此的延伸数据结构,比如 DAT。好处就是,搜索复杂度不取决于数据量(非常牛逼的特性),而取决于字典树的深度,而字典树的深度,取决于词语的长度。

# 适用场景

对于 Like,适合姓名、昵称、性别等此类的小字段。

对于全文检索,适合中长文本。

# 其他方法

# 分词+内存 hash

将标题文本分词后,对词语进行 hash,根据 hash 值查询对应的文章列表 docList。再对所有的分词 hash 的结果查询到的文章列表,进行交集运算。

在时间复杂度上,这与数据量大小无关,复杂度只与进行交集运算的结果集大小有关。优点是,纯内存操作,非常快,实现简单,容易水平扩展;缺点是,不容易持久化,需要设计相关策略,防止数据丢失。

# 分词+DAT

Trie 树的优点是,索引可以及时更新,但是内存占用大。如果对于「更新」不频繁的场景,使用 DAT 即可,它需要提前建立索引,不能实时更新。

⚠️ 虽然 Trie 树可以通过 hash 表方式进行优化,但是对于本例,并不能很方便地持久化。而 DAT 非常容易进行水平拓展。

# 参考链接

本文来自心谭博客:xin-tan.com,经常更新web和算法的文章笔记,前往github查看目录归纳:github.com/dongyuanxin/blog