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

# ClickHouse 可以用于向量搜索吗？

> 了解如何使用 ClickHouse 进行向量搜索，包括存储嵌入向量，以及使用余弦相似度等距离函数进行搜索。

{frontMatter.description}

<div id="clickhouse-for-vector-search">
  ## 使用 ClickHouse 进行向量搜索！
</div>

是的，ClickHouse 可以执行向量搜索。

与使用更专门的向量数据库相比，使用 ClickHouse 进行向量搜索的主要优势包括：

* 在执行搜索前，利用 ClickHouse 的过滤和全文搜索功能先缩小数据集范围。
* 对数据集进行分析。
* 将数据与你现有的数据执行 `JOIN`。
* 无需再维护另一套数据库，也不用让基础设施变得更复杂。

下面是一个关于如何使用 ClickHouse 进行向量搜索的简要教程。

<Steps>
  <Step title="创建嵌入向量">
    你的数据 (文档、图像或结构化数据) 必须转换为 *嵌入向量*。我们建议使用 [OpenAI Embeddings API](https://platform.openai.com/docs/api-reference/embeddings) 创建嵌入向量，或使用开源 Python 库 [SentenceTransformers](https://www.sbert.net/)。

    你可以将嵌入向量视为由大量浮点数组成的数组，用来表示你的数据。[查看 OpenAI 的这份指南，进一步了解嵌入向量](https://developers.openai.com/api/docs/guides/embeddings)。
  </Step>

  <Step title="存储嵌入向量">
    生成嵌入向量后，你需要将其存储到 ClickHouse 中。每个嵌入向量都应存储在单独的一行中，并且可以包含用于过滤、聚合或分析的元数据。以下是一个可用于存储带标题说明图像的表示例：

    ```sql theme={null}
    CREATE TABLE images
    (
    	`_file` LowCardinality(String),
    	`caption` String,
    	`image_embedding` Array(Float32)
    )
    ENGINE = MergeTree;
    ```
  </Step>

  <Step title="搜索相关嵌入向量">
    假设你想在数据集中搜索狗的图片。你可以使用 `cosineDistance` 这样的距离函数，基于一张狗图片的嵌入向量来查找相关图像：

    ```sql theme={null}
    SELECT
        _file,
    	caption,
    	cosineDistance(
            -- 你的“输入”狗图片的嵌入向量
            [0.5736801028251648, 0.2516217529773712, ...,  -0.6825592517852783],
            image_embedding
        ) AS score
    FROM images
    ORDER BY score ASC
    LIMIT 10
    ```

    此查询会返回与你提供的狗图片最相关的 10 张图像的 `_file` 名称和 `caption`。
  </Step>
</Steps>

<div id="further-reading">
  ## 延伸阅读
</div>

如需进一步了解如何使用 ClickHouse 进行向量搜索，请参阅：

* [精确向量搜索与近似向量搜索](/docs/zh/reference/engines/table-engines/mergetree-family/annindexes)
