正常操作:

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());
}

使用\\.转移即可,接下来就能正常使用了。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐