后置处理算子是 VikingDB 提供的一种检索后处理能力,用于在向量召回之后,对候选数据进行进一步的过滤和优化,确保最终返回的搜索结果更加精准、高效。
在 VikingDB 中,后置处理算子可用于:
说明
后置处理算子是通用检索能力,您可以将其应用在基本向量检索、稠密稀疏混合检索中。
参数 | 类型 | 是否必选 | 默认值 | 参数说明 |
---|---|---|---|---|
PostProcessOps | list<map> | 否 | 后置处理算子列表。在向量或标量召回阶段后,对候选数据进行进一步过滤处理,如字符串匹配、频控等。每个算子为一个map,串行执行。默认为空。详见下文后置处理算子。 | |
PostProcessInputLimit | int | 否 | 当设置了post_process_ops时,进入后置处理阶段的候选数量。默认值1000,最大值为min(1600, limit * 10)。 |
算子 | 说明 | 示例 |
---|---|---|
string_match | 正则匹配算子。仅限string类型字段使用。 |
|
string_contain | 关键词匹配算子。仅限string类型字段使用。 |
|
enum_freq_limiter | 频控算子。仅限string类型字段使用。 |
|
//获取指定索引,程序初始化时调用即可,无需重复调用 Index index = vikingDBService.getIndex("test_text", "test_index_text");
Map<String, Object> stringMatchOp = new HashMap<>(); stringMatchOp.put("op", "string_match"); stringMatchOp.put("field", "f_string"); stringMatchOp.put("pattern", ".*doc[4-9]*$"); // Map<String, Object> stringLikeOp = new HashMap<>(); // stringLikeOp.put("op", "string_contain"); // stringLikeOp.put("field", "f_string"); // stringLikeOp.put("pattern", "doc"); Map<String, Object> enumFreqLimitOp = new HashMap<>(); enumFreqLimitOp.put("op", "enum_freq_limiter"); enumFreqLimitOp.put("field", "f_string"); enumFreqLimitOp.put("threshold", 2); List<DataObject> datas = index.search(new SearchParam() .setScalarOrder(new ScalarOrder("f_int64", "asc").build()) .setOutputFields(Arrays.asList("f_id", "f_string", "f_int64", "f_float32")) .setPartition("default") .setPostProcessInputLimit(100) .setPostProcessOps(Arrays.asList(stringMatchOp, enumFreqLimitOp)) .setLimit(3) .build()); for (DataObject data : datas) { System.out.println(data); }
Java 调用执行上面的任务,返回 List<DataObject> 。DataObject 实例包含的属性如下表所示。
属性 | 说明 |
---|---|
id | 主键 id。 |
fields | 请求返回中的 fields 字段,是具体的数据,map 类型。 |
score | 表示找到的向量和输入的向量的匹配程度。 |