如何在Apache Solr混合搜索中获取词法与向量搜索的单独得分
解决方法
要在单个请求中同时获取词法搜索得分、向量搜索得分以及最终总分,只需修改fl参数,利用Solr的函数查询能力直接返回这两个单独得分:
- 修改
fl字段配置
在solr_query的fl参数中,添加两个自定义计算字段,分别调用你已经定义好的normalisedLexicalQuery和vectorQuery来获取单独得分:
"fl": "text, score, lexical_score:query($normalisedLexicalQuery), vector_score:query($vectorQuery)",
lexical_score:返回归一化到0-1区间的词法搜索得分vector_score:返回KNN向量搜索的余弦相似度得分(文档未命中向量搜索时会返回0)score:保留原有的最终合并得分
- 完整修改后的代码片段
def hybrid_search(query, top_k=10): embedding = np.array(embed([query]), dtype=np.float32) embedding = list(embedding[0]) lxq= rf"""{{!type=edismax qf='text' q.op=OR tie=0.1 bq='' bf='' boost='' }}({query})""" solr_query = {"params": { "q": "{!bool filter=$retrievalStage must=$rankingStage}", "rankingStage": "{!func}sum(query($normalisedLexicalQuery),query($vectorQuery))", "retrievalStage":"{!bool should=$lexicalQuery should=$vectorQuery}", # Union "normalisedLexicalQuery": "{!func}scale(query($lexicalQuery),0,1)", "lexicalQuery": lxq, "vectorQuery": f"{{!knn f=all_v512 topK={top_k}}}{embedding}", # 关键修改:添加两个单独得分的返回字段 "fl": "text, score, lexical_score:query($normalisedLexicalQuery), vector_score:query($vectorQuery)", "rows": top_k, "fq": [""], "rq": "{!rerank reRankQuery=$rqq reRankDocs=100 reRankWeight=3}", "rqq": "{!frange l=$cutoff}query($rankingStage)", "sort": "score desc", }} response = requests.post(SOLR_URL, headers=HEADERS, json=solr_query) response = response.json() return response
- 返回结果说明
请求返回的每个文档会包含以下字段:
text:文档文本内容score:词法得分+向量得分的最终合并分lexical_score:单独的归一化词法搜索得分(范围0-1)vector_score:单独的向量搜索余弦相似度得分(范围0-1,未命中时为0)
这样你就能在一次请求中同时获取三个得分,明确两种搜索的贡献占比,无需发送两次独立请求。
内容的提问来源于stack exchange,提问作者Khaled Alkhouli
相关产品推荐
相关产品推荐

