> ## Documentation Index
> Fetch the complete documentation index at: https://javaai.pig4cloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SAP HANA Cloud 向量数据库

# SAP HANA Cloud 向量数据库

Spring AI 支持将 [SAP HANA Cloud](https://www.sap.com/products/technology-platform/hana.html) 作为向量数据库，利用其向量引擎进行相似性搜索。

## 添加依赖

要使用 SAP HANA Cloud 向量存储，您需要将 `spring-ai-sap-hana-store-spring-boot-starter` 依赖项添加到项目的 `pom.xml` 文件中。
该启动器包含了 `spring-ai-core` 和 SAP HANA JDBC 驱动程序。

```xml theme={"system"}
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-sap-hana-store-spring-boot-starter</artifactId>
</dependency>
```

您还需要一个 `EmbeddingClient` 实现来为您的文档生成向量嵌入。例如，您可以添加 `spring-ai-openai-spring-boot-starter` 以使用 OpenAI 的嵌入模型：

```xml theme={"system"}
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
```

## 配置属性

在您的 `application.properties` 或 `application.yml` 文件中配置 SAP HANA Cloud 和嵌入客户端属性。

### SAP HANA Cloud 属性

| 属性                                                    | 描述                                                                      | 默认值                                  |
| :---------------------------------------------------- | :---------------------------------------------------------------------- | :----------------------------------- |
| `spring.ai.vectorstore.hana.host`                     | SAP HANA Cloud 实例的主机名或 IP 地址。                                           |                                      |
| `spring.ai.vectorstore.hana.port`                     | SAP HANA Cloud 实例的端口。                                                   |                                      |
| `spring.ai.vectorstore.hana.username`                 | 用于连接到 SAP HANA Cloud 的用户名。                                              |                                      |
| `spring.ai.vectorstore.hana.password`                 | 用于连接到 SAP HANA Cloud 的密码。                                               |                                      |
| `spring.ai.vectorstore.hana.table-name`               | 用于存储向量和元数据的表名。                                                          | `SPRING_AI_VECTOR_STORE`             |
| `spring.ai.vectorstore.hana.embedding-dimension`      | 嵌入向量的维度。必须与 `EmbeddingClient` 生成的维度匹配。                                  | 1536 (OpenAI text-embedding-ada-002) |
| `spring.ai.vectorstore.hana.distance-type`            | 用于相似性搜索的距离类型 (`L2DISTANCE`, `COSINE_SIMILARITY`, `EUCLIDEAN_DISTANCE`)。 | `L2DISTANCE`                         |
| `spring.ai.vectorstore.hana.schema-name`              | SAP HANA Cloud 中的 schema 名称。                                            | (用户默认 schema)                        |
| `spring.ai.vectorstore.hana.ssl.enabled`              | 是否为 JDBC 连接启用 SSL。                                                      | `false`                              |
| `spring.ai.vectorstore.hana.ssl.trust-store-location` | SSL 信任库文件的路径 (如果 `ssl.enabled` 为 `true`)。                               |                                      |
| `spring.ai.vectorstore.hana.ssl.trust-store-password` | SSL 信任库的密码 (如果 `ssl.enabled` 为 `true`)。                                 |                                      |

**示例 `application.properties`:**

```properties theme={"system"}
# SAP HANA Cloud 配置
spring.ai.vectorstore.hana.host=your-hana-host
spring.ai.vectorstore.hana.port=your-hana-port
spring.ai.vectorstore.hana.username=your-username
spring.ai.vectorstore.hana.password=your-password
spring.ai.vectorstore.hana.table-name=MY_VECTOR_TABLE
spring.ai.vectorstore.hana.embedding-dimension=1536
spring.ai.vectorstore.hana.distance-type=COSINE_SIMILARITY
# spring.ai.vectorstore.hana.schema-name=MY_SCHEMA # 可选
# spring.ai.vectorstore.hana.ssl.enabled=true # 如果需要 SSL
# spring.ai.vectorstore.hana.ssl.trust-store-location=path/to/truststore.jks
# spring.ai.vectorstore.hana.ssl.trust-store-password=truststore_password

# 嵌入客户端配置 (例如 OpenAI)
spring.ai.openai.api-key=YOUR_OPENAI_API_KEY
spring.ai.openai.embedding.options.model=text-embedding-ada-002
```

<Note>
  确保 `spring.ai.vectorstore.hana.embedding-dimension` 与您正在使用的 `EmbeddingClient` 输出的嵌入维度相匹配。
  如果表不存在，它将在第一次添加文档时自动创建。
</Note>

## 使用 `VectorStore`

将 `VectorStore` bean 注入到您的组件中以与之交互：

```java theme={"system"}
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.document.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MyVectorStoreService {

    private final VectorStore vectorStore; // 将自动配置 HanaVectorStore

    @Autowired
    public MyVectorStoreService(VectorStore vectorStore) {
        this.vectorStore = vectorStore;
    }

    public void addDocuments(List<Document> documents) {
        vectorStore.add(documents);
    }

    public List<Document> findSimilarDocuments(String query, int k) {
        return vectorStore.similaritySearch(query, k);
    }
}
```

### 创建 `HanaVectorStore` Bean (可选)

Spring Boot 会自动配置 `HanaVectorStore` bean。但是，如果您需要自定义配置，可以定义自己的 bean：

```java theme={"system"}
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.ai.embedding.EmbeddingClient;
import org.springframework.ai.vectorstore.HanaVectorStore;
import org.springframework.ai.vectorstore.HanaVectorStore.HanaVectorStoreConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Configuration
public class MyHanaConfig {

    @Bean
    public DataSource hanaDataSource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl("jdbc:sap://your-hana-host:your-hana-port");
        dataSource.setUsername("your-username
        dataSource.setPassword("your-password");
        // dataSource.setSchema("MY_SCHEMA"); // 可选
        // SSL 属性 (如果需要)
        // dataSource.getDataSourceProperties().setProperty("encrypt", "true");
        // dataSource.getDataSourceProperties().setProperty("trustStore", "path/to/truststore.jks");
        // dataSource.getDataSourceProperties().setProperty("trustStorePassword", "truststore_password");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource hanaDataSource) {
        return new JdbcTemplate(hanaDataSource);
    }

    @Bean
    public HanaVectorStore hanaVectorStore(JdbcTemplate jdbcTemplate, EmbeddingClient embeddingClient) {
        HanaVectorStoreConfig config = HanaVectorStoreConfig.builder()
            .tableName("MY_CUSTOM_TABLE")
            .embeddingDimension(1536)
            .distanceType(HanaVectorStoreConfig.DistanceType.COSINE_SIMILARITY)
            // .schemaName("MY_SCHEMA") // 可选
            .build();
        return new HanaVectorStore(jdbcTemplate, embeddingClient, config);
    }
}
```

## 元数据过滤

SAP HANA Cloud 向量存储支持使用 SQL `WHERE` 子句和 Spring AI 的 [相似性搜索过滤器表达式](./index.mdx#metadata-filtering) 进行元数据过滤。

过滤器表达式会转换为 SQL `WHERE` 子句中的条件。

**示例：**

```java theme={"system"}
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.filter.Filter;
import org.springframework.ai.vectorstore.filter.FilterExpressionBuilder;

// ...

FilterExpressionBuilder b = new FilterExpressionBuilder();

// "metadata"->>'genre' = 'drama' AND "metadata"->>'year' > 2020
// 注意：在 SAP HANA 中，JSON 字段访问通常使用 JSON 函数或路径表达式。
// 此处的示例假定元数据存储为 JSON，并且数据库配置为支持此类查询。
// 精确的 SQL 语法可能因您的 HANA 版本和表结构而异。
Filter filter = new Filter(b.eq("genre", "drama").and(b.gt("year", 2020)).build());

SearchRequest request = SearchRequest.query("A dramatic film released after 2020") // 示例查询通常保留英文
    .withTopK(5)
    .withFilter(filter);

List<Document> results = vectorStore.similaritySearch(request);
```

<Note>
  元数据存储在表中的 `metadata` JSON 列中。
  过滤器表达式中使用的键 (例如，`genre`, `year`) 应该是您在文档元数据中使用的键。
  确保您的 SAP HANA Cloud 实例配置为允许对 JSON 列进行高效查询。根据需要，可能需要为元数据字段创建索引。
</Note>

## 删除数据

`HanaVectorStore` 支持通过文档 ID 删除数据。

```java theme={"system"}
boolean deleted = vectorStore.delete(List.of("documentId1", "documentId2"));
```

## 总结

将 Spring AI 与 SAP HANA Cloud 集成，使您能够利用 HANA 的内存计算能力和企业级特性进行向量存储和相似性搜索，从而增强您的 AI 应用程序。

<Card title="文档有误？请协助编辑" icon="pencil" href="https://github.com/javaai-pig4cloud-com/javaai-docs/edit/main/spring-ai/api/vectordbs/hana.mdx">
  发现文档问题？点击此处直接在 GitHub 上编辑并提交 PR，帮助我们改进文档！
</Card>
