Row 操作
插入记录
功能介绍
将一条或者一批记录插入到指定的表中。插入语义为Insert,若记录的主键已存在,则插入失败并报错。当插入一批时,该接口暂不支持批次的原子性。
请求示例
1import java.util.ArrayList;
2import java.util.Arrays;
3import java.util.List;
4
5import com.baidu.mochow.auth.Credentials;
6import com.baidu.mochow.client.ClientConfiguration;
7import com.baidu.mochow.client.MochowClient;
8import com.baidu.mochow.model.entity.Row;
9import com.baidu.mochow.model.entity.RowField;
10import com.baidu.mochow.model.InsertRequest;
11import com.baidu.mochow.model.InsertResponse;
12
13public class Main {
14 public static void main(String[] args) {
15 String account = "root";
16 String apiKey = "*********";
17 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
18 ClientConfiguration clientConfiguration = new ClientConfiguration();
19 clientConfiguration.setCredentials(new Credentials(account, apiKey));
20 clientConfiguration.setEndpoint(endpoint);
21 MochowClient mochowClient = new MochowClient(clientConfiguration);
22 String databaseName = "test";
23 String tableName = "test";
24
25 List<Row> rows = new ArrayList<Row>();
26 rows.add(Row.builder()
27 .addField(new RowField("id", "0001"))
28 .addField(new RowField("vector", Arrays.asList(1, 0.21, 0.213, 0)))
29 .addField(new RowField("bookName", "西游记"))
30 .addField(new RowField("author", "吴承恩"))
31 .addField(new RowField("page", 21))
32 .addField(new RowField("segment", "富贵功名,前缘分定,为人切莫欺心。")).build()
33 );
34 InsertRequest insertRequest = InsertRequest.builder().database(databaseName).table(tableName).rows(rows).build();
35 InsertResponse insertResponse = mochowClient.insert(insertRequest);
36 System.out.printf("Insert affected count:%d\n", insertResponse.getAffectedCount());
37 }
38}
相关类说明
InsertRequest
插入请求,用于往向量数据库插入数据,拥有constructor、getter、setter以及builder等通用方法,通用方法详情可以参考通用说明
1import com.baidu.mochow.model.InsertRequest; //导入包
| 成员名 | 类型 | 是否必填 | 成员含义 |
|---|---|---|---|
| database | String | 是 | 插入数据的库名 |
| table | String | 是 | 插入数据的表名 |
| rows | List<Row> | 是 | 插入的记录列表 |
Row
行数据,可用builder快速构建
1import com.baidu.mochow.model.entity.Row; //导入包
| 成员名 | 类型 | 成员含义 |
|---|---|---|
| fields | Map<String, Object> | 存储一行数据,key为插入的字段名,value为值 |
可以使用Row.builder()获取Row的builder类,builder类拥有如下方法
| 方法 | 参数类型 | 返回值类型 | 功能 |
|---|---|---|---|
| addField | RowField | 无 | 为行增加一个字段值 |
RowField
字段以及值的复合体,成员如下,拥有constructor、getter、setter以及builder等通用方法,通用方法详情可以参考通用说明
| 成员名 | 类型 | 成员含义 |
|---|---|---|
| name | String | 字段名 |
| value | String | 值 |
InsertResponse
插入回复,向量数据库向客户端返回插入请求的执行结果,拥有getter通用方法,通用方法可以参考通用说明。
1import com.baidu.mochow.model.InsertResponse; //导入包
| 成员名 | 类型 | 成员含义 |
|---|---|---|
| affectedCount | int | 插入请求影响的数据库行数 |
插入或更新记录
功能介绍
将一条或者一批记录插入到指定的表中。插入语义为Upsert(Insert or else Update),即,当记录的主键不存在时,则正常插入,若发现主键已存在,则用新的记录覆盖旧的记录。当插入一批时,该接口暂不支持批次的原子性。该接口可用于批量迁移/灌库等场景。
请求示例
1import java.util.ArrayList;
2import java.util.Arrays;
3import java.util.List;
4
5import com.baidu.mochow.auth.Credentials;
6import com.baidu.mochow.client.ClientConfiguration;
7import com.baidu.mochow.client.MochowClient;
8import com.baidu.mochow.model.entity.Row;
9import com.baidu.mochow.model.entity.RowField;
10import com.baidu.mochow.model.UpsertRequest;
11import com.baidu.mochow.model.UpsertResponse;
12
13public class Main {
14 public static void main(String[] args) {
15 String account = "root";
16 String apiKey = "*********";
17 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
18 ClientConfiguration clientConfiguration = new ClientConfiguration();
19 clientConfiguration.setCredentials(new Credentials(account, apiKey));
20 clientConfiguration.setEndpoint(endpoint);
21 MochowClient mochowClient = new MochowClient(clientConfiguration);
22 String databaseName = "test";
23 String tableName = "test";
24
25 List<Row> rows = new ArrayList<Row>();
26 rows.add(Row.builder()
27 .addField(new RowField("id", "0001"))
28 .addField(new RowField("vector", Arrays.asList(1, 0.21, 0.213, 0)))
29 .addField(new RowField("bookName", "西游记"))
30 .addField(new RowField("author", "吴承恩"))
31 .addField(new RowField("page", 21))
32 .addField(new RowField("segment", "富贵功名,前缘分定,为人切莫欺心。")).build()
33 );
34 UpsertRequest upsertRequest = UpsertRequest.builder().database(databaseName).table(tableName).rows(rows).build();
35 UpsertResponse upsertResponse = mochowClient.upsert(upsertRequest);
36 System.out.printf("Upsert affected count:%d\n", upsertResponse.getAffectedCount());
37 }
38}
相关类说明
UpsertRequest
插入或更新请求,用于往向量数据库插入或更新数据,拥有constructor、getter、setter以及builder等通用方法,通用方法详情可以参考通用说明
1import com.baidu.mochow.model.UpsertRequest; //导入包
| 成员名 | 类型 | 是否必填 | 成员含义 |
|---|---|---|---|
| database | String | 是 | 插入数据的库名 |
| table | String | 是 | 插入数据的表名 |
| rows | List<Row> | 是 | 插入的记录列表 |
Row
行数据,可用builder快速构建
1import com.baidu.mochow.model.entity.Row; //导入包
| 成员名 | 类型 | 参数含义 |
|---|---|---|
| fields | Map<String, Object> | 存储一行数据,key为插入的字段名,value为值 |
可以使用Row.builder()获取Row的builder类,builder类拥有如下方法
| 方法 | 参数类型 | 返回值类型 | 功能 |
|---|---|---|---|
| addField | RowField | 无 | 为行增加一个字段值 |
RowField
字段以及值的复合体,成员如下,拥有constructor、getter、setter以及builder等通用方法,通用方法详情可以参考通用说明
| 成员名 | 类型 | 成员含义 |
|---|---|---|
| name | String | 字段名 |
| value | String | 值 |
UpsertResponse
插入或更新回复,向量数据库向客户端返回插入或更新请求的执行结果,拥有getter通用方法,通用方法可以参考通用说明。
1import com.baidu.mochow.model.UpsertResponse; //导入包
| 成员名 | 类型 | 参数含义 |
|---|---|---|
| affectedCount | int | 插入或更新请求影响的数据库行数 |
更新记录
功能介绍
更新表中指定记录的一个或多个标量字段的值
请求示例
1public class Main {
2 public static void main(String[] args) {
3 String account = "root";
4 String apiKey = "*********";
5 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
6 ClientConfiguration clientConfiguration = new ClientConfiguration();
7 clientConfiguration.setCredentials(new Credentials(account, apiKey));
8 clientConfiguration.setEndpoint(endpoint);
9 MochowClient mochowClient = new MochowClient(clientConfiguration);
10 String databaseName = "test";
11 String tableName = "test";
12
13 UpdateRequest updateRequest = UpdateRequest.builder()
14 .database(databaseName)
15 .table(tableName)
16 .addPrimaryKey("id", "0001")
17 .addUpdate("bookName", "红楼梦")
18 .addUpdate("author", "曹雪芹")
19 .addUpdate("page", 21)
20 .addUpdate("segment", "满纸荒唐言,一把辛酸泪").build();
21 mochowClient.update(updateRequest);
22 }
23}
相关类说明
UpdateRequest
更新请求,用于往向量数据库更新数据,拥有constructor、getter、setter等通用方法,通用方法详情可以参考通用说明。其builder方法和通用的builder有区别,在下面有具体说明。
1import com.baidu.mochow.model.UpdateRequest; //导入包
| 成员名 | 类型 | 是否必选 | 成员含义 |
|---|---|---|---|
| database | String | 是 | 插入数据的库名 |
| table | String | 是 | 插入数据的表名 |
| primaryKey | GeneralParams | 是 | 指定记录的主键值。 |
| partitionKey | GeneralParams | 否 | 指定记录的分区键值。 如果该表的分区键和主键是同一个键,则不需要填写分区键值。只有在有主键值的情况下,分区键值才会生效。 |
| update | GeneralParams | 是 | 待更新的字段列表及其新值。 不允许更新主键、分区键和向量字段。 |
可以使用UpdateRequest.builder()获取UpdateRequest的builder类,builder类拥有如下方法
| 方法 | 参数类型 | 返回值类型 | 功能 |
|---|---|---|---|
| database | String | 无 | 设置UpdateRequest的database |
| table | String | 无 | 设置UpdateRequest的table |
| primaryKey | GeneralParams | 无 | 设置UpdateRequest的primaryKey |
| addPrimaryKey | String, Object | 无 | 为UpdateRequest增加一个primaryKey |
| partitionKey | GeneralParams | 无 | 设置UpdateRequest的partitionKey |
| addPartitionKey | String, Object | 无 | 为UpdateRequest增加一个partitionKey |
| update | GeneralParams | 无 | 设置UpdateRequest的update |
| addUpdate | String, Object | 无 | 为UpdateRequest增加一个update |
| build | 无 | UpdateRequest | 返回一个构建好的UpdateRequest |
删除记录
功能介绍
删除表中的指定记录。
请求示例
1import com.baidu.mochow.auth.Credentials;
2import com.baidu.mochow.client.ClientConfiguration;
3import com.baidu.mochow.client.MochowClient;
4import com.baidu.mochow.model.DeleteRequest;
5
6public class Main {
7 public static void main(String[] args) {
8 String account = "root";
9 String apiKey = "*********";
10 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
11 ClientConfiguration clientConfiguration = new ClientConfiguration();
12 clientConfiguration.setCredentials(new Credentials(account, apiKey));
13 clientConfiguration.setEndpoint(endpoint);
14 MochowClient mochowClient = new MochowClient(clientConfiguration);
15 String databaseName = "test";
16 String tableName = "test";
17
18 DeleteRequest deleteRequest = DeleteRequest.builder()
19 .database(databaseName)
20 .table(tableName)
21 .addPrimaryKey("id", "0001")
22 .build();
23 mochowClient.delete(deleteRequest);
24 }
25}
相关类说明
DeleteRequest
删除,用于往向量数据库删除数据,拥有constructor、getter、setter等通用方法,通用方法详情可以参考通用说明。其builder方法和通用的builder有区别,在下面有具体说明。
1import com.baidu.mochow.model.DeleteRequest; //导入包
| 成员名 | 类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| database | String | 是 | 删除数据的库名 |
| table | String | 是 | 删除数据的表名 |
| filter | String | 否 | 删除的标量过滤条件。 当要删除全部记录,可设置为"*";Filter表达式语法参照SQL的WHERE子句语法进行设计,其详细描述和使用示例请参见Filter条件表达式。必须填写主键值或过滤条件,二者有且仅能选其一。 |
| primaryKey | GeneralParams | 否 | 指定记录的主键值。 |
| partitionKey | GeneralParams | 否 | 指定记录的分区键值。 如果该表的分区键和主键是同一个键,则不需要填写分区键值。只有在有主键值的情况下,分区键值才会生效。 |
可以使用UpdateRequest.builder()获取UpdateRequest的builder类,builder类拥有如下方法
| 方法 | 参数类型 | 返回值类型 | 功能 |
|---|---|---|---|
| database | String | 无 | 设置DeleteRequest的database |
| table | String | 无 | 设置DeleteRequest的table |
| primaryKey | GeneralParams | 无 | 设置DeleteRequest的primaryKey |
| addPrimaryKey | String, Object | 无 | 为DeleteRequest增加一个primaryKey |
| partitionKey | GeneralParams | 无 | 设置DeleteRequest的partitionKey |
| addPartitionKey | String, Object | 无 | 为DeleteRequest增加一个partitionKey |
| filter | GeneralParams | 无 | 设置DeleteRequest的filter |
| build | 无 | DeleteRequest | 返回一个构建好的DeleteRequest |
标量查询
功能介绍
基于主键值进行点查。
请求示例
1import java.util.Arrays;
2
3import com.baidu.mochow.auth.Credentials;
4import com.baidu.mochow.client.ClientConfiguration;
5import com.baidu.mochow.client.MochowClient;
6import com.baidu.mochow.model.QueryRequest;
7import com.baidu.mochow.model.QueryResponse;
8import com.baidu.mochow.model.enums.ReadConsistency;
9import com.baidu.mochow.util.JsonUtils;
10
11public class Main {
12 public static void main(String[] args) {
13 String account = "root";
14 String apiKey = "*********";
15 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
16 ClientConfiguration clientConfiguration = new ClientConfiguration();
17 clientConfiguration.setCredentials(new Credentials(account, apiKey));
18 clientConfiguration.setEndpoint(endpoint);
19 MochowClient mochowClient = new MochowClient(clientConfiguration);
20 String databaseName = "test";
21 String tableName = "test";
22
23 QueryRequest queryRequest = QueryRequest.builder()
24 .database(databaseName)
25 .table(tableName)
26 .retrieveVector(true)
27 .addPrimaryKey("id", "0005")
28 .readConsistency(ReadConsistency.STRONG)
29 .vectorIndexMembership("vector_idx")
30 .projections(Arrays.asList("id", "bookName")).build();
31 QueryResponse queryResponse = mochowClient.query(queryRequest);
32 System.out.printf("Query result: %s\n", JsonUtils.toJsonString(queryResponse.getRow()));
33 System.out.printf("Vector index membership: %s\n",
34 JsonUtils.toJsonString(queryResponse.getVectorIndexMembership()));
35 }
36}
相关类说明
QueryRequest
标量查询,基于主键值进行点查,拥有constructor、getter、setter等通用方法,通用方法详情可以参考通用说明。其builder方法和通用的builder有区别,在下面有具体说明。
1import com.baidu.mochow.model.QueryRequest; //导入包
| 成员名 | 类型 | 是否必选 | 成员说明 |
|---|---|---|---|
| database | String | 是 | 查询数据的库名 |
| table | String | 是 | 查询数据的表名 |
| primaryKey | GeneralParams | 是 | 指定记录的主键值。 |
| projections | List<String> | 否 | 投影字段列表,默认为空,为空时查询结果默认返回所有标量字段。 |
| partitionKey | GeneralParams | 否 | 指定记录的分区键值。 如果该表的分区键和主键是同一个键,则不需要填写分区键值。 |
| retrieveVector | Boolean | 否 | 是否返回结果记录中的向量字段值,默认为False |
| readConsistency | ReadConsistency | 否 | 查询请求的一致性级别,取值为: |
| vectorIndexMembership | VectorIndexMembership | 否 | 查询目标记录相对于指定向量索引的当前逻辑覆盖状态。builder提供两个重载:传入索引名称(String)或直接传入VectorIndexMembership对象。 该成员仅单条查询(query)支持。 |
VectorIndexMembership
1import com.baidu.mochow.model.entity.VectorIndexMembership; //导入包
| 成员名 | 类型 | 是否必选 | 成员说明 |
|---|---|---|---|
| indexName | String | 是 | 待检查的向量索引名称,必须为当前表中已存在的索引名。 |
| state | String | 否 | 请求中不需要填写,仅在响应中由服务端返回,取值如下: |
说明:
- 该状态表示当前行版本相对于本次请求实际访问副本上正在提供服务(serving)的索引的逻辑覆盖状态,不会执行ANN检索,也不检查向量在底层索引文件中是否真实存在。
- 由于默认的EVENTUAL一致性会随机选择副本,不同副本的索引进度可能不同;如需稳定结果,建议配合
readConsistency(ReadConsistency.STRONG)使用。 - 索引重建期间,如旧的全量索引仍在提供服务,返回值仍然基于旧的serving索引。
可以使用UpdateRequest.builder()获取UpdateRequest的builder类,builder类拥有如下方法
| 方法 | 参数类型 | 返回值类型 | 功能 |
|---|---|---|---|
| database | String | 无 | 设置QueryRequest的database |
| table | String | 无 | 设置QueryRequest的table |
| primaryKey | GeneralParams | 无 | 设置QueryRequest的primaryKey |
| addPrimaryKey | String, Object | 无 | 为QueryRequest增加一个primaryKey |
| partitionKey | GeneralParams | 无 | 设置QueryRequest的partitionKey |
| addPartitionKey | String, Object | 无 | 为QueryRequest增加一个partitionKey |
| projections | List<String> | 无 | 设置QueryRequest的projections |
| retrieveVector | Boolean | 无 | 设置QueryRequest的retrieveVector |
| readConsistency | ReadConsistency | 无 | 设置QueryRequest的readConsistency |
| vectorIndexMembership | String 或 VectorIndexMembership | 无 | 设置QueryRequest的vectorIndexMembership |
| build | 无 | DeleteRequest | 返回一个构建好的DeleteRequest |
QueryResponse
插入或更新回复,向量数据库向客户端返回插入或更新请求的执行结果,拥有getter通用方法,通用方法可以参考通用说明。
1import com.baidu.mochow.model.QueryResponse; //导入包
| 成员名 | 类型 | 成员说明 |
|---|---|---|
| row | Row | 查询到的行 |
| vectorIndexMembership | VectorIndexMembership | 目标记录相对于指定向量索引的逻辑覆盖状态,仅在请求中携带vectorIndexMembership时返回,服务端只返回其中的state |
标量过滤查询
功能介绍
基于标量属性过滤查询记录。
请求示例
1import java.util.Arrays;
2
3import com.baidu.mochow.auth.Credentials;
4import com.baidu.mochow.client.ClientConfiguration;
5import com.baidu.mochow.client.MochowClient;
6import com.baidu.mochow.model.SelectRequest;
7import com.baidu.mochow.model.SelectResponse;
8import com.baidu.mochow.model.enums.ReadConsistency;
9
10public class Main {
11 public static void main(String[] args) {
12 String account = "root";
13 String apiKey = "*********";
14 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
15 ClientConfiguration clientConfiguration = new ClientConfiguration();
16 clientConfiguration.setCredentials(new Credentials(account, apiKey));
17 clientConfiguration.setEndpoint(endpoint);
18 MochowClient mochowClient = new MochowClient(clientConfiguration);
19 String databaseName = "test";
20 String tableName = "test";
21
22 SelectRequest selectRequest = SelectRequest.builder()
23 .database(databaseName)
24 .table(tableName)
25 .limit(30)
26 .readConsistency(ReadConsistency.EVENTUAL)
27 .projections(Arrays.asList("id", "bookName")).build();
28 while (true) {
29 SelectResponse selectResponse = mochowClient.select(selectRequest);
30 System.out.printf("Select result count: %d\n", selectResponse.getRows().size());
31 if (!selectResponse.isTruncated()) {
32 break;
33 }
34 selectRequest.setMarker(selectResponse.getNextMarker());
35 }
36 }
37}
相关类说明
SelectRequest
基于标量属性过滤查询记录,拥有constructor、getter、setter等通用方法,通用方法详情可以参考通用说明。其builder方法和通用的builder有区别,在下面有具体说明。
1import com.baidu.mochow.model.SelectRequest; //导入包
| 成员名 | 类型 | 是否必选 | 用途 |
|---|---|---|---|
| database | String | 是 | 标量过滤数据的库名 |
| table | String | 是 | 标量过滤数据的表名 |
| filter | String | 否 | 标量过滤条件。 当要删除全部记录,可设置为"*";Filter表达式语法参照SQL的WHERE子句语法进行设计,其详细描述和使用示例请参见Filter条件表达式。必须填写主键值或过滤条件,二者有且仅能选其一。 |
| projections | List<String> | 否 | 投影字段列表,默认为空,为空时查询结果默认返回所有标量字段。 |
| marker | GeneralParams | 否 | 查询的分页起始点,用于控制分页查询返回结果的起始位置,方便用户对数据进行分页展示和浏览,用户不填时,默认从第一条符合条件的记录开始返回。 |
| limit | int | 否 | 查询返回的记录条数,在进行分页查询时,即每页的记录条数。 默认为10,取值范围[1, 1000]。 |
| readConsistency | ReadConsistency | 否 | 查询请求的一致性级别,取值为: |
可以使用SelectRequest.builder()获取SelectRequest的builder类,builder类拥有如下方法
| 方法 | 参数类型 | 返回值类型 | 功能 |
|---|---|---|---|
| database | String | 无 | 设置SelectRequest的database |
| table | String | 无 | 设置SelectRequest的table |
| primaryKey | GeneralParams | 无 | 设置SelectRequest的primaryKey |
| addPrimaryKey | String, Object | 无 | 为SelectRequest增加一个primaryKey |
| partitionKey | GeneralParams | 无 | 设置SelectRequest的partitionKey |
| addPartitionKey | String, Object | 无 | 为SelectRequest增加一个partitionKey |
| projections | List<String> | 无 | 设置SelectRequest的projections |
| retrieveVector | Boolean | 无 | 设置SelectRequest的retrieveVector |
| readConsistency | ReadConsistency | 无 | 设置SelectRequest的readConsistency |
| limit | int | 无 | 设置SelectRequest的limit |
| build | 无 | SelectRequest | 返回一个构建好的SelectRequest |
SelectResponse
插入或更新回复,向量数据库向客户端返回插入或更新请求的执行结果,拥有getter通用方法,通用方法可以参考通用说明。
1import com.baidu.mochow.model.SelectResponse; //导入包
| 成员名 | 类型 | 用途 |
|---|---|---|
| truncated | Boolean | 后续是否还有数据 |
| nextMarker | GeneralParams | 查询的分页起始点,用于控制分页查询返回结果的起始位置,方便用户对数据进行分页展示和浏览,用户不填时,默认从第一条符合条件的记录开始返回。 |
| rows | List<Row> | 插入的记录列表 |
向量检索
功能介绍
基于向量字段值的KNN或ANN查询,支持通过标量字段值进行过滤。
请求示例
1import java.util.Arrays;
2
3import com.baidu.mochow.auth.Credentials;
4import com.baidu.mochow.client.ClientConfiguration;
5import com.baidu.mochow.client.MochowClient;
6import com.baidu.mochow.model.SearchRequest;
7import com.baidu.mochow.model.SearchResponse;
8import com.baidu.mochow.model.entity.ANNSearchParams;
9import com.baidu.mochow.model.entity.HNSWSearchParams;
10import com.baidu.mochow.util.JsonUtils;
11
12public class Main {
13 public static void main(String[] args) {
14 String account = "root";
15 String apiKey = "*********";
16 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
17 ClientConfiguration clientConfiguration = new ClientConfiguration();
18 clientConfiguration.setCredentials(new Credentials(account, apiKey));
19 clientConfiguration.setEndpoint(endpoint);
20 MochowClient mochowClient = new MochowClient(clientConfiguration);
21 String databaseName = "test";
22 String tableName = "test";
23
24 SearchRequest searchRequest = SearchRequest.builder()
25 .database(databaseName)
26 .table(tableName)
27 .anns(
28 ANNSearchParams.builder()
29 .vectorField("vector")
30 .vectorFloats(Arrays.asList(1F, 0.21F, 0.213F, 0F))
31 .filter("bookName='三国演义'")
32 .params(HNSWSearchParams.builder().ef(200).limit(10).build()).build()
33 ).build();
34 SearchResponse searchResponse = mochowClient.search(searchRequest);
35 System.out.printf("Search response: %s\n", JsonUtils.toJsonString(searchResponse));
36 }
37}
请求参数
SearchRequest
基于向量字段值的KNN或ANN支持通过标量字段值进行过滤。拥有constructor、getter、setter等通用方法,通用方法详情可以参考通用说明。其builder方法和通用的builder有区别,在下面有具体说明。
1import com.baidu.mochow.model.SearchRequest; //导入包
| 成员名 | 类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| database | String | 是 | 插入数据的库名 |
| table | String | 是 | 插入数据的表名 |
| anns | ANNSearchParams | 无 | 检索请求参数详情。 |
| retrieveVector | Boolean | 否 | 是否返回结果记录中的向量字段值,默认为False |
| partitionKey | GeneralParams | 否 | 指定记录的分区键值。 如果该表的分区键和主键是同一个键,则不需要填写分区键值。 |
| projections | List<String> | 否 | 投影字段列表,默认为空,为空时查询结果默认返回所有标量字段。 |
| readConsistency | ReadConsistency | 否 | 查询请求的一致性级别,取值为: |
可以使用SearchRequest.builder()获取SearchRequest的builder类,builder类拥有如下方法
| 方法 | 参数类型 | 返回值类型 | 功能 |
|---|---|---|---|
| database | String | 无 | 设置SearchRequest的database |
| table | String | 无 | 设置SearchRequest的table |
| partitionKey | GeneralParams | 无 | 设置SearchRequest的partitionKey |
| addPartitionKey | String, Object | 无 | 为SearchRequest增加一个partitionKey |
| projections | List<String> | 无 | 设置SearchRequest的projections |
| retrieveVector | Boolean | 无 | 设置SearchRequest的retrieveVector |
| readConsistency | ReadConsistency | 无 | 设置SearchRequest的readConsistency |
| anns | ANNSearchParams | 无 | 设置SearchRequest的anns |
| build | 无 | SearchRequest | 返回一个构建好的SearchRequest |
ANNSearchParams
1import com.baidu.mochow.model.entity.ANNSearchParams; //导入包
| 成员名 | 类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| vectorField | String | 是 | 检索的指定向量字段名称 |
| vectorFloats | List<Float> | 是 | 检索的目标向量字段值。 |
| params | SearchParam | 是 | 检索算法的参数详情。 |
| filter | String | 否 | 检索的标量过滤条件,表示仅在符合过滤条件的候选集中进行检索,默认为空。Filter表达式语法参照SQL的WHERE子句语法进行设计,其详细描述和使用示例请参见Filter条件表达式。 |
SearchParams
HNSWSearchParams
1import com.baidu.mochow.model.entity.HNSWSearchParams; //导入包
| 成员名 | 类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| ef | int | 是 | HNSW算法检索过程的动态候选列表的大小。 |
| distanceNear | float | 是 | 范围检索场景中的最近距离,表示仅检索候选集中与目标向量的距离大于该值的向量。取值约束同上。 |
| distanceFar | distanceFar | 否 | 范围检索场景中的最远距离,表示仅检索候选集中与目标向量的距离小于该值的向量。取值约束如下: |
PUCKSearchParams
1import com.baidu.mochow.model.entity.PUCKSearchParams; //导入包
| 成员名 | 类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| ef | int | 是 | HNSW算法检索过程的动态候选列表的大小。 |
| distanceNear | float | 是 | 范围检索场景中的最近距离,表示仅检索候选集中与目标向量的距离大于该值的向量。取值约束同上。 |
| distanceFar | distanceFar | 否 | 范围检索场景中的最远距离,表示仅检索候选集中与目标向量的距离小于该值的向量。取值约束如下: |
SearchResponse
插入或更新回复,向量数据库向客户端返回插入或更新请求的执行结果,拥有getter通用方法,通用方法可以参考通用说明。
1import com.baidu.mochow.model.SearchResponse; //导入包
| 成员名 | 类型 | 用途 |
|---|---|---|
| searchVectorFloats | List |
查询的向量 |
| rows | List |
查询结果行 |
批量向量检索
功能介绍
基于向量字段值的KNN或ANN批量查询,支持通过标量字段值进行过滤。
请求示例
1import java.util.Arrays;
2
3import com.baidu.mochow.auth.Credentials;
4import com.baidu.mochow.client.ClientConfiguration;
5import com.baidu.mochow.client.MochowClient;
6import com.baidu.mochow.model.BatchSearchRequest;
7import com.baidu.mochow.model.BatchSearchResponse;
8import com.baidu.mochow.model.entity.BatchANNSearchParams;
9import com.baidu.mochow.model.entity.HNSWSearchParams;
10import com.baidu.mochow.util.JsonUtils;
11
12public class Main {
13 public static void main(String[] args) {
14 String account = "root";
15 String apiKey = "*********";
16 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
17 ClientConfiguration clientConfiguration = new ClientConfiguration();
18 clientConfiguration.setCredentials(new Credentials(account, apiKey));
19 clientConfiguration.setEndpoint(endpoint);
20 MochowClient mochowClient = new MochowClient(clientConfiguration);
21 String databaseName = "test";
22 String tableName = "test";
23
24 BatchSearchRequest searchRequest = BatchSearchRequest.builder()
25 .database(databaseName)
26 .table(tableName)
27 .anns(
28 BatchANNSearchParams.builder()
29 .vectorField("vector")
30 .vectorFloats(Arrays.asList(Arrays.asList(1F, 0.21F, 0.213F, 0F)))
31 .filter("bookName='三国演义'")
32 .params(HNSWSearchParams.builder().ef(200).limit(10).build()).build()
33 ).build();
34 BatchSearchResponse searchResponse = mochowClient.batchSearch(searchRequest);
35 System.out.printf("Search response: %s\n", JsonUtils.toJsonString(searchResponse));
36 }
37}
BatchSearchRequest
基于多个向量字段值的KNN或ANN检索操作,支持通过标量字段值进行过滤。仅适用于多节点标准版,不支持单节点免费测试版。拥有constructor、getter、setter等通用方法,通用方法详情可以参考通用说明。其builder方法和通用的builder有区别,在下面有具体说明。
1import com.baidu.mochow.model.BatchSearchRequest; //导入包
| 成员名 | 类型 | 是否必选 | 用途 |
|---|---|---|---|
| database | String | 是 | 检索数据的库名 |
| table | String | 是 | 检索数据的表名 |
| anns | BatchANNSearchParams | 无 | 检索请求参数详情。 |
| retrieveVector | Boolean | 否 | 是否返回结果记录中的向量字段值,默认为False |
| partitionKey | GeneralParams | 否 | 指定记录的分区键值。 如果该表的分区键和主键是同一个键,则不需要填写分区键值。 |
| projections | List<String> | 否 | 投影字段列表,默认为空,为空时查询结果默认返回所有标量字段。 |
| readConsistency | ReadConsistency | 否 | 查询请求的一致性级别,取值为: |
可以使用BatchSearchRequest.builder()获取BatchSearchRequest的builder类,builder类拥有如下方法
| 方法 | 参数类型 | 返回值类型 | 功能 |
|---|---|---|---|
| database | String | 无 | 设置BatchSearchRequest的database |
| table | String | 无 | 设置BatchSearchRequest的table |
| partitionKey | GeneralParams | 无 | 设置BatchSearchRequest的partitionKey |
| addPartitionKey | String, Object | 无 | 为BatchSearchRequest增加一个partitionKey |
| projections | List<String> | 无 | 设置BatchSearchRequest的projections |
| retrieveVector | Boolean | 无 | 设置BatchSearchRequest的retrieveVector |
| readConsistency | ReadConsistency | 无 | 设置BatchSearchRequest的readConsistency |
| anns | ANNSearchParams | 无 | 设置BatchSearchRequest的anns |
| build | 无 | BatchSearchRequest | 返回一个构建好的BatchSearchRequest |
BatchANNSearchParams
1import com.baidu.mochow.model.entity.ANNSearchParams; //导入包
| 成员名 | 类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| vectorField | String | 是 | 检索的指定向量字段名称 |
| vectorFloats | List<List<FloatVector>> | 是 | 检索的目标向量字段值。 |
| params | SearchParam | 是 | 检索算法的参数详情。 |
| filter | String | 否 | 检索的标量过滤条件,表示仅在符合过滤条件的候选集中进行检索,默认为空。Filter表达式语法参照SQL的WHERE子句语法进行设计,其详细描述和使用示例请参见Filter条件表达式。 |
BatchSearchParams
HNSWSearchParams
1import com.baidu.mochow.model.entity.HNSWSearchParams; //导入包
| 成员名 | 类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| ef | int | 是 | HNSW算法检索过程的动态候选列表的大小。 |
| distanceNear | float | 是 | 范围检索场景中的最近距离,表示仅检索候选集中与目标向量的距离大于该值的向量。取值约束同上。 |
| distanceFar | distanceFar | 否 | 范围检索场景中的最远距离,表示仅检索候选集中与目标向量的距离小于该值的向量。取值约束如下: |
PUCKSearchParams
1import com.baidu.mochow.model.entity.PUCKSearchParams; //导入包
| 成员名 | 类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| ef | int | 是 | HNSW算法检索过程的动态候选列表的大小。 |
| distanceNear | float | 是 | 范围检索场景中的最近距离,表示仅检索候选集中与目标向量的距离大于该值的向量。取值约束同上。 |
| distanceFar | distanceFar | 否 | 范围检索场景中的最远距离,表示仅检索候选集中与目标向量的距离小于该值的向量。取值约束如下: |
BatchSearchResponse
插入或更新回复,向量数据库向客户端返回插入或更新请求的执行结果,拥有getter通用方法,通用方法可以参考通用说明。
1import com.baidu.mochow.model.BatchSearchResponse; //导入包
| 成员名 | 类型 | 用途 |
|---|---|---|
| results | List<SearchResponse> | 查询的结果 |
SearchResponse
插入或更新回复,向量数据库向客户端返回插入或更新请求的执行结果,拥有getter通用方法,通用方法可以参考通用说明。
1import com.baidu.mochow.model.SearchResponse; //导入包
| 成员名 | 类型 | 用途 |
|---|---|---|
| searchVectorFloats | List |
查询的向量 |
| rows | List |
查询结果行 |
多向量检索
功能介绍
基于多个单向量检索请求的融合查询,支持将多个向量检索结果按照不同的融合策略进行合并,支持通过标量字段值进行过滤和分页查询。
请求示例
1import java.util.ArrayList;
2import java.util.Arrays;
3import java.util.List;
4
5import com.baidu.mochow.auth.Credentials;
6import com.baidu.mochow.client.ClientConfiguration;
7import com.baidu.mochow.client.MochowClient;
8import com.baidu.mochow.model.MultiVectorSearchRequest;
9import com.baidu.mochow.model.SearchRowResponse;
10import com.baidu.mochow.model.SingleVectorSearchRequestInterface;
11import com.baidu.mochow.model.VectorTopkSearchRequest;
12import com.baidu.mochow.model.entity.FloatVector;
13import com.baidu.mochow.model.entity.RRFRank;
14import com.baidu.mochow.model.entity.WeightedRank;
15import com.baidu.mochow.util.JsonUtils;
16
17public class Main {
18 public static void main(String[] args) {
19 String account = "root";
20 String apiKey = "*********";
21 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
22 ClientConfiguration clientConfiguration = new ClientConfiguration();
23 clientConfiguration.setCredentials(new Credentials(account, apiKey));
24 clientConfiguration.setEndpoint(endpoint);
25 MochowClient mochowClient = new MochowClient(clientConfiguration);
26 String databaseName = "test";
27 String tableName = "test";
28
29 // 创建多个单向量检索请求
30 List<SingleVectorSearchRequestInterface> requests = new ArrayList<>();
31 requests.add(VectorTopkSearchRequest.builder("vector",
32 new FloatVector(Arrays.asList(1F, 0.21F, 0.213F, 0F)), 10).build());
33 requests.add(VectorTopkSearchRequest.builder("vector",
34 new FloatVector(Arrays.asList(0.8F, 0.15F, 0.25F, 0.1F)), 10).build());
35
36 // 使用RRF融合策略构建多向量检索请求
37 MultiVectorSearchRequest searchRequest = MultiVectorSearchRequest.builder(requests)
38 .rankPolicy(new RRFRank(60))
39 .limit(10)
40 .filter("bookName='三国演义'")
41 .projections(Arrays.asList("id", "bookName"))
42 .build();
43
44 // 执行检索
45 SearchRowResponse searchResponse = mochowClient.vectorSearch(databaseName, tableName, searchRequest);
46 System.out.printf("Multi-vector search response: %s\n", JsonUtils.toJsonString(searchResponse));
47 }
48}
请求参数
MultiVectorSearchRequest
基于多个单向量检索请求的融合查询,支持多种融合策略和标量过滤。拥有builder模式进行构建。
1import com.baidu.mochow.model.MultiVectorSearchRequest; //导入包
| Builder方法 | 参数类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| builder | List<SingleVectorSearchRequestInterface> | 是 | 构建多向量检索请求的静态方法,传入单向量检索请求列表 |
| rankPolicy | FusionRankPolicy | 否 | 融合策略,支持RRF和加权求和两种策略 |
| limit | int | 否 | 返回结果数量限制,默认为10 |
| filter | String | 否 | 标量过滤条件,Filter表达式语法参照SQL的WHERE子句语法 |
| projections | List<String> | 否 | 投影字段列表,默认为空时返回所有标量字段 |
| partitionKey | GeneralParams | 否 | 指定记录的分区键值 |
| readConsistency | ReadConsistency | 否 | 查询请求的一致性级别,默认为EVENTUAL |
| advancedOptions | AdvancedOptions | 否 | 高级搜索选项 |
| iteratedIds | String | 否 | 分页查询的迭代ID,用于支持分页查询 |
FusionRankPolicy 融合策略接口
向量融合策略的基接口,具体实现类包括:
RRFRank (Reciprocal Rank Fusion)
倒数排名融合策略,基于多个检索结果的排名进行融合。
1import com.baidu.mochow.model.entity.RRFRank; //导入包
| 构造方法 | 参数类型 | 参数含义 |
|---|---|---|
| RRFRank | int | 融合参数k值,用于控制排名融合的权重,通常设置为60 |
WeightedRank
加权求和融合策略,基于多个检索结果的相似度分数按权重求和。
1import com.baidu.mochow.model.entity.WeightedRank; //导入包
| 构造方法 | 参数类型 | 参数含义 |
|---|---|---|
| WeightedRank | List<Float> | 权重列表,每个权重对应一个单向量检索请求,权重值范围通常为[0.0, 1.0] |
VectorTopkSearchRequest
单向量检索请求,用于构建多向量检索的输入。
1import com.baidu.mochow.model.VectorTopkSearchRequest; //导入包
| Builder方法 | 参数类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| builder | String, FloatVector, int | 是 | 构建单向量检索请求的静态方法,参数分别为向量字段名、向量值、返回数量 |
| config | VectorSearchConfig | 否 | 检索算法的运行参数 |
| filter | String | 否 | 该单向量检索的过滤条件 |
| projections | List<String> | 否 | 投影字段列表 |
| partitionKey | GeneralParams | 否 | 指定记录的分区键值 |
| readConsistency | ReadConsistency | 否 | 查询请求的一致性级别,默认为EVENTUAL |
| advancedOptions | AdvancedOptions | 否 | 高级搜索选项 |
| iteratedIds | String | 否 | 分页查询的迭代ID |
| decay | List<DecayFunction> | 否 | 衰变排名器配置,返回的score为衰变后的最终得分,参数结构参见下文DecayFunction |
SearchResultRow
检索结果中的单行记录。
1import com.baidu.mochow.model.entity.SearchResultRow; //导入包
| 成员名 | 类型 | 用途 |
|---|---|---|
| row | Row | 一行记录 |
| distance | float | 向量距离 |
| score | float | 记录得分。如请求携带decay,该值为衰变后的最终得分 |
| highlight | Map<String, List<String>> | 全文检索高亮片段,仅在BM25检索请求携带highlight时返回 |
SearchRowResponse
多向量检索回复,向量数据库向客户端返回检索请求的执行结果,拥有getter通用方法。
1import com.baidu.mochow.model.SearchRowResponse; //导入包
| 成员名 | 类型 | 用途 |
|---|---|---|
| rows | List<SearchResultRow> | 融合后的查询结果行列表 |
| truncated | Boolean | 后续是否还有数据 |
| iteratedIds | String | 分页查询的迭代ID,用于获取下一页结果 |
全文检索
功能介绍
基于关键字的全文检索(BM25),支持通过标量字段值进行过滤,支持请求级同义词、高亮和衰变排名器。
发起检索前,目标倒排索引的state必须为NORMAL;索引仍处于BUILDING状态时,检索会返回错误码95(Index Building)。
请求示例
1import java.util.Arrays;
2import java.util.HashMap;
3import java.util.Map;
4
5import com.baidu.mochow.auth.Credentials;
6import com.baidu.mochow.client.ClientConfiguration;
7import com.baidu.mochow.client.MochowClient;
8import com.baidu.mochow.model.BM25SearchRequest;
9import com.baidu.mochow.model.SearchRowResponse;
10import com.baidu.mochow.model.entity.DecayFunction;
11import com.baidu.mochow.model.entity.HighlightParamField;
12import com.baidu.mochow.model.entity.HighlightParams;
13import com.baidu.mochow.util.JsonUtils;
14
15public class Main {
16 public static void main(String[] args) {
17 String account = "root";
18 String apiKey = "*********";
19 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
20 ClientConfiguration clientConfiguration = new ClientConfiguration();
21 clientConfiguration.setCredentials(new Credentials(account, apiKey));
22 clientConfiguration.setEndpoint(endpoint);
23 MochowClient mochowClient = new MochowClient(clientConfiguration);
24 String databaseName = "test";
25 String tableName = "test";
26
27 // 高亮配置:全局默认值 + 字段级配置
28 HighlightParams highlight = new HighlightParams();
29 highlight.setPreTags(Arrays.asList("<em>"));
30 highlight.setPostTags(Arrays.asList("</em>"));
31 highlight.setFragmentSize(100);
32 highlight.setNumberOfFragments(3);
33 Map<String, HighlightParamField> highlightFields = new HashMap<>();
34 highlightFields.put("segment", new HighlightParamField(80, 2));
35 highlight.setFields(highlightFields);
36
37 // 衰变排名器:按 publishTime 做线性衰变
38 DecayFunction publishTimeDecay = new DecayFunction();
39 publishTimeDecay.setName("publish_time_decay");
40 publishTimeDecay.setType("LINEAR");
41 publishTimeDecay.setFieldName("publishTime");
42 publishTimeDecay.setOrigin(1735660800L);
43 publishTimeDecay.setScale(31536000L);
44 publishTimeDecay.setWeight(0.3);
45
46 BM25SearchRequest searchRequest = BM25SearchRequest.builder("segment_inverted_idx", "segment:吕布")
47 .limit(10)
48 .filter("bookName='三国演义'")
49 .projections(Arrays.asList("id", "segment"))
50 .synonyms(Arrays.asList(Arrays.asList("吕布", "奉先")))
51 .highlight(highlight)
52 .decay(Arrays.asList(publishTimeDecay))
53 .build();
54
55 SearchRowResponse searchResponse = mochowClient.bm25Search(databaseName, tableName, searchRequest);
56 System.out.printf("BM25 search response: %s\n", JsonUtils.toJsonString(searchResponse.getRows()));
57 }
58}
请求参数
BM25SearchRequest
全文检索请求,通过builder模式构建。
1import com.baidu.mochow.model.BM25SearchRequest; //导入包
| Builder方法 | 参数类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| builder | String, String | 是 | 构建全文检索请求的静态方法,参数分别为倒排索引名称indexName和检索表达式searchText(UTF-8编码) |
| limit | int | 否 | 指定返回相关性最高的条目数 |
| filter | String | 否 | 检索的标量过滤条件,表示仅在符合过滤条件的候选集中进行检索,默认为空。Filter表达式语法参照SQL的WHERE子句语法进行设计,其详细描述和使用示例请参见Filter条件表达式。 |
| projections | List<String> | 否 | 投影字段列表,默认为空,为空时检索结果返回所有标量字段 |
| partitionKey | GeneralParams | 否 | 指定记录的分区键值。如果没有指定分区键值,该检索请求可能会退化为在该表所有分片上都执行的MPP检索 |
| readConsistency | ReadConsistency | 否 | 检索请求的一致性级别,取值为: |
| synonyms | List<List<String>> | 否 | 请求级同义词规则,每个内部列表表示一组等价同义词,例如Arrays.asList(Arrays.asList("土豆", "马铃薯")),检索“土豆”时可以匹配到“马铃薯”。使用说明: |
| highlight | HighlightParams | 否 | 全文检索高亮配置。传入new HighlightParams()时使用默认配置;不传时不返回高亮信息。注:过宽的通配、前缀或范围查询(如PrefixQuery命中term数超过1024)可能导致请求失败,此时请调窄查询条件或关闭高亮。 |
| decay | List<DecayFunction> | 否 | 衰变排名器配置。配置后服务端会基于指定的数值或时间类型字段对原始相关性得分做衰变重排,返回的score为衰变后的最终得分。 注:decay与advancedOptions中的两阶段检索不兼容。 |
| iteratedIds | String | 否 | 分页查询的迭代ID,通常由SearchIterator自动维护 |
检索表达式searchText的常见用法
| 检索类型 | 用法 | 例子 | 例子含义 | 备注 |
|---|---|---|---|---|
| 关键词检索 | field_name:keywordfield_name:(keyword_1, keyword_2) |
title:数据库title:(数据库 百度) |
在title这列搜索“数据库”关键字 在title这列搜索“数据库”、“百度”关键字,满足任意一个即可 |
|
| 关键词检索 | keywordkeyword_1 AND keyword_2 |
数据库数据库 AND 百度 |
在content这列上搜索“数据库”关键字 在content这列上搜索,要求同时包括“数据库”、“百度”关键字 |
只适用于在单列上建立倒排索引的情况。对于多列倒排索引,必须使用field_name:keyword的方式指定检索词。 |
| 复合检索 | query_1 AND query_2query_1 OR query_2 |
title:数据库 AND title:百度title:数据库 OR title:百度 |
在title这列搜索,要求同时包括这2个关键字 在title这列搜索,要求包括任意一个 |
|
| Phrase检索 | field_name:"phrase" |
title:"百度VectorDB数据库" |
在title这列搜索“百度VectorDB数据库”短语 | 短语必须使用双引号 |
| Match检索 | field_name:statement |
content:百度VectorDB的优缺点 |
在content这列搜索语句中的任意词,匹配词数量越多,相关性得分越高 | |
| Prefix检索 | field_name:keyword* |
title:数据* |
在title这列检索,包含以“数据”为前缀词的文档 | |
| 更改查询权重 | field_name:keyword^boost |
title:数据库^2 OR content:百度 |
title列匹配的文档权重系数为2,content列匹配的权重系数为1 | 不设置boost的话,默认权重都是1 |
全文检索表达式会将一些特殊字符用于专用目的,如想在表达式中匹配这些特殊字符,需要用\符号进行转义。当前被征用的特殊字符包括:
+ - && || ! ( ) { } [ ] ^ " ~ * ? : `
HighlightParams
全文检索高亮配置,拥有无参constructor以及getter、setter等通用方法。
1import com.baidu.mochow.model.entity.HighlightParams; //导入包
| 成员名 | 类型 | 是否必填 | 成员含义 |
|---|---|---|---|
| fields | Map<String, HighlightParamField> | 否 | 需要高亮的字段,key为字段名,value为字段级配置。字段必须属于indexName指定的倒排索引;不传时默认对该倒排索引覆盖的所有可高亮字段生成片段。 |
| preTags | List<String> | 否 | 命中词前置标记,默认为["<em>"]。支持配置多个tag,多个命中会按顺序轮转使用。 |
| postTags | List<String> | 否 | 命中词后置标记,默认为["</em>"]。同时显式配置preTags和postTags时,二者数量必须一致。 |
| fragmentSize | Integer | 否 | 高亮片段的目标长度,默认100,取值范围为[1, 2147483647]。字段级未设置时使用该值。 |
| numberOfFragments | Integer | 否 | 每个字段最多返回的片段数,默认3,取值范围为[0, 10000]。设置为0时不切片,返回完整字段的高亮结果。字段级未设置时使用该值。 |
HighlightParamField
字段级高亮配置。
1import com.baidu.mochow.model.entity.HighlightParamField; //导入包
1public HighlightParamField(Integer fragmentSize, Integer numberOfFragments)
| 成员名 | 类型 | 是否必填 | 成员含义 |
|---|---|---|---|
| fragmentSize | Integer | 否 | 当前字段每个高亮片段的目标长度,默认100,取值范围为[1, 2147483647]。该值为目标长度而非严格上限,为保留完整词语,实际片段长度可能存在差异,preTags和postTags也会增加返回字符串的长度。 |
| numberOfFragments | Integer | 否 | 当前字段最多返回的片段数,默认3,取值范围为[0, 10000]。设置为0时不切片,返回完整字段的高亮结果,此时fragmentSize不生效。 |
DecayFunction
衰变排名器配置,拥有无参、全参constructor以及getter、setter等通用方法。
1import com.baidu.mochow.model.entity.DecayFunction; //导入包
| 成员名 | 类型 | 是否必填 | 成员含义 |
|---|---|---|---|
| type | String | 是 | 衰变函数类型,取值为: |
| fieldName | String | 是 | 参与衰变计算的字段名,需为表中已存在的数值或时间类型标量字段(BOOL、整数、FLOAT、DOUBLE、DATE、DATETIME、TIMESTAMP)。 注:序列化后的JSON字段名为fieldName。 |
| origin | Number | 是 | 衰变的原点,字段值距离原点越远,衰变得分越低。 |
| scale | Number | 是 | 衰变的尺度,用于控制衰变速度,必须大于1e-6。 |
| name | String | 否 | 衰变函数名称,便于区分多个衰变函数,不参与得分计算。 |
| decayRate | Number | 否 | 指数衰变率,仅EXPONENTIAL类型生效且必填,取值必须大于0。值越大衰变越快,1.0为常用基准。 |
| offset | Number | 否 | 距离容忍区间,字段值与origin的距离在offset之内时不衰变,默认为0。 |
| weight | Number | 否 | 该衰变函数在最终得分中的权重,默认为1.0,多个衰变函数按权重加权平均。 |
注:decay为一个列表,每个元素表示一个独立的衰变函数,多个函数可以使用相同或不同的字段,不按列表顺序依次执行。origin、scale、offset必须与字段值使用相同单位。
返回参数
请求中携带highlight时,每条命中结果会额外返回highlight成员。
| 成员名 | 类型 | 成员含义 |
|---|---|---|
| rows | List<SearchResultRow> | 检索结果行列表 |
| iteratedIds | String | 分页查询的迭代ID |
SearchResultRow成员
| 成员名 | 类型 | 成员含义 |
|---|---|---|
| row | Row | 一行记录 |
| score | float | 全文检索相关性得分。如请求携带decay,该值为衰变后的最终得分 |
| highlight | Map<String, List<String>> | 仅在请求携带highlight时返回,key为字段名,value为高亮片段数组,例如{"segment": ["<em>吕布</em>字奉先"]}。已请求高亮但当前行没有可返回片段时返回空对象 |
注:preTags和postTags会原样插入返回片段,服务端不做HTML转义;如需直接渲染为HTML,请自行处理转义与可信渲染策略。
混合检索
功能介绍
同时进行关键字全文检索和向量检索,检索结果融合排序后返回,也支持通过标量属性进行过滤。
请求示例
1import java.util.Arrays;
2
3import com.baidu.mochow.auth.Credentials;
4import com.baidu.mochow.client.ClientConfiguration;
5import com.baidu.mochow.client.MochowClient;
6import com.baidu.mochow.model.BM25SearchRequest;
7import com.baidu.mochow.model.HybridSearchRequest;
8import com.baidu.mochow.model.SearchRowResponse;
9import com.baidu.mochow.model.VectorTopkSearchRequest;
10import com.baidu.mochow.model.entity.FloatVector;
11import com.baidu.mochow.model.entity.VectorSearchConfig;
12import com.baidu.mochow.util.JsonUtils;
13
14public class Main {
15 public static void main(String[] args) {
16 String account = "root";
17 String apiKey = "*********";
18 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
19 ClientConfiguration clientConfiguration = new ClientConfiguration();
20 clientConfiguration.setCredentials(new Credentials(account, apiKey));
21 clientConfiguration.setEndpoint(endpoint);
22 MochowClient mochowClient = new MochowClient(clientConfiguration);
23 String databaseName = "test";
24 String tableName = "test";
25
26 VectorTopkSearchRequest vectorRequest = VectorTopkSearchRequest.builder(
27 "vector", new FloatVector(Arrays.asList(1F, 0.21F, 0.213F, 0F)), 10)
28 .config(VectorSearchConfig.builder().ef(200).build())
29 .build();
30
31 // BM25 的同义词与高亮在 bm25Request 中配置
32 BM25SearchRequest bm25Request = BM25SearchRequest.builder("segment_inverted_idx", "segment:吕布")
33 .synonyms(Arrays.asList(Arrays.asList("吕布", "奉先")))
34 .build();
35
36 HybridSearchRequest hybridSearchRequest = HybridSearchRequest.builder(
37 vectorRequest, bm25Request, 0.5F, 0.5F)
38 .limit(10)
39 .filter("bookName='三国演义'")
40 .projections(Arrays.asList("id", "segment"))
41 .build();
42
43 SearchRowResponse searchResponse = mochowClient.hybridSearch(databaseName, tableName, hybridSearchRequest);
44 System.out.printf("Hybrid search response: %s\n", JsonUtils.toJsonString(searchResponse.getRows()));
45 }
46}
请求参数
HybridSearchRequest
混合检索请求,通过builder模式构建。
1import com.baidu.mochow.model.HybridSearchRequest; //导入包
| Builder方法 | 参数类型 | 是否必选 | 参数含义 |
|---|---|---|---|
| builder | VectorSearchRequestInterface, BM25SearchRequestInterface, float, float | 是 | 构建混合检索请求的静态方法,参数分别为向量检索请求、全文检索请求、向量检索权重vectorWeight、全文检索权重bm25Weight |
| limit | int | 否 | 返回的最相关条目数 |
| filter | String | 否 | 检索的标量过滤条件,Filter表达式语法参照SQL的WHERE子句语法进行设计,其详细描述和使用示例请参见Filter条件表达式。 |
| projections | List<String> | 否 | 投影字段列表,默认为空,为空时检索结果返回所有标量字段 |
| partitionKey | GeneralParams | 否 | 指定记录的分区键值 |
| readConsistency | ReadConsistency | 否 | 检索请求的一致性级别,默认为EVENTUAL |
| decay | List<DecayFunction> | 否 | 衰变排名器配置,作用于融合排序后的结果,返回的score为衰变后的最终得分。参数结构参见全文检索接口中的DecayFunction |
| iteratedIds | String | 否 | 分页查询的迭代ID,通常由SearchIterator自动维护 |
注:混合检索中的BM25同义词(synonyms)和高亮(highlight)在bm25Request中配置;limit和filter为全局参数,会覆盖vectorRequest、bm25Request中的同名设置。
返回参数
与全文检索一致,返回SearchRowResponse,其中每条SearchResultRow的score为融合排序(以及可选的衰变重排)后的得分;如bm25Request中配置了highlight,还会返回highlight。
SearchIterator
功能介绍
SearchIterator提供了一种分页获取检索结果的机制。在SearchIterator请求中,limit参数用于指定当前分页的返回结果数量。通过多次调用迭代器,可以突破单次检索的topK数量限制,逐步获取完整的结果集。对于topK值较大的检索请求,推荐使用SearchIterator来实现结果的分批次获取。
请求示例
1import java.util.Arrays;
2import java.util.List;
3
4import com.baidu.mochow.auth.Credentials;
5import com.baidu.mochow.client.ClientConfiguration;
6import com.baidu.mochow.client.MochowClient;
7import com.baidu.mochow.model.SearchIterator;
8import com.baidu.mochow.model.SearchIteratorArgs;
9import com.baidu.mochow.model.VectorTopkSearchRequest;
10import com.baidu.mochow.model.entity.FloatVector;
11import com.baidu.mochow.model.entity.SearchResultRow;
12import com.baidu.mochow.model.entity.VectorSearchConfig;
13import com.baidu.mochow.util.JsonUtils;
14
15public class Main {
16 public static void main(String[] args) {
17 String account = "root";
18 String apiKey = "*********";
19 String endpoint = "*.*.*.*:*"; // example: 127.0.0.1:5287
20 ClientConfiguration clientConfiguration = new ClientConfiguration();
21 clientConfiguration.setCredentials(new Credentials(account, apiKey));
22 clientConfiguration.setEndpoint(endpoint);
23 MochowClient mochowClient = new MochowClient(clientConfiguration);
24 String databaseName = "test";
25 String tableName = "test";
26
27 VectorTopkSearchRequest request = VectorTopkSearchRequest.builder(
28 "vector", new FloatVector(Arrays.asList(1F, 0.21F, 0.213F, 0F)), 1000)
29 .config(VectorSearchConfig.builder().ef(2000).build())
30 .build();
31
32 SearchIteratorArgs iteratorArgs = new SearchIteratorArgs();
33 iteratorArgs.database = databaseName;
34 iteratorArgs.table = tableName;
35 iteratorArgs.request = request;
36 iteratorArgs.batchSize = 1000;
37 iteratorArgs.totalSize = 10000;
38
39 SearchIterator iterator = mochowClient.searchIterator(iteratorArgs); // 初始化 SearchIterator
40 while (true) {
41 List<SearchResultRow> rows = iterator.next(); // 获取下一批检索结果
42 if (rows == null || rows.isEmpty()) {
43 break;
44 }
45 System.out.printf("Iterator rows: %s\n", JsonUtils.toJsonString(rows));
46 }
47 iterator.close(); // 释放 iterator
48 }
49}
全文检索与混合检索同样支持SearchIterator,只需将iteratorArgs.request替换为BM25SearchRequest或HybridSearchRequest:
1import java.util.Arrays;
2import java.util.List;
3
4import com.baidu.mochow.client.MochowClient;
5import com.baidu.mochow.model.BM25SearchRequest;
6import com.baidu.mochow.model.SearchIterator;
7import com.baidu.mochow.model.SearchIteratorArgs;
8import com.baidu.mochow.model.entity.SearchResultRow;
9
10// 省略 client 初始化,参见上文
11BM25SearchRequest bm25Request = BM25SearchRequest.builder("segment_inverted_idx", "segment:吕布")
12 .limit(10)
13 .projections(Arrays.asList("id", "segment"))
14 .build();
15
16SearchIteratorArgs bm25Args = new SearchIteratorArgs();
17bm25Args.database = "test";
18bm25Args.table = "test";
19bm25Args.request = bm25Request;
20bm25Args.batchSize = 10;
21bm25Args.totalSize = 100;
22
23SearchIterator bm25Iterator = mochowClient.searchIterator(bm25Args);
24while (true) {
25 List<SearchResultRow> rows = bm25Iterator.next();
26 if (rows == null || rows.isEmpty()) {
27 break;
28 }
29}
30bm25Iterator.close();
接口描述
MochowClient.searchIterator
- 功能:初始化
SearchIterator对象。 - 参数:
SearchIteratorArgs。 - 返回类型:
SearchIterator。
SearchIteratorArgs
1import com.baidu.mochow.model.SearchIteratorArgs; //导入包
SearchIteratorArgs为公开成员的普通类,直接赋值即可。
| 成员名 | 类型 | 是否必填 | 成员含义 |
|---|---|---|---|
| database | String | 是 | 检索的库名 |
| table | String | 是 | 检索的表名 |
| request | IterableSearchRequestInterface | 是 | 检索请求,支持VectorTopkSearchRequest、MultiVectorSearchRequest、BM25SearchRequest、HybridSearchRequest |
| batchSize | int | 是 | 每批次检索获取的记录条数,必须与request中的limit相等 |
| totalSize | int | 是 | 获取记录的总条数,不能小于batchSize |
SearchIterator.next
- 功能:执行检索,并返回检索结果。当返回结果为空,说明SearchIterator执行结束。
- 参数:无。
- 返回类型:
List<SearchResultRow>。
SearchIterator.close
- 功能:释放SearchIterator。执行
close后,不应该再调用next。 - 参数:无。
- 返回类型:无。
限制
- 索引类型方面,仅支持HNSW、HNSWPQ、IVF、IVFSQ、IVFPQ(服务端还支持IVFRABITQ,Java SDK当前的IndexType枚举尚未包含该类型)。
- 检索类型方面,仅支持向量TopK检索(VectorTopkSearchRequest)、多向量检索(MultiVectorSearchRequest)、全文检索(BM25SearchRequest)、混合检索(HybridSearchRequest),不支持向量范围检索(VectorRangeSearchRequest)和批量向量检索(VectorBatchSearchRequest)。
- 对于多向量检索,仅支持
ws(WeightedRank)融合排序算法。
评价此篇文章
