对于 LoHoSearch 这类检索组件,在推荐系统的交叉场景里使用时,关键不在工具本身,而在先定义“交叉”是指哪一层。如果 LoHoSearch 本身支持索引和查询,那它更适合做条件过滤和候选召回,而不是承担最终排序。交叉场景如果指用户属性与物品属性组成复合条件,可以用倒排索引直接过滤;如果指跨推荐场景的联合召回,就需要同时维护多套索引或做多轮查询;如果指文本、图片等多模态字段的交叉,则需先把不同模态统一成向量,再决定是否使用混合检索。
建议把 LoHoSearch 放在推荐链路的召回或粗排阶段,用它解决“同时满足多个条件”的候选筛选。交叉场景应先区分是特征交叉、场景交叉还是模态交叉,不同定义决定索引结构。落地时需要完成索引构建、查询构造、候选融合和效果评测四步,且不要用检索打分替代精排模型。
先分清“交叉”属于哪一层
在推荐系统里,“交叉场景”至少有三层含义。
- 特征交叉:例如“用户是学生、价格要低、品类是书籍”,这类条件可以在索引里写成多个字段的组合过滤,LoHoSearch如果有结构化查询能力,直接拼成 must / and 即可。
- 场景交叉:例如同一个品类在首页推荐、搜索结果页和详情页相似推荐里都要曝光,此时需要为每个场景独立召回,或用一个索引带上场景标识再分场景请求。
- 模态交叉:例如文本描述与商品图片同时参与召回,通常需要预先将文本和图片编码成同一向量空间,再用向量检索完成候选生成,这取决于LoHoSearch是否支持向量字段。
先确认你遇到的到底是哪一种,因为交叉类型决定了索引字段怎么建、查询条件怎么组织、融合逻辑在哪里写。如果混着讲,很容易把问题做成一个什么都往索引里塞的大表,最后既不好维护,也难定位数据质量问题。
把LoHoSearch放在推荐链路的哪个位置
推荐链路通常是“候选生成 -> 粗排 -> 精排 -> 重排”。LoHoSearch更适合放在候选生成或粗排阶段,用一组明确的查询条件把候选集从十万级缩到百级。在精排之后再用检索去过滤,意义不大,因为精排模型看的是完整特征,检索条件无法覆盖全局信息。
如果当前链路里已经有多路召回,例如协同过滤召回、热度召回、向量召回,那LoHoSearch可以单独作为一路“条件召回”接入。条件召回路的作用不是提高排序精度,而是把符合特定规则的候选稳定带出来。需要特别注意:不要把检索打分直接当作排序分,检索相关性分只能反映字面匹配,不代表用户点击倾向。
一个可复用的接入骨架
下面是一个不依赖具体SDK的伪代码流程,用来表达四步操作。你可以按LoHoSearch实际提供的查询语法替换。
# 1. 构建索引:建议把物品的主键、可过滤字段、排序字段都加入
index.build(
documents=items,
fields=['item_id', 'category', 'price', 'tags', 'title']
)
# 2. 构造查询:把用户画像和当前场景拼成条件
query = {
'filter': [
{'term': {'category': '书籍'}},
{'range': {'price': {'lte': 100}}}
],
'should': [
{'match': {'title': '算法'}},
{'match': {'tags': '编程'}}
],
'min_should_match': 1
}
# 3. 召回:取回候选集
candidates = index.search(query, top_k=200)
# 4. 融合:与协同过滤结果用RRF或加权合并
final_list = rrf_merge([candidates, cf_candidates], k=60)
这个骨架的核心在于:查询条件必须能从当前请求的用户特征和场景参数中算出来。例如用户年龄段、价格偏好、当前页面位置,这些都需要在调用搜索前组装,不能让LoHoSearch自己理解场景。把过滤和匹配分开写,便于后期调试。建议在上线前先跑一批离线评测,把检索结果和人工筛选结果做对比,确认召回条件没有漏掉关键品类。
验证与风险边界
验证检索通道是否有效,可以先离线看召回率和候选覆盖度。具体做法是把线上真实请求日志中的曝光商品作为正样本,检查LoHoSearch是否能在给定条件下召回这些商品。如果召回率偏低,就放宽过滤条件或增加 should 分支。确认离线达标后,再做小流量在线对比,比较加入该路由前后的用户点击次数和停留时长,不要只看单次转化。
风险主要有三点。第一,条件过于严格会把召回规模压得很小,导致后续排序模型没有足够候选,需要设置最低候选集数量或自动放宽条件。第二,索引更新频率要与物品上新和下架速度匹配,否则会出现刚上架的商品搜不到、已下架商品还在召回的情况。第三,多路召回融合时要注意去重和打分归一化,否则检索路的结果可能在排序中被系统性地压低。这些边界都需要结合你实际的LoHoSearch版本和部署环境确认,不能直接套用通用参数。