搜索背后的实现,可以非常简单,简单到什么程度呢?我们就用一个 SQL,LIKE 一下就能 实现;也可以很复杂,复杂到什么程度呢?不说百度谷歌这种专业做搜索的公司,其他非专 业做搜索的互联网大厂,搜索团队大多是千人规模,这里面不仅有程序员,还有算法工程 师、业务专家等等。二者的区别也仅仅是,搜索速度的快慢以及搜出来的内容好坏而已。

理解倒排索引机制

那 ES 是怎么来解决搜索问题的呢?我们来举个例子说明一下,假设我们有这样两个商品,一个是烟台红富士苹果,一个是苹果手机 iPhone XS Max。

image.png

为了能够支持快速地全文搜索,ES 中对于文本采用了一种特殊的索引:倒排索引(Inverted Index)。那我们看一下在 ES 中,这两条商品数据倒排索引长什么样?请看下面这个表。

image.png

这个倒排索引怎么构建的呢?当我们往 ES 写入商品记录的时候,ES 会先对需要搜索的字段,也就是商品标题进行分词。分词就是把一段连续的文本按照语义拆分成多个单词。然后ES 按照单词来给商品记录做索引,就形成了上面那个表一样的倒排索引。

当我们搜索关键字“苹果手机”的时候,ES 会对关键字也进行分词,比如说,“苹果手机”被分为“苹果”和“手机”。然后,ES 会在倒排索引中去搜索我们输入的每个关键字分词,搜索结果应该是:

image.png

666 和 888 这两条记录都能匹配上搜索的关键词,但是 888 这个商品比 666 这个商品匹 配度更高,因为它两个单词都能匹配上,所以按照匹配度把结果做一个排序,最终返回的搜 索结果就是:

**苹果**Apple iPhone XS Max (A2104) 256GB 金色 移动联通电信 4G**手机**双卡双待
烟台红富士**苹果**5kg 一级铂金大果 单果 230g 以上 新鲜水果

为什么倒排索引可以做到快速搜索?

因为整个搜索过程中,我们没有做过任何文本的模糊匹配

如何在 ES 中构建商品的索引?

  1. 使用CURL创建
  2. 基于java客户端同步创建
  3. 基于消息,异步创建

小结

倒排索引相比于一般数据库采用的 B 树索引,它的写入和更新性能都比较差,因此倒排索引也只是适合全文搜索,不适合更新频繁的交易类数据。

思考题