> ## Documentation Index
> Fetch the complete documentation index at: https://langchain-docs-zh.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# OracleVS 集成

> 使用 LangChain JavaScript 集成 OracleVS 向量存储

> [!TIP]
>
> **兼容性**：仅在 Node.js 上可用。

Oracle AI Database 支持通过 **语义**（意义）而非关键词查询数据的 AI 工作负载。它将 **非结构化内容的语义搜索** 与 **业务数据的关联过滤** 结合在一个系统中，因此您可以在不引入单独的向量数据库并将数据分散到多个平台的情况下，构建检索工作流（如 RAG）。

本指南演示如何使用 `OracleVS`（用于 Oracle AI Vector Search 的 LangChain 向量存储集成）来：

* 将文档和嵌入导入 Oracle
* 运行相似性搜索
* 创建 HNSW 和 IVF 索引
* 应用元数据过滤器以实现高级检索
* 在 Oracle AI Database 26ai 中启用混合搜索（关键词 + 语义）
* 使用 Oracle Text 运行全文搜索

## 概述

### 集成详情

| 类 | 包 | 混合搜索 | PY 支持 |
| :- | :- | :-: | :-: |
| `OracleVS` | [`@oracle/langchain-oracledb`](https://www.npmjs.com/package/@oracle/langchain-oracledb) | ✅ | ✅ |

## 设置

安装 Oracle 客户端绑定和 LangChain Oracle 辅助工具：

```bash npm theme={null}
npm install @oracle/langchain-oracledb @langchain/core
```

```bash yarn theme={null}
yarn add @oracle/langchain-oracledb @langchain/core
```

```bash pnpm theme={null}
pnpm add @oracle/langchain-oracledb @langchain/core
```

为将拥有向量表的 Oracle 用户设置连接凭证：

```bash theme={null}
export ORACLE_USER=testuser
export ORACLE_PASSWORD=testuser
export ORACLE_DSN="localhost:1521/free"
```

## 创建向量存储

以下示例假设您已经创建了一个包含向量和元数据列的表，并使用 [`OracleEmbeddings`](https://langchain-docs-zh.mintlify.site/langchain/oss/python/integrations/embeddings/oracleai) 生成了嵌入。

:::js

```typescript theme={null}
import oracledb from "oracledb";
import { OracleEmbeddings, OracleVS } from "@oracle/langchain-oracledb";
import { Document } from "@langchain/core/documents";

const connection = await oracledb.getConnection({
  user: process.env.ORACLE_USER,
  password: process.env.ORACLE_PASSWORD,
  connectionString: process.env.ORACLE_DSN,
});

const embeddings = new OracleEmbeddings(connection, {
  provider: "database",
  model: "DEMO_MODEL",
});

const vectorStore = new OracleVS(embeddings, {
  client: connection,
  tableName: "DEMO_VECTORS",
  query: "Find documents about Oracle RAG patterns.",
  distanceStrategy: "DOT",
});
await vectorStore.initialize();

const docs: Document[] = [
  {
    pageContent: "LangChain works great with Oracle Database.",
    metadata: {
      doc_id: "doc-1",
      title: "RAG overview",
      status: "release",
      tags: ["AI", "rag"],
      category: "books",
      price: 18,
    },
  },
];

await vectorStore.addDocuments(docs);

// Close connections or pools in application shutdown hooks to avoid leaks.
// await connection.close();
```

:::

如果您的应用程序已经管理了 Oracle 数据库连接池，请直接将连接池传递给 `OracleVS`。存储会根据需要获取和释放连接。

:::js

```typescript theme={null}
const pool = await oracledb.createPool({
  user: process.env.ORACLE_USER,
  password: process.env.ORACLE_PASSWORD,
  connectString: process.env.ORACLE_DSN,
  poolIncrement: 1,
  poolMax: 4,
  poolMin: 0,
  poolPingInterval: 60,
});

const vectorStoreFromPool = new OracleVS(embeddings, {
  client: pool,
  tableName: "DEMO_VECTORS",
  query: "Find documents about Oracle RAG patterns.",
  distanceStrategy: "DOT",
});
await vectorStoreFromPool.initialize();

// Release resources during shutdown.
// await pool.close(0);
```

:::

## 过滤搜索结果

您可以将丰富的元数据过滤器作为 `similaritySearch`、`similaritySearchWithScore` 或 `similaritySearchVectorWithScore` 的第三个参数传递。过滤器在 Oracle VS 为每个文档维护的 JSON `metadata` 列上运行。

支持的比较运算符包括 `$eq`（默认）、`$ne`、`$lt`、`$lte`、`$gt`、`$gte`、`$in`、`$nin`、`$between` 和 `$exists`。使用 `$and` 和 `$or` 组合子句以构建更表达式的谓词。

:::js

```typescript theme={null}
const results = await vectorStore.similaritySearch("oracle rag", 3, {
  $and: [
    { status: "release" },
    { tags: { $in: ["AI"] } },
    { price: { $between: [10, 25] } },
  ],
});

// Or request scores alongside documents.
const scored = await vectorStore.similaritySearchWithScore(
  "oracle rag",
  3,
  { status: "release" },
);

console.log(results[0]?.pageContent);
console.log(scored[0]?.[1]); // similarity score
```

:::

也支持嵌套逻辑子句。例如：

```typescript theme={null}
const complexFilter = {
  $or: [
    { status: "draft" },
    {
      $and: [
        { category: "books" },
        { price: { $lte: 20 } },
      ],
    },
  ],
};
```

## 使用向量索引加速搜索

Oracle Database 可以通过在 `embedding` 列上创建向量索引来加速相似性查询。`@oracle/langchain-oracledb` 辅助工具提供了一个 `createIndex` 工具，可以配置 HNSW（默认）或 IVF 索引。

### HNSW 索引（默认）

当您需要一个平衡召回率和延迟的基于图的索引时，请使用 HNSW。省略 `idxType` 以使用默认配置或覆盖参数，例如 `neighbors`、`efConstruction` 和 `accuracy`。

```typescript theme={null}
import { createIndex } from "@oracle/langchain-oracledb";

// Reuse the vectorStore and connection from the setup section,
// or create one with OracleVS.fromDocuments / initialize().
await createIndex(connection, vectorStore, {
  idxName: "demo_hnsw_idx",
  neighbors: 48,
  efConstruction: 400,
  accuracy: 95,
  parallel: 16,
});
```

### IVF 索引

通过传递 `idxType: "IVF"` 和要创建的邻居分区数量来切换到 IVF。IVF 将向量分区到集群中，当您需要粗粒度量化且内存使用可预测时，它很有用。

```typescript theme={null}
import { createIndex } from "@oracle/langchain-oracledb";

await createIndex(connection, vectorStore, {
  idxName: "demo_ivf_idx",
  idxType: "IVF",
  neighborPart: 64,
  accuracy: 90,
  parallel: 8,
});
```

在加载数据后（或在 `initialize` 后）运行 `createIndex` 一次，并重复使用索引进行后续搜索。要重建或切换策略，请通过标准 SQL（`DROP INDEX ...`）删除现有索引，并使用新参数重新运行 `createIndex`。

## 下一步

* 使用 [`OracleDocLoader`](https://langchain-docs-zh.mintlify.site/langchain/oss/javascript/integrations/document_loaders/file_loaders/oracleai) 加载内容
* 使用 [`OracleEmbeddings`](https://langchain-docs-zh.mintlify.site/langchain/oss/python/integrations/embeddings/oracleai) 生成嵌入
* 使用 [`OracleSummary`](https://langchain-docs-zh.mintlify.site/langchain/oss/python/integrations/tools/oracleai) 摘要文档

***

> 官方原文：[src/oss/javascript/integrations/vectorstores/oracleai.mdx](https://github.com/langchain-ai/docs/blob/main/src/oss/javascript/integrations/vectorstores/oracleai.mdx) · 非官方翻译，译文由 AI 生成，以英文原文为准。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.