我知道全文搜索的一个基本方面是使用倒排索引。因此,使用倒排索引,一个单词的查询变得很容易回答。假设索引的结构如下:
some-word -> [doc385, doc211, doc39977, ...](按排名降序排列)
要回答对该词的查询,解决方案只是在索引中找到正确的条目(这需要 O(log n) 时间)并从索引中指定的列表中显示一些给定数量的文档(例如前 10 个)。
但是返回匹配两个单词的文档的查询呢?最直接的实现如下:
- 将 A 设置为具有单词 1 的文档集(通过搜索索引)。
- 将 B 设置为具有单词 2 的文档集(同上)。
- 计算 A 和 B 的交集。
现在,第三步可能需要 O(n log n) 时间来执行。对于可能使查询响应缓慢的非常大的 A 和 B。但是像谷歌这样的搜索引擎总是在几毫秒内返回他们的答案。所以这不能是完整的答案。
一个明显的优化是,由于像 Google 这样的搜索引擎无论如何都不会返回所有匹配的文档,所以我们不必计算整个交集。我们可以从最小的集合(例如 B)开始,并找到足够的条目也属于另一个集合(例如 A)。
但是我们不能还有以下最坏的情况吗?如果我们将 A 设置为匹配一个常用词的文档集,并将 B 设置为匹配另一个常用词的文档集,那么可能仍然存在 A ∩ B 非常小的情况(即这种组合很少见)。这意味着搜索引擎必须线性地遍历 B 的所有元素 x 成员,检查它们是否也是 A 的元素,以找到符合这两个条件的少数元素。
线性并不快。而且您可以搜索两个以上的单词,因此仅使用并行性肯定不是整个解决方案。那么,这些案例是如何优化的呢?大型全文搜索引擎是否使用某种复合索引?布隆过滤器?有任何想法吗?