一、前置过滤
搜索方式:在向量搜索之前应用过滤器,只对符合条件的文档进行向量相似度计算。
适用场景:适合有明确筛选条件的场景,例如书籍分类型、电商的品类过滤等。
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 } } ] } }}