You need to enable JavaScript to run this app.
导航
后置处理算子
最近更新时间:2025.04.02 11:16:14首次发布时间:2025.04.02 11:16:14
我的收藏
有用
有用
无用
无用

后置处理算子是 VikingDB 提供的一种检索后处理能力,用于在向量召回之后,对候选数据进行进一步的过滤和优化,确保最终返回的搜索结果更加精准、高效。
在 VikingDB 中,后置处理算子可用于:

  • 结果精准筛选:基于业务需求通过正则匹配设定筛选规则,如筛选包含某种特征文字信息的商品,确保用户获得有效的检索结果。
  • 数据质量提升:使用正则匹配对检索结果进行格式校验,过滤包含特殊字符、非法内容或广告信息的数据,确保返回内容符合标准,提高数据规范性。
  • 检索结果均衡:对特定字段设置出现频率限制,防止某些值占据过多搜索结果,如热门品牌、热门作者或特定分类过度曝光,保证检索结果的多样性和公平性。

说明

后置处理算子是通用检索能力,您可以将其应用在基本向量检索稠密稀疏混合检索中。

参数说明

参数

类型

是否必选

默认值

参数说明

PostProcessOps

list<map>

后置处理算子列表。在向量或标量召回阶段后,对候选数据进行进一步过滤处理,如字符串匹配、频控等。每个算子为一个map,串行执行。默认为空。详见下文后置处理算子。

PostProcessInputLimit

int

当设置了post_process_ops时,进入后置处理阶段的候选数量。默认值1000,最大值为min(1600, limit * 10)。

后置处理算子

算子

说明

示例

string_match

正则匹配算子。仅限string类型字段使用。
正则匹配规则请参考:Syntax

{
   "op": "string_match",
   "field": "name",
   "pattern": "^[0-9A-Za-z_]+$"
}

string_contain

关键词匹配算子。仅限string类型字段使用。
表示该字段内容包含pattern。

{
   "op": "string_contain",
   "field": "name",
   "pattern": "bar"
}

enum_freq_limiter

频控算子。仅限string类型字段使用。
用于保证一次召回的结果中, 一个特定取值出现的总数不超过 threshold 次。

{
  "op": "enum_freq_limiter",
  "field": "city"
  "threshold": 5
}

示例
//获取指定索引,程序初始化时调用即可,无需重复调用
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

表示找到的向量和输入的向量的匹配程度。