向量数据库Milvus字符串查询

        因为项目需要,用到了向量数据库Milvus,刚开始都没有遇到问题,直到一个表的主键是字符串(VARCHAR),在查询时刚好要以该主键作为查询条件,此时会出现异常,特此记录一下。

        记住,字符串查询,构建表达式时要加上单引号,比如下面的'{face_id}',其实face_id本来就是一个字符串类型了,如果不加会出现如下的异常:
        # pymilvus.exceptions.MilvusException: <MilvusException: (code=65535, message=cannot parse expression: face_id == 2_0, error: invalid expression: face_id == 2_0)>

  具体看下面的代码(milvus_demo.py),其中exists()函数中构建查询表达式时做了特殊处理:

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility, Partition
import time
from datetime import datetime
from typing import List


#用于测试字符串查询的demo


# MILVUS向量数据库地址
MILVUS_HOST_ONLINE = '127.0.0.1'
MILVUS_PORT = 19530

# 检索时返回的匹配内容条数
VECTOR_SEARCH_TOP_K = 100


class MilvusAvatar:
    # table_name 表名
    # partition_names  分区名,使用默认即可
    def __init__(self, mode, table_name, *, partition_names=["default"], threshold=1.1, client_timeout=3):
        self.table_name = table_name
        self.partition_names = partition_names
        
        self.host = MILVUS_HOST_ONLINE
        self.port = MILVUS_PORT
        self.client_timeout = client_timeout
        self.threshold = threshold
        self.sess: Collection = None
        self.partitions: List[Partition] = []
        self.top_k = VECTOR_SEARCH_TOP_K
        self.search_params = {"metric_type": "L2", "params": {"nprobe": 256}}
        self.create_params = {"metric_type": "L2", "index_type": "IVF_FLAT", "params": {"nlist": 2048}}
                
        self.init()

    @property
    def fields(self):
        fields = [
            FieldSchema(name='face_id', dtype=DataType.VARCHAR, max_length=640, is_primary=True, auto_id = False),
        
### 使用 LangChain4J 将数据读取并存储到 Milvus 向量数据库 LangChain4J 是一种用于构建基于大语言模型的应用程序的框架,支持多种文档加载器和向量数据库集成。以下是关于如何使用 LangChain4J 加载文档并将数据存储到 Milvus 向量数据库中的详细说明。 #### 1. 文档解析与加载 LangChain 提供了丰富的工具来处理不同类型的文档(如 txt、pdf、html 等),这些工具能够将文档转换为字符串形式以便进一步处理[^1]。对于 Java 用户来说,`langchain4j` 库提供了类似的接口以实现这一功能。 ```java import dev.langchain4j.data.document.Document; import dev.langchain4j.data.document.DocumentLoader; public class DocumentParser { public static void main(String[] args) throws Exception { // 假设我们有一个 PDF 文件路径 String filePath = "path/to/your/document.pdf"; // 创建一个 DocumentLoader 实例 (这里假设是 PDF 类型) DocumentLoader documentLoader = new PdfDocumentLoader(); // 载入文档内容 List<Document> documents = documentLoader.load(filePath); System.out.println("Documents loaded successfully!"); } } ``` 上述代码展示了如何利用 `PdfDocumentLoader` 来加载 PDF 文件的内容,并将其转化为可操作的对象列表。 #### 2. 数据分割成 Chunks 为了适应模型的最大上下文长度限制,通常需要将完整的文本切分成更小的部分即 chunks。这一步骤可以通过自定义逻辑完成: ```java import java.util.ArrayList; import java.util.List; public class TextChunker { private final int chunkSize; public TextChunker(int chunkSize){ this.chunkSize = chunkSize; } public List<String> splitTextIntoChunks(List<String> texts){ List<String> result = new ArrayList<>(); for(String text : texts){ while(text.length() > chunkSize){ result.add(text.substring(0, Math.min(chunkSize, text.length()))); text = text.substring(Math.min(chunkSize, text.length())); } if(!text.isEmpty()){ result.add(text); } } return result; } } ``` 此方法接受一段较长的文字作为输入参数之一,并按照指定大小对其进行切割直到每部分都满足条件为止。 #### 3. 连接到 Milvus 并插入数据 Milvus 是一款专门针对高维特征搜索优化设计的关系型数据库解决方案,在其中我们可以高效地管理大量非结构化数据集及其对应的嵌入表示[^2][^4]。下面是如何设置连接并与之交互的一个例子: 首先确保安装好所需的依赖项: ```bash pip install pymilvus==2.x.x # 如果是在Python环境中运行的话 mvn dependency:tree | grep milvus-client-sdk # Maven项目则需确认已加入相应库版本号 ``` 接着编写Java客户端代码如下所示: ```java import io.milvus.client.MilvusServiceClient; import io.milvus.param.collection.CreateCollectionParam; import io.milvus.param.dml.InsertParam; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service public class MilvusVectorDatabaseService { @Value("${milvus.address}") private String address; public void connectAndInsertData(){ try(MilvusServiceClient client=new MilvusServiceClient(address)){ CreateCollectionParam param=CreateCollectionParam.newBuilder() .withCollectionName("my_collection") .addFieldType(FieldType.INT64,"id",true,false,null) .addFieldType(FieldType.FLOAT_VECTOR,"embedding",false,true,new Dimension(128)) .build(); Boolean res=client.createCollection(param).getStatus().isOk(); System.out.println(res?"Created collection":"Failed to create"); Float[][] vectors={{...},{...}};//实际应用中由上一环节生成的具体数值代替省略符位置 InsertParam insertParams=InsertParam.newBuilder() .withCollectionName("my_collection") .addVectors(vectors) .build(); Long count=client.insert(insertParams).getCount(); System.out.printf("%d records inserted%n",count); }catch(Exception e){ throw new RuntimeException(e.getMessage(),e); } } } ``` 以上片段演示了创建集合以及批量写入记录至目标表内的全过程。注意替换掉模板变量 `${milvus.address}` 和浮点数组实例等内容使其适配具体场景需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值