倒排索引为什么用FST(或者trie树)而不是hashmap?hashmap只能满足精确key查找,倒排需要匹配各种模糊搜索。
1. 召回
查询query转为集合运算的bool表达式
改写优化下get_word_match,更加适用于短语
2. 排序:关键词个数 - 向量余弦夹角- tf-idf
召回主要突出文档与查询的相似性、排序更主要是找到文档与文档之间的差异性、区分性从而获得相关度的不同评分。
下方向量每一个维度表示一个词组,所有词组组成词表。
每个文档的打分实际就是在所选的向量空间下求查询短语向量与当前文档向量之间的相似度。
所以词表选择影响很大,可以选当前文档的所有分词、召回结果集的分词集合,候选集(相当于倒排索引的词典?)所有文档的分词、所有采集到的文档的总分词集合、整个文档世界的分词集合。一般选择候选集。
预处理优化:在构建倒排索引的词典vocabulary的时候,可以同时把所有文档的tf/idf值都提前计算出来保存到dict,当执行搜索时可以直接从dict词典中查出来
相对而言,粗排往往是整个搜索性能的瓶颈,粗排可以通过减少向量维度(如只用query生成词典vocabulary空间),或者简化算法(比如用ann算法,而不用tf/idf、bm25等复杂算法)等来快速降低文档规模。另外,分布式环境下也有更多优化方式。