搜索
query rewrite
指导召回
意图识别
分词、结合(短分词结合)、粘连(要求连续命中)
核心词/Fuzzy
同义词:严格同义词 (上下文同义词在qsrch中触发)
检索field(title检索、类别搜索、全文检索)
成分识别/NER
指导rank
实体识别
词权重
动态词权重:term_weight
静态词权重:idf(跟域相关)
tokens之间紧密度(不一定要有)
rank
基础打分
p(doc | query) 正比于 p(doc) * p(query | d)
p(doc) : 静态分
- PageRank,链接分析,网页分析
- 某些情况下可以加入场景因素,表达为 p (doc | context) , 比如,对于地图搜索,考虑用户当前位置与POI的距离,计算 p ( poi | distance )
p(query | d) :相关性
- doc用query来表达的概率/ 从doc中产生query的概率 --> 最大似然 --> 交叉熵 tf*idf,词袋模型:Bm25;tf*idf ;cos等
- 考虑紧密度proximity
- sentence score
- 多个field的score
- title
- query anchor (引入用户行为)
- wei
- dwei
- order
- dorder
- keywords
- summary
- content
- 不同的field根据其特性采用不同的打分方式
二次排序
获得全局结果后,可以进行启发式的调序、过滤、触发重查和结果合并。
精排
- 对头部结果可以获取更加充分的正排信息/summary,引入复杂的模型,进行精排。
- 模型排序:
- LTR:lambdamart
- 搜索的场景,通常大多数特征可以用低维稠密特征来表达,适用xgb/lightgbm等树模型
- listwise,优化NDCG
- 用人工标注数据
- 点击模型
- 对doc的吸引度和点击后的满意度进行建模,DBN
- DSSM
- query与title的语义相似度
- 用点击数据
- LTR:lambdamart
searcher
1)倒排索引(posting list),位置列表(location list)
倒排的数据结构:
数组:可压缩,求交块,增量复杂度较高,适用于doc集合大的情况比如网页搜索
双向无锁链表:实时更新,增量简单,数据量小时用
有序集合:std::set<int> , 便于求交、复杂查询,小数据规模,不便于增量更新
docid按静态分有序:支持对召回结果进行截断(但是增量数据不能保证docid有序)
2)属性(各维度静态分,类别,标签等属性信息)
附:
final = (bm25 rank + sentence rank) * boost
importance
importance = examined / sc
attract
attract = uv / examined
satisfy
satisfy = fc / uv
点击离线计算的特征有:
doc: pvnum
doc-query: weight、dweight、dorder
doc-query: first click、examined、uv、search count
doc-query: importance、attract、satisfy
其中first click 、examined、uv是中间特征,线上不使用
doc-query计算维度有全量、近60天、内部数据、外部数据
weight
query在doc下的点击分布权重
score = uv * uv / sc
weight = currunt_score / sum_of_all_query_score_in_doc * 100
dweight
doc在query下的点击分布权重
dweight = currunt_score / sum_of_all_doc_score_in_query * 100
dorder
doc在query下依据score排序后的位置,现在都设为10
search count
用户完整查询的次数
根据用户id及同一用户点击间隔时间(1h)进行分割
first click
doc在query下被首次点击的次数
根据pos有较小权重调整:[1, 1, 2, 2, 2]
examined (不太准,有点问题)
doc在query下被用户看到的次数
根据点击pos排序,排在前边的认为是看过的
uv
doc在query下被点击的次数
注:i_表示xx搜索的点击,e_表示xx搜索的点击,r_表示近60天的点击
Satisfy
satisfy、r_satisfy
satisfy = (4.0 + i_fc) / (20.0 + i_uv)
first click占总点击的比例,反映了用户对图片的满意度
Attract
attract、r_attract
attract = (10.0 + i_uv) / (i_examined + 50)
反映图片对用户的吸引力
Title field
section_score[title] += sentence.proximity_score
Content field
section_score[content] = max(sentence.proximity_score, section_score[content])
Anchor field
section_score[anchor] += sentence.proximity_score
Query field
section_score[query] += sentence.proximity_score
对anchor 和query 域的原始分数做归一化处理
orig_score / (norm_factor + orig_score)
norm_factor:anchor域8.0,query域2.0
github
推荐我的开源项目 exFM c++ deepFM