混合搜索结合了向量搜索和传统文本搜索的优势,可以根据业务场景灵活选择搭配,以提供符合业务召回需要的更精准的搜索结果。
前置过滤
搜索方式:在向量搜索之前应用过滤器,只对符合条件的文档进行向量相似度计算。
适用场景:适合有明确筛选条件的场景,例如书籍分类型、电商的品类过滤等。
GET book-index/_search{"knn":{"field":"title_vector","query_vector": [0.1, 0.2, 0.3 ...],"k":10,"num_candidates": 100,"filter":{ // 前置过滤条件"term":{"category": "历史"}}}}
后置过滤
搜索方式:先执行向量搜索,再对结果进行过滤。
适用场景:适合需要先进行泛化搜索,再过滤收敛的场景。
注意:后置过滤可能过滤掉大量结果,导致最终返回文档不足,因此建议设置较大的 k 值来保证足够的结果返回。
说明:如下代码示例中,filter子句无论放在must前面还是后面,执行效果都一样,都是后置过滤。
GET book-index/_search{"query":{"bool":{"must":[{"knn":{"field":"content_vector","query_vector": [0.1, 0.2, 0.3 ...],"k":100,"num_candidates": 500}}],"filter":[ // 后置过滤,filter子句无论放在前面还是后面,执行效果都一样。{"range": {"price": {"gte": 15,"lte": 25}}}]}},"size": 10}
并行搜索
搜索方式:向量搜索和文本搜索并行执行,结果按分数合并,可通过 boost 调整权重。
适用场景:适合语义相似度和关键词匹配并重的场景。
GET book-index/_search{"query":{"bool":{"should":[{"range": {"price": {"gte": 15,"lte": 25}}},{"knn":{"field":"title_vector","query_vector": [0.1, 0.2, 0.3 ...],"k":2,"num_candidates": 50}}]}}}