赞
踩
通过学习"开源模型应用落地"系列文章,我们成功地建立了一个完整可实施的AI交付流程。现在,我们要引入向量数据库,作为我们AI服务的二级缓存。本文将继续基于上一篇“开源模型应用落地-工具使用篇-向量数据库(三)”详细介绍如何通过Java来使用Milvus Lite来为我们的AI服务部署一个前置缓存。
向量数据库是一种专门用于存储和处理高维向量数据的数据库系统。与传统的关系型数据库或文档数据库不同,向量数据库的设计目标是高效地支持向量数据的索引和相似性搜索。
在传统数据库中,数据通常是以结构化的表格形式存储,每个记录都有预定义的字段。但是,对于包含大量高维向量的数据,如图像、音频、文本等,传统的数据库模型往往无法有效地处理。向量数据库通过引入特定的数据结构和索引算法,允许高效地存储和查询向量数据。
向量数据库的核心概念是向量索引。它使用一种称为向量空间模型的方法,将向量映射到多维空间中的点,并利用这种映射关系构建索引结构。这样,当需要搜索相似向量时,可以通过计算向量之间的距离或相似度来快速定位相似的向量。
是一个开源的向量数据库引擎,专门用于存储和处理大规模高维向量数据。它提供了高效的向量索引和相似性搜索功能,使用户能够快速地进行向量数据的存储、查询和分析。
Milvus的设计目标是为了满足现代应用中对大规模向量数据的需求,例如人脸识别、图像搜索、推荐系统等。它采用了向量空间模型和多种索引算法,包括倒排索引、近似最近邻(Approximate Nearest Neighbor,ANN)等,以支持高效的相似性搜索。
Milvus提供了易于使用的编程接口和丰富的功能,使用户可以方便地插入、查询和分析向量数据。它支持多种数据类型的向量,包括浮点型、整型等,也支持多种距离度量方法,如欧氏距离、余弦相似度等。
Milvus还提供了分布式部署和横向扩展的能力,可以在多台机器上构建高可用性和高性能的向量数据库集群。它支持数据的分片和负载均衡,可以处理大规模数据集和高并发查询。
是Milvus向量数据库的一个轻量级版本。旨在提供在资源受限的环境中快速、高效地进行向量存储和相似性搜索的能力。
与完整版的Milvus相比,它具有以下特点:
是Milvus 的高效开源管理工具。 它具有直观的图形用户界面(GUI),使您可以轻松地与数据库进行交互。
这里的Milvus Lite部署在内网,位于业务服务和AI服务的中间,作为AI服务的二级缓存(一级缓存为Redis),为AI服务减缓负载压力。
1. 创建虚拟环境
conda create --name milvus python=3.10
2. 激活虚拟环境
conda activate milvus
3. 安装milvus包
pip install milvus
此处将Milvus Lite作为 Python 模块启动
- from milvus import default_server
-
- def start_server():
- default_server.start()
-
- def stop_server():
- default_server.stop()
-
- if __name__ == '__main__':
- with default_server:
- start_server()
-
- input("按下任意键继续...")
-
python -u 上述代码的文件名
启动完成后,会监听19530端口
下载地址:Releases · zilliztech/attu · GitHub
注意根据实际情况调整IP和端口,默认端口为19530
登录进去,就能看到如下信息:
业务数据需要提前初始化到向量数据库中
- <dependency>
- <groupId>io.milvus</groupId>
- <artifactId>milvus-sdk-java</artifactId>
- <version>2.2.2</version>
- </dependency>
PS: 我的JDK是1.8版本,若milvus版本太高,会出现兼容性问题,需要注意
maven仓库地址:Maven Repository: io.milvus » milvus-sdk-java
- public static MilvusServiceClient connect_db(String uri) {
- MilvusServiceClient milvusClient = new MilvusServiceClient(
- ConnectParam.newBuilder()
- .withUri(uri)
- // .withToken("root:Milvus")
- .build()
- );
- return milvusClient;
- }
- public static Map<String, String> create_collection(MilvusServiceClient milvusClient, String collection_name, String description, int shardsNum, List<FieldType> fieldTypes) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (CollUtil.isEmpty(fieldTypes)) {
- log.warn("集合字段为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- CreateCollectionParam.Builder builder = CreateCollectionParam.newBuilder().withCollectionName(collection_name)
- .withShardsNum(shardsNum);
-
- for (FieldType fieldType : fieldTypes) {
- builder.addFieldType(fieldType);
- }
-
- if (StringUtils.isNotEmpty(description) && StringUtils.isNotBlank(description)) {
- builder.withDescription(description);
- }
-
- CreateCollectionParam createCollectionReq = builder.build();
-
- R<RpcStatus> rstatus = milvusClient.createCollection(createCollectionReq);
-
- return buildResult(rstatus);
- }
创建成功后:
- public static Map<String, String> insert_data(MilvusServiceClient milvusClient, String collection_name,List<InsertParam.Field> fields){
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
- if (CollUtil.isEmpty(fields)) {
- log.warn("插入数据为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- InsertParam insertParam = InsertParam.newBuilder()
- .withCollectionName(collection_name)
- .withFields(fields)
- .build();
-
- R<MutationResult> mutationResultR = milvusClient.insert(insertParam);
-
- String status = String.valueOf(mutationResultR.getStatus());
- MapBuilder<String, String> mapBuilder = MapUtil.builder("status", status);
- MutationResult mutationResult = mutationResultR.getData();
- if(null != mutationResult){
- long insert_cnt = mutationResult.getInsertCnt();
- if(insert_cnt > 0){
- mapBuilder.put("msg","插入成功");
- }
- }
-
- milvusClient.flush(FlushParam.newBuilder()
- .addCollectionName(collection_name)
- // .withSyncFlush(true)
- .build());
-
- log.info("MutationResult: {}",mutationResultR);
- return mapBuilder.build();
- }
插入成功后(需要调用flush才能立刻看到数据):
- public static Map<String, String> create_index(MilvusServiceClient milvusClient, String collection_name, String index_column, String index_name, String params) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (StringUtils.isEmpty(index_column) || StringUtils.isBlank(index_column)) {
- log.warn("索引字段为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (StringUtils.isEmpty(index_name) || StringUtils.isBlank(index_name)) {
- log.warn("索引名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- CreateIndexParam.Builder builder = CreateIndexParam.newBuilder()
- .withIndexName(index_name)
- .withCollectionName(collection_name)
- .withFieldName(index_column)
- .withIndexType(IndexType.IVF_FLAT)
- .withMetricType(MetricType.IP)
- .withSyncMode(Boolean.FALSE);
-
- if (StringUtils.isNotEmpty(index_name) && StringUtils.isNotBlank(index_name)) {
- builder = builder.withExtraParam(params);
- }
-
- R<RpcStatus> rstatus = milvusClient.createIndex(
- builder.build()
- );
-
- return buildResult(rstatus);
- }
metric_type说明:
IP(内积)是一种表示向量之间相似程度的度量方式,它的计算方式是将两个向量中对应位置的元素相乘后求和。IP 的值越大,表示两个向量越相似;IP 的值越小,表示两个向量越不相似。IP 适用于只需要考虑向量之间的相似度,而不需要考虑各个维度之间的权重关系的场景,例如自然语言处理、计算机视觉等领域。
L2(欧氏距离)是一种表示向量之间直线距离的度量方式,它的计算方式是将两个向量中对应位置的元素相减后平方,再将平方和求和并开平方;L2 的值越小,表示两个向量越相似;L2 的值越大,表示两个向量越不相似。L2 适用于需要考虑各个维度之间的权重关系,或者需要将向量转化为单位向量进行相似度计算的场景,例如数值计算、信号处理、图像处理、机器学习等领域。
创建成功后:
- public static Map<String, String> load_in_memory(MilvusServiceClient milvusClient, String collection_name) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- R<RpcStatus> rstatus = milvusClient.loadCollection(
- LoadCollectionParam.newBuilder()
- .withCollectionName(collection_name)
- .build()
- );
-
- return buildResult(rstatus);
- }
- public static Map<String, String> search_data_vector(MilvusServiceClient milvusClient, String collection_name, String fieldName, List<List<Float>> search_vectors, String params, int topK, List<String> search_output_fields) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (StringUtils.isEmpty(fieldName) || StringUtils.isBlank(fieldName)) {
- log.warn("检索字段为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (CollUtil.isEmpty(search_vectors) || CollUtil.isEmpty(search_vectors.get(0))) {
- log.warn("检索向量为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (CollUtil.isEmpty(search_output_fields)) {
- log.warn("输出字段为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (topK <= 1) {
- log.warn("topK少于1.");
- topK = 1;
- }
-
-
- SearchParam.Builder builder = SearchParam.newBuilder().withCollectionName(collection_name)
- .withConsistencyLevel(ConsistencyLevelEnum.STRONG)
- .withMetricType(MetricType.IP)
- .withOutFields(search_output_fields)
- .withTopK(topK)
- .withVectors(search_vectors)
- .withVectorFieldName(fieldName);
-
- if (StringUtils.isNotEmpty(params) && StringUtils.isNotBlank(params)) {
- builder.withParams(params);
- }
-
- SearchParam searchParam = builder.build();
- R<SearchResults> respSearch = milvusClient.search(searchParam);
-
- String status = String.valueOf(respSearch.getStatus());
- MapBuilder<String, String> mapBuilder = MapUtil.builder("status", status);
-
- if (StringUtils.equals(status, "0")) {
- SearchResults searchResults = respSearch.getData();
- if (null != searchResults) {
- SearchResultData searchResultData = searchResults.getResults();
- if (null != searchResultData) {
- long num_queries = searchResultData.getNumQueries();
- // log.info("num_queries: {}", num_queries);
- if (num_queries > 0) {
- FieldData fieldData = searchResultData.getFieldsData(0);
-
- if (null != fieldData) {
- ScalarField scalarField = fieldData.getScalars();
-
- if (null != scalarField.getStringData()) {
- String content = scalarField.getStringData().getData(0);
-
- mapBuilder.put("content", content);
- // log.info("content: {}", content);
- }
-
- }
- }
- }
- }
- }
-
- return mapBuilder.build();
-
- }
- public static Map<String, String> drop_index(MilvusServiceClient milvusClient, String collection_name, String index_name) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (StringUtils.isEmpty(index_name) || StringUtils.isBlank(index_name)) {
- log.warn("索引名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- R<RpcStatus> rstatus = milvusClient.dropIndex(
- DropIndexParam.newBuilder()
- .withCollectionName(collection_name)
- .withIndexName(index_name)
- .build()
- );
-
- return buildResult(rstatus);
- }
- public static Map<String, String> drop_collection(MilvusServiceClient milvusClient, String collection_name) {
- R<RpcStatus> rstatus = milvusClient.dropCollection(
- DropCollectionParam.newBuilder()
- .withCollectionName(collection_name)
- .build()
- );
-
- return buildResult(rstatus);
- }
- public static Map<String, String> unload_in_memory(MilvusServiceClient milvusClient, String collection_name) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- R<RpcStatus> rstatus = milvusClient.releaseCollection(
- ReleaseCollectionParam.newBuilder()
- .withCollectionName(collection_name)
- .build());
-
- return buildResult(rstatus);
-
- }
5.1、高维向量表示的优劣
优势:
劣势
5.2、插入数据成功但无法检索
需要调用flush
milvusClient.flush(FlushParam.newBuilder() .addCollectionName(collection_name) .build());
5.3、如何批量插入数据
集合中放入多条数据即可
5.4、受限于篇幅过长,如何提升向量检索精度、如何获取文本向量及如何对向量进行预处理(向量长度补全、归一化、标准化)将另文讲解
5.5、完整代码
- package com.zwzt.communication.netty.test;
-
- import cn.hutool.core.collection.CollUtil;
- import cn.hutool.core.map.MapBuilder;
- import cn.hutool.core.map.MapUtil;
- import cn.hutool.core.util.ObjectUtil;
- import io.milvus.client.MilvusServiceClient;
- import io.milvus.common.clientenum.ConsistencyLevelEnum;
- import io.milvus.grpc.*;
- import io.milvus.param.*;
- import io.milvus.param.collection.*;
- import io.milvus.param.dml.InsertParam;
- import io.milvus.param.dml.SearchParam;
- import io.milvus.param.index.CreateIndexParam;
- import io.milvus.param.index.DropIndexParam;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.commons.lang3.StringUtils;
-
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- import java.util.Map;
-
- @Slf4j
- public class MilvusUtils {
-
- public static MilvusServiceClient connect_db(String uri) {
- MilvusServiceClient milvusClient = new MilvusServiceClient(
- ConnectParam.newBuilder()
- .withUri(uri)
- // .withToken("root:Milvus")
- .build()
- );
- return milvusClient;
- }
-
- public static Map<String, String> create_collection(MilvusServiceClient milvusClient, String collection_name, String description, int shardsNum, List<FieldType> fieldTypes) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (CollUtil.isEmpty(fieldTypes)) {
- log.warn("集合字段为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- CreateCollectionParam.Builder builder = CreateCollectionParam.newBuilder().withCollectionName(collection_name)
- .withShardsNum(shardsNum);
-
- for (FieldType fieldType : fieldTypes) {
- builder.addFieldType(fieldType);
- }
-
- if (StringUtils.isNotEmpty(description) && StringUtils.isNotBlank(description)) {
- builder.withDescription(description);
- }
-
- CreateCollectionParam createCollectionReq = builder.build();
-
- R<RpcStatus> rstatus = milvusClient.createCollection(createCollectionReq);
-
- return buildResult(rstatus);
- }
-
- public static Map<String, String> drop_collection(MilvusServiceClient milvusClient, String collection_name) {
- R<RpcStatus> rstatus = milvusClient.dropCollection(
- DropCollectionParam.newBuilder()
- .withCollectionName(collection_name)
- .build()
- );
-
- return buildResult(rstatus);
- }
-
- public static Map<String, String> create_index(MilvusServiceClient milvusClient, String collection_name, String index_column, String index_name, String params) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (StringUtils.isEmpty(index_column) || StringUtils.isBlank(index_column)) {
- log.warn("索引字段为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (StringUtils.isEmpty(index_name) || StringUtils.isBlank(index_name)) {
- log.warn("索引名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- CreateIndexParam.Builder builder = CreateIndexParam.newBuilder()
- .withIndexName(index_name)
- .withCollectionName(collection_name)
- .withFieldName(index_column)
- .withIndexType(IndexType.IVF_FLAT)
- .withMetricType(MetricType.IP)
- .withSyncMode(Boolean.FALSE);
-
- if (StringUtils.isNotEmpty(index_name) && StringUtils.isNotBlank(index_name)) {
- builder = builder.withExtraParam(params);
- }
-
- R<RpcStatus> rstatus = milvusClient.createIndex(
- builder.build()
- );
-
- return buildResult(rstatus);
- }
-
- public static Map<String, String> drop_index(MilvusServiceClient milvusClient, String collection_name, String index_name) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (StringUtils.isEmpty(index_name) || StringUtils.isBlank(index_name)) {
- log.warn("索引名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- R<RpcStatus> rstatus = milvusClient.dropIndex(
- DropIndexParam.newBuilder()
- .withCollectionName(collection_name)
- .withIndexName(index_name)
- .build()
- );
-
- return buildResult(rstatus);
- }
-
- public static Map<String, String> load_in_memory(MilvusServiceClient milvusClient, String collection_name) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- R<RpcStatus> rstatus = milvusClient.loadCollection(
- LoadCollectionParam.newBuilder()
- .withCollectionName(collection_name)
- .build()
- );
-
- return buildResult(rstatus);
- }
-
- public static Map<String, String> unload_in_memory(MilvusServiceClient milvusClient, String collection_name) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- R<RpcStatus> rstatus = milvusClient.releaseCollection(
- ReleaseCollectionParam.newBuilder()
- .withCollectionName(collection_name)
- .build());
-
- return buildResult(rstatus);
-
- }
-
- public static void disconnection_db(MilvusServiceClient milvusServiceClient) {
- if (null != milvusServiceClient) {
- milvusServiceClient.close();
- milvusServiceClient = null;
- }
- }
-
- public static Map<String, String> search_data_vector(MilvusServiceClient milvusClient, String collection_name, String fieldName, List<List<Float>> search_vectors, String params, int topK, List<String> search_output_fields) {
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (StringUtils.isEmpty(fieldName) || StringUtils.isBlank(fieldName)) {
- log.warn("检索字段为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (CollUtil.isEmpty(search_vectors) || CollUtil.isEmpty(search_vectors.get(0))) {
- log.warn("检索向量为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (CollUtil.isEmpty(search_output_fields)) {
- log.warn("输出字段为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- if (topK <= 1) {
- log.warn("topK少于1.");
- topK = 1;
- }
-
-
- SearchParam.Builder builder = SearchParam.newBuilder().withCollectionName(collection_name)
- .withConsistencyLevel(ConsistencyLevelEnum.STRONG)
- .withMetricType(MetricType.IP)
- .withOutFields(search_output_fields)
- .withTopK(topK)
- .withVectors(search_vectors)
- .withVectorFieldName(fieldName);
-
- if (StringUtils.isNotEmpty(params) && StringUtils.isNotBlank(params)) {
- builder.withParams(params);
- }
-
- SearchParam searchParam = builder.build();
- R<SearchResults> respSearch = milvusClient.search(searchParam);
-
- String status = String.valueOf(respSearch.getStatus());
- MapBuilder<String, String> mapBuilder = MapUtil.builder("status", status);
-
- if (StringUtils.equals(status, "0")) {
- SearchResults searchResults = respSearch.getData();
- if (null != searchResults) {
- SearchResultData searchResultData = searchResults.getResults();
- if (null != searchResultData) {
- long num_queries = searchResultData.getNumQueries();
- // log.info("num_queries: {}", num_queries);
- if (num_queries > 0) {
- FieldData fieldData = searchResultData.getFieldsData(0);
-
- if (null != fieldData) {
- ScalarField scalarField = fieldData.getScalars();
-
- if (null != scalarField.getStringData()) {
- String content = scalarField.getStringData().getData(0);
-
- mapBuilder.put("content", content);
- // log.info("content: {}", content);
- }
-
- }
- }
- }
- }
- }
-
- return mapBuilder.build();
-
- }
-
- public static Map<String, String> insert_data(MilvusServiceClient milvusClient, String collection_name,List<InsertParam.Field> fields){
- if (StringUtils.isEmpty(collection_name) || StringUtils.isBlank(collection_name)) {
- log.warn("集合名称为空.");
- return MapUtil.builder("status", "1").build();
- }
- if (CollUtil.isEmpty(fields)) {
- log.warn("插入数据为空.");
- return MapUtil.builder("status", "1").build();
- }
-
- InsertParam insertParam = InsertParam.newBuilder()
- .withCollectionName(collection_name)
- .withFields(fields)
- .build();
-
- R<MutationResult> mutationResultR = milvusClient.insert(insertParam);
-
- String status = String.valueOf(mutationResultR.getStatus());
- MapBuilder<String, String> mapBuilder = MapUtil.builder("status", status);
- MutationResult mutationResult = mutationResultR.getData();
- if(null != mutationResult){
- long insert_cnt = mutationResult.getInsertCnt();
- if(insert_cnt > 0){
- mapBuilder.put("msg","插入成功");
- }
- }
-
- milvusClient.flush(FlushParam.newBuilder()
- .addCollectionName(collection_name)
- // .withSyncFlush(true)
- .build());
-
- log.info("MutationResult: {}",mutationResultR);
- return mapBuilder.build();
- }
-
- private final static Map<String, String> buildResult(R<RpcStatus> rstatus) {
- // log.info("status: {}", rstatus);
-
- String status = String.valueOf(rstatus.getStatus());
- MapBuilder<String, String> mapBuilder = MapUtil.builder("status", status);
- RpcStatus data = rstatus.getData();
- if (ObjectUtil.isNotEmpty(data)) {
- String msg = data.getMsg();
- if (StringUtils.isNotEmpty(msg) && StringUtils.isNotBlank(msg)) {
- mapBuilder.put("msg", msg);
- }
-
- }
- return mapBuilder.build();
- }
-
- public static void main(String[] args) {
- String uri = "http://192.168.10.56:19530";
- MilvusServiceClient milvusServiceClient = connect_db(uri);
- String collection_name = "tb_test11";
-
- // 创建集合
- FieldType fieldType1 = FieldType.newBuilder()
- .withName("id")
- .withDataType(DataType.Int64)
- .withPrimaryKey(true)
- .withAutoID(true)
- .build();
- FieldType fieldType2 = FieldType.newBuilder()
- .withName("keyword")
- .withDataType(DataType.FloatVector)
- .withDimension(256)
- .build();
- FieldType fieldType3 = FieldType.newBuilder()
- .withName("content")
- .withDataType(DataType.VarChar)
- .withMaxLength(4096)
- .build();
- List<FieldType> fieldTypes= CollUtil.list(Boolean.FALSE,fieldType1,fieldType2,fieldType3);
- String description = "the table of tb_test11";
- int shardsNum = 1;
- Map<String,String> result = create_collection(milvusServiceClient, collection_name, description, shardsNum, fieldTypes);
- log.info("result: {}",result);
-
- // 插入数据
- // List<Float> vector = Arrays.asList(0.79558784f, 0.8433239f, -0.8132379f, -0.60343f, 0.8141689f, 0.49214464f, -1.3558795f, -1.5641332f, -1.5642508f, -1.5642508f, 0.90215206f, 0.79874355f, -0.5327561f, 0.8612926f, 0.84299415f, 0.79867285f, 0.8488582f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
- // String content = "标题:青春之光青春是一首歌,悠扬而激昂;青春是一幅画,斑斓而生动;青春是一部电影,感人至深。而在我心中,青春更是那个在奥运赛场上奔跑的刘翔。记得那是2004年的雅典奥运会,刘翔以12.91秒的成绩打破了世界纪录,成为中国田径历史上第一位获得奥运金牌的运动员。那一刻,我被他的坚韧和毅力深深打动,也深深地感受到了青春的力量。刘翔的青春,充满了挑战和奋斗。他曾经因为伤病困扰,一度想要放弃,但他没有。他知道,只有坚持下去,才能实现自己的梦想。于是,他在痛苦中挣扎,用汗水和泪水浇灌着自己的青春。终于,他成功了,他站在了奥运的最高领奖台上,成为了全中国的骄傲。刘翔的青春,充满了激情和活力。他是中国田径的一颗璀璨明星,他的每一次起跑都充满力量,他的每一次跨栏都充满速度。他的青春,就像一道闪电,照亮了整个赛场,也照亮了我们的心灵。刘翔的青春,充满了希望和梦想。他的梦想是成为最好的自己,他的希望是为中国赢得更多的荣誉。他的青春,就像一盏明灯,指引着他前进的方向,也激励着我们去追求自己的梦想。青春,就是要有梦想,有希望,有勇气去追逐。刘翔的青春,就是这样,充满了梦想、希望和勇气。他的青春,是我们所有人的青春,是我们所有人追求梦想的动力。青春,是一场无悔的旅程,无论前方有多少困难和挫折,只要我们有梦想,有希望,有勇气,就一定能够到达我们的目的地。让我们一起,像刘翔一样,用自己的青春,去创造属于我们自己的辉煌!";
- //
- // List<String> contents = CollUtil.list(Boolean.FALSE,content);
- // List<List<Float>> vectors = new ArrayList<>();
- // vectors.add(vector);
- //
- // List<InsertParam.Field> fields = new ArrayList<>();
- // fields.add(new InsertParam.Field("keyword", vectors));
- // fields.add(new InsertParam.Field("content", contents));
- //
- // Map<String,String> result = insert_data(milvusServiceClient,collection_name,fields);
- // log.info("result: {}",result);
-
- // 创建索引
- // String index_column = "keyword";
- // String index_name = "idx_keyword";
- // String params = "{\"nlist\":65536}";
- // Map<String, String> result = create_index(milvusServiceClient, collection_name, index_column, index_name, params);
- // log.info("result: {}", result);
-
- // 删除索引
- // Map<String, String> result = drop_index(milvusServiceClient, collection_name,index_name);
- // log.info("result: {}", result);
-
- // 装载至内存
- // Map<String,String> result = load_in_memory(milvusServiceClient, collection_name);
- // log.info("result: {}",result);
-
- // 向量查询
- // List<String> search_output_fields = Arrays.asList("content");
- // List<List<Float>> search_vectors = Arrays.asList(Arrays.asList(0.79558784f, 0.8433239f, -0.8132379f, -0.60343f, 0.8141689f, 0.49214464f, -1.3558795f, -1.5641332f, -1.5642508f, -1.5642508f, 0.90215206f, 0.79874355f, -0.5327561f, 0.8612926f, 0.84299415f, 0.79867285f, 0.8488582f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
- // String fieldName = "keyword";
- // int topK = 1;
- //
- // Map<String, String> result = search_data_vector(milvusServiceClient, collection_name, fieldName, search_vectors, null, topK, search_output_fields);
- // log.info("result: {}", result);
-
- // 删除集合
- // Map<String, String> result = drop_collection(milvusServiceClient, collection_name);
- // log.info("result: {}", result);
-
- disconnection_db(milvusServiceClient);
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。