多标签高效检索解决方案 屌丝论坛(assbbs.com - Assbbs
多标签高效检索解决方案 屌丝论坛(assbbs.com)原创,转载请注明。 前言:遍历是多标签检索逻辑上不可缺少的环节,本方法并不是避免遍历,而是尽量缩小遍历的范围。 首先建立一个“标签ID/帖子ID”表,并建立索引:标签ID-帖子ID。 再建立一个“标签ID 双标签也可用 /使用次数”表,并建立索引:标签ID。 每个帖子发表时,根据由小到大建立双标签关联,…
多标签高效检索解决方案 屌丝论坛(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,这即是匹配的文章。 搜索引擎也是类似的方法,只不过他们会统计热门关键词组合,如果特别热门的就直接给包含多个关键词的文章建立索引。如果不那么热门的就将遍历结果先存储在缓存里,等热度过去再删掉。