多标签高效检索解决方案

屌丝论坛(assbbs.com)原创,转载请注明。

前言:遍历是多标签检索逻辑上不可缺少的环节,本方法并不是避免遍历,而是尽量缩小遍历的范围。

首先建立一个“标签ID/帖子ID”表,并建立索引:标签ID-帖子ID。

再建立一个“标签ID(双标签也可用)/使用次数”表,并建立索引:标签ID。

每个帖子发表时,根据由小到大建立双标签关联,并写入标签表。

举个例子,帖子123,里面有标签(ID):日记(6)、遛狗(8)、洗浴(13)、吃饭(2)

那么需要写入索引表的有:

吃饭(2)、日记(6)、遛狗(8)、洗浴(13)、吃饭+日记(2+6)、吃饭+遛狗(2+8)、吃饭+洗浴(2+13)、日记+遛狗(6+8)、日记+洗浴(6+13)、遛狗+洗浴(8+13)

这样无论是搜索单标签还是双标签,都能通过索引瞬间找到所需结果。

那么问题来了,搜索3个以上标签时,表中没有指定的索引,该怎么办?按照传统方法,是把后面的标签按照第一个标签遍历,取出所有符合的结果进行交集计算。这样不仅效率低,而且占用的CPU、内存也无比大。

于是想出了一个解决方案,在上述标签表中搜索,可以大幅提升检索效率:

0. 举例为搜索包含“日记(6)”“吃饭(8)”“洗浴(13)”三个关键词的文章。

1. 搜索“标签ID/使用次数”表,确认每一个标签数量都大于0,否则中止。

2. 对三个关键词由小到大进行双词组合,拼出“日记+吃饭(6+8)”、“日记+洗浴(6+13)”、“吃饭+洗浴(8+13)”。

3. 拼出的双词组合搜索“标签ID/使用次数表”,确认每一个组合数量都大于0,否则中止。

4. 根据使用次数由低到高排序双词组合与单标签,由使用频次最低的开始进行遍历比对。

5. 如果发现没有匹配帖子则中止,如果找到匹配帖子则将结果与下一个组合/标签进行比对,直到确认所有双词组合中都有此文章ID,这即是匹配的文章。

搜索引擎也是类似的方法,只不过他们会统计热门关键词组合,如果特别热门的就直接给包含多个关键词的文章建立索引。如果不那么热门的就将遍历结果先存储在缓存里,等热度过去再删掉。

大佬有話說 (1)