Redis 实战 —— 10. 实现内容搜索、定向广告和职位搜索

使用 Redis 进行搜索 P153

通过改变程序搜索数据的方式,并使用 Redis 来减少绝大部分基于单词或者关键字进行的内容搜索操作的执行时间。 P154

基本搜索原理 P154

倒排索引 (inverted indexes) 是互联网上绝大部分搜索引擎使用的底层结构,它类似于书本末尾的索引。倒排索引从每个被索引的文档里面提取一些单词,并记录包含每个单词的文档集合。 P154

示例

假设有三个文档:

  • R = “it is what it is”
  • S = “what is it”
  • T = “it is a banana”

我们就能得到下面的倒排索引集合:

  • “a”: {2}
  • “banana”: {2}
  • “is”: {0, 1, 2}
  • “it”: {0, 1, 2}
  • “what”: {0, 1}

检索的条件 “what”, “is” 和 “it” 将对应这个集合:{0,1} ∩ {0,1,2} ∩ {0,1,2} = {0,1}

可以发现 Redis 的集合和有序集合非常适合处理倒排索引。

基本索引操作

从文档里面提取单词的过程通常被成为语法分析 (parsing) 和标记化 (tokenization) ,这个过程可以产生一系列用于表示文档的标记 (token) ,有时又被成为单词 (word) 。 P155

标记化的一个常见的附加步骤就是移除非用词 (stop word) 。非用词就是那些在文档中频繁出现却没有提供相应信息量的单词,对这些单词进行搜索将返回大量无用的结果。 P155

本书中实现方向索引的逻辑非常简单:

  1. 将文档划分为单词,并移除一个字符的单词
  2. 对于每个单词获取或创建对应的集合,将当前文档的唯一标识放入集合中

如果需要支持中文等,就不能简单进行英文分词,需要分词器进行处理。第一次接触倒排索引是在 Elasticsearch 中,感兴趣的可以了解 Elasticsearch 中倒排索引的实现以及 IK 中文分词器。

基本搜索操作

在索引里面查找一个单词是非常容易的,只需要获取单词集合里面的所有文档即可。根据多个单词查找文档时,就需要根据条件处理对应的集合,再从最终集合中获取所有文档。 P156

可以使用 Redis 的集合操作完成对不同条件的处理:

  • SINTER / SINTERSTORE: 找出同时包含所有指定单词的文档集合
  • SUNION / SUNIONSTORE: 找出至少包含一个指定单词的文档集合
  • SDIFF / SDIFFSTORE: 找出包含某个单词且包含其他某些单词的文档集合

通过以上三类命令,我们基本能实现条件大部分的与或非操作。

分析并执行搜索

我们使用的查询语句进行分词后具有以下特征:

  • 以 + 开头的单词&#

你可能感兴趣的:(redis)