关于RedisVectorStore的filterExpression匹配问题
·
正常操作:
1.首先引入依赖:
分别是pdf读取转换为Document,redis向量数据库,还有用于embeddingModel向量模型的依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-pdf-document-reader</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
2.配置yaml,设置向量库和redis,自动装配VectorStore
spring:
data:
redis:
host: localhost
port: 6379
ai:
vectorstore:
redis:
initialize-schema: true
index-name: custom-index
prefix: custom-prefix
3.此时就可以直接用了,首先处理pdf文件,存入向量数据库,在similaritySearch的时候查询
//1.获取文件
Resource resource = new FileSystemResource("note.pdf");//从当前根目录开始检索
//2.创建PDF读取器
PagePdfDocumentReader reader = new PagePdfDocumentReader(
resource, // 文件源
PdfDocumentReaderConfig.builder()
.withPageExtractedTextFormatter(ExtractedTextFormatter.defaults())
.withPagesPerDocument(1) // 每1页PDF作为一个Document
.build()
);
//3.调用read方法,拆分为Document
List<Document> read = reader.read();
for(Document document:read){
System.out.println(document.getMetadata());
}
//4.添加到向量数据库
vectorStore.add(read);
//*构造FilterExpression
//*构建request
SearchRequest searchRequest = SearchRequest.builder()
.query("论语中教育的目的是什么")
.similarityThreshold(0.6)//相似度阈值为0.6,大于0.6才会被检索出来
.topK(3)//获取前三个
.filterExpression("file_name == 'note.pdf'")//避免文档干扰,只找指定文档
.build();
//5.查询
List<Document> documents = vectorStore.similaritySearch(searchRequest);
for (Document document : documents) {
System.out.println(document.getText());
}
这时候就会出现问题,查询根本无法输出,如下:
...
2025-11-21T09:59:26.079+08:00 DEBUG 8044 --- [SpringAi] [ main] o.s.d.r.l.RedisMessageListenerContainer : Starting RedisMessageListenerContainer...
2025-11-21T09:59:26.080+08:00 DEBUG 8044 --- [SpringAi] [ main] o.s.d.r.l.RedisMessageListenerContainer : Postpone listening for Redis messages until actual listeners are added
2025-11-21T09:59:26.088+08:00 INFO 8044 --- [SpringAi] [ main] com.loyijy.SpringAiApplicationTests : Started SpringAiApplicationTests in 3.629 seconds (process running for 4.471)
Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
2025-11-21T09:59:39.080+08:00 DEBUG 8044 --- [SpringAi] [ionShutdownHook] o.s.d.r.l.RedisMessageListenerContainer : Stopped RedisMessageListenerContainer
进程已结束,退出代码为 0
4.这里就是按照文件名查找的问题:Spring AI 的 filter DSL 在处理字符串字面量中的标点字符(尤其是 .)时存在错误。
一、所以我们要对.进行操作,首先第一步骤将yaml全删掉,然后自己配置bean,让他能够处理.。
@Bean
public JedisPooled jedisPooled(RedisConnectionFactory redisConnectionFactory) {
return new JedisPooled("127.0.0.1", 6379);
}
@Bean
public VectorStore redisVectorStore(JedisPooled jedisPooled, EmbeddingModel embeddingModel) {
return RedisVectorStore
.builder(jedisPooled, embeddingModel)
.initializeSchema(true)
.indexName("custom-index")
.prefix("custom-prefix")
.metadataFields(RedisVectorStore.MetadataField.tag("file_name"))
.build();
}
这里最重要的就是MetadataField.tag而不是text,text对.会有操作,tag是原封不动的。
二、筛选的时候转义.
//*构造FilterExpression
//*构建request
SearchRequest searchRequest = SearchRequest.builder()
.query("论语中教育的目的是什么")
.similarityThreshold(0.6)//相似度阈值为0.6,大于0.6才会被检索出来
.topK(3)//获取前三个
.filterExpression("file_name == 'note\\.pdf'")//避免文档干扰,只找指定文档
.build();
//5.查询
List<Document> documents = vectorStore.similaritySearch(searchRequest);
for (Document document : documents) {
System.out.println(document.getText());
}
使用\\.转移即可,接下来就能正常使用了。
更多推荐


所有评论(0)