目前knn跟query里面是并列的层级,如下:
{
"size": 400,
"from": 0,
"query": {
"bool": {
"must": [...
],
}
},
"knn": {
"field": "title_embedding",
"query_vector": [...],
"k": 120,
"num_candidates": 400,
"boost": 2,
"name": "knn_query"
},
其中query的结构是这样的:
"query": {
"bool": {
"should": [
{
"bool": {
"name": "base_query",
# 原始query
}
},
{
"bool": {
"name": "base_query_trans_zh",
# 翻译query。有可能是basequery_transen,也有可能两者都有
"boost": 0.75
}
}
],
"minimum_should_match": 1
}
},
我想把knn放到should里面,和basequery、base_query_trans_zh并列。
另外,现在过滤是在knn里面单独加了一遍:
"knn": {
"field": "title_embedding",
"query_vector": [...],
"k": 120,
"num_candidates": 400,
"boost": 2,
"_name": "knn_query",
"filter": {
"range": {
"min_price": {
"gte": 100,
"lt": 200
}
}
}
}
现在不需要了。因为knn在query的内层了。共用过滤。
另外: 我需要再增加一个knn。 需要参考文本embedding获得的逻辑, 通过 curl -X POST "http://localhost:6008/embed/clip_text?normalize=true&priority=1" \ -H "Content-Type: application/json" \ -d '["纯棉短袖", "street tee"]' (用 POST /embed/clip_text 生成多模态文本向量。和文本embedding获取方法类似。注意思考代码如何精简,不要冗余。) 得到文本的多模态embedding。 然后在这里补充一个多模态embedding,寻找图片相似的结果,对应的商品图片字段为image_embedding.vector。 重排融合:之前有knn的配置bias和exponential。现在,文本和图片的embedding相似需要融合,融合方式是dis_max,因此需要配置: 1)各自的权重和tie_breaker 2)整个向量方面的权重(bias和exponential)