有任务需要对用户的词,检索到相应的广告词。(个性化的广告词),概括为:通过简短(a,b,c,d) 检索出 广告词(A, B ,C, D)
1、如果内存一个比较简单的是在内存中做索引。
内存建索引的节省内存的方法:
1)广告词索引:id1-> A; id2 ->B; id3->C; id4 ->D;
2) 细粒度词到广告词的倒排索引:
建立切词后的细粒度的词;假设A切出来有a,c; B切出来的也有: a, b
那么a -> id1, id2
b -> id2
2、进一步加入权重:
在1)中加入对应的权重:
1)广告词索引:id1-> A,wegihtA; id2 ->B,weightB; id3->C,weightC; id4 ->D,weightD;
(A,weightA)是一个结构体,作为一个结构存储。
2)倒排: 如果在建立倒排时,拉链太长,我们可以在建立的时候,按wegiht排序好, 按wegiht进行截断。这样在拉链的从前往后weight是降序排列。
3、检索服务:
在检索的时候,比如输入为(a,c)两个细粒度词租组成的查找源,则直接从倒排里找到对应的下标值。
可以先求交(这就看实际需要了),如果求交没有的话,在取并集。
a,c也相对应带有权重(比如tf, 或者wordrank分值)f, 和weightA,wegihtB 加权,得到最终的各个query下标对应的分值,然后排序。
最终可以选取top,但为了多样性一般是选了topN,然后在从中random选取n个(n为最终需要的)
4、最终分数:
最终分数可以是f 和weight的加权值。 根据需要,也可以是产出(a,c)对应的权重直接付给 最终的结果。
扩展延升:
小型的应用可以内存搞定,但是字典可能会越来越大,不同的业务需求也来越多,这种服务越来越多,纯粹内存形式搞不定。 现在各种分布式的搜索架构的ElasticSearch
运用比较广泛,在Lucene基础上再包了一层。