# Text-to-Image Search with Manticore Search

**TL;DR:** 学习Manticore Search如何通过结合自然语言处理与基于向量的图像检索来实现文本到图像搜索。探索不同的方法，从传统方法到高级向量搜索，并尝试我们的[文本到图像搜索演示](https://image.manticoresearch.com)来实际体验。

## 介绍

通过用自然语言描述图像（例如“海滩上的日落”）来找到合适的图像，这不再是未来的愿景。文本到图像搜索通过无缝连接语言与视觉内容使这成为可能。

传统方法，如关键字匹配或手动标记，在准确性和可扩展性方面存在局限性。现代方法，如Manticore Search驱动的方法，利用语义理解和向量嵌入来提供更精确和上下文感知的结果。无论您是在创建电子商务平台、管理媒体库还是构建创意工具，文本到图像搜索都可以简化用户与您内容的交互方式。

想实际体验吗？请尝试我们的[文本到图像搜索演示](https://image.manticoresearch.com)。

## 文本到图像搜索的不同方法

### 1. 基于关键字的搜索

基于关键字的搜索是实现文本到图像搜索的最简单方法之一。要开始，您需要设置适当的数据结构：

```sql
CREATE TABLE images (
    title text,
    description text,
    tags text,
    path string stored
);
```
要使此方法有效，您需要首先手动标记每张图像。标记完成后，您可以使用如下查询进行搜索：

```sql
SELECT * FROM images WHERE MATCH('@tags red dress');
```

或者您也可以通过添加到图像中的标题和描述进行搜索：

```sql
SELECT * FROM images WHERE MATCH('@(title,description) red dress');
```
这种方法依赖于将文本元数据与搜索术语进行匹配。虽然简单，但这种方法需要手动标记，并且有多个限制。它会遗漏术语之间的语义关系，无法理解更广泛的上下文，并且仅限于精确匹配而非概念相似性。

### 2. 基于分类的搜索

为了增强产品搜索功能，您可以实现分类。这种方法允许您通过选择类别来过滤图像，同时对自定义属性应用全文搜索。这种双重搜索方法帮助用户更高效地找到他们需要的内容。

您应该通过将图像分类到不同的类别中来组织图像。以下是表结构可能的样子：

```sql
CREATE TABLE images (
    category_id int,
    subcategory_id int,
    attributes json,
    path string stored
);
```

这种方法将图像组织到预定义的类别中，比基于关键字的搜索提供更结构化的方法，同时更容易导航。然而，它受到严格分类的限制，并且需要手动将图像分类到特定组中。

### 3. 使用Manticore Search与图像标题

有许多AI模型能够生成图像标题。虽然这些标题可能不够完善以用于面向客户的内容，但它们可以用于增强搜索功能。这种方法补充了传统的基于关键字的方法，提供了额外的搜索能力层。

无论您如何组织图像——无论是通过分类还是手动标记——您都需要使用全文搜索操作符，通过搜索这些填充字段来有效找到图像。

让我们看看如果您选择实现手动标题，工作流程可能如何展开：

1. 插入带有正确格式标题的数据：
    ```sql
    INSERT INTO images (id, auto_caption, indexed_caption, path) VALUES
        (1, 'A person walking on a beach during sunset', 'beach sunset walking person', '/images/sunset_beach.jpg'),
        (2, 'Red car parked in an urban setting', 'car red urban parking', '/images/red_car.jpg');
    ```
2. 使用indexed_caption字段进行基本文本搜索：
    ```sql
    SELECT * FROM images WHERE MATCH('@indexed_caption beach sunset');
    ```
3. 使用高级搜索操作符以获得更精确的结果：
    ```sql
    -- Phrase matching
    SELECT * FROM images WHERE MATCH('"red car"');

    -- Boolean operators
    SELECT * FROM images WHERE MATCH('@indexed_caption (beach | sunset) -night');
    ```

优化搜索的关键考虑因素：
- 预处理标题以去除停用词
- 使用词干提取以获得更好的匹配
- 考虑常见术语的同义词
- 实现相关性评分以获得更好的结果

您还可以将全文搜索与附加筛选器结合使用：
```sql
SELECT path, WEIGHT() as relevance
FROM images
WHERE MATCH('@indexed_caption sunset')
AND category_id = 1
ORDER BY relevance DESC
LIMIT 10;
```

### 4. 基于向量的搜索（推荐方法）

正如我们所探讨的，传统方法如基于关键字或基于分类的搜索，以及使用标题的增强选项，提供了不同层次的效率和复杂性。虽然这些方法在特定情境下可能有价值，但它们在处理细微或模糊的查询时往往不足。

为了克服这些限制，Manticore Search的基于向量的搜索提供了一个强大的替代方案。通过使用向量嵌入，这种方法弥合了文本和图像之间的差距，实现了语义理解和精确匹配。让我们分解其工作原理和实施步骤。

#### 基于向量的搜索如何工作

基于向量的搜索依赖于嵌入——数据的数值表示，编码语义意义。多模态模型处理文本和图像输入以生成这些嵌入，使系统能够基于意义而非字面关键字匹配查询和图像。工作流程包括：

1. 使用机器学习模型为图像和文本生成嵌入。
2. 将这些嵌入存储在优化用于相似性搜索的数据库中。
3. 查询数据库以找到给定输入的最相关匹配。

为了帮助可视化此过程，以下图表说明了文本和图像如何转换为嵌入并通过Manticore Search进行匹配：

![基于向量方法的图表](./image-search-with-manticore/diagram-flow.png)

#### 使用Manticore设置基于向量的搜索

以下是逐步实施基于向量搜索的方法：

1. **设置多模态模型**  
   使用类似 TinyCLIP 的模型，这是 CLIP 的轻量级版本，用于为图像和文本生成嵌入。加载模型及其处理器：  
   ```python
   from transformers import CLIPProcessor, CLIPModel
   clip_model = CLIPModel.from_pretrained("wkcn/TinyCLIP-ViT-61M-32-Text-29M-LAION400M")
   clip_processor = CLIPProcessor.from_pretrained("wkcn/TinyCLIP-ViT-61M-32-Text-29M-LAION400M")
   ```
2. **创建数据库结构**  
   在 Manticore Search 中设置一个表来存储嵌入：  
   ```sql
   CREATE TABLE images (
     id bigint,
     image_path text,
     embeddings float_vector knn_type='hnsw' knn_dims='512' hnsw_similarity='COSINE'
   );
   ```
3. **生成并插入嵌入**  
   通过模型处理图像以创建嵌入并将其存储在数据库中。有关实现此步骤的指导，请参考 GitHub 上的 [load-dataset 脚本](https://github.com/manticoresoftware/manticore-image-search/blob/1d05e7efa2c4f3dc347bc3c2a543e38c1c7ff061/app/scripts/load-dataset)。虽然此脚本不适用于直接使用，但它作为创建嵌入并将其插入数据库的详细参考。   
4. **查询数据库**  
   ```php
   $embeddings = $Embed->getImageEmbeddings($image->getPath());
   $query = new Manticoresearch\Query\KnnQuery('embeddings', $embeddings, 10);
   $docs = $client->index('image')->search($query)->get();
   ```

#### 向量搜索的优势  
通过使用 Manticore 实现基于向量的图像搜索，您可以获得以下关键优势：  

- **语义理解**：根据查询和图像的含义进行匹配，而非精确关键词。  
- **视觉概念匹配**：准确捕捉复杂的视觉概念，并将其与文本描述对齐。  
- **自然语言兼容性**：轻松处理自然语言查询，实现直观搜索。  
- **增强的准确性**：即使对于抽象或细微的输入，也能提供最精确的结果。  
- **可扩展性**：减少人工操作，并能无缝处理大型数据集。  

## 对比方法  

以下是不同方法在实际场景中的表现：  

| 方法            | 描述                              | 准确性 | 设置复杂度 | 维护 | 查询速度 |  
|-----------------|-----------------------------------|--------|------------|------|----------|  
| 基于关键词      | 将用户查询与手动添加的标签或元数据匹配。简单但缺乏语义理解。 | 低     | 低         | 高   | 快       |  
| 基于分类        | 将图像组织到预定义的类别中，并允许结构化过滤。 | 中     | 中         | 高   | 快       |  
| 使用字幕        | 使用人工智能生成或手动创建的字幕，增强基于文本的搜索能力。 | 中     | 高         | 中   | 快       |  
| 基于向量        | 利用嵌入进行语义搜索，有意义地连接文本和图像。 | 高     | 高         | 低   | 中       |  

## 在 GitHub 上尝试演示  

好奇想看看所有内容如何整合？我们已开源了演示，您可以探索甚至构建自己的实现。访问 GitHub 仓库获取完整源代码：[Manticore 图像搜索演示](https://github.com/manticoresoftware/manticore-image-search/)。  

该仓库包含详细的说明和示例脚本，帮助您设置和自定义文本到图像的搜索应用程序。无论您是在实验演示还是计划构建生产就绪的解决方案，这都是一个很好的起点。  

## 结论  

使用 Manticore Search 的基于向量的文本到图像搜索相比传统方法具有显著优势。它提供：  

- 在匹配用户查询与相关图像方面的卓越准确性  
- 无需手动标记或字幕  
- 更好的语义关系理解  
- 对于不断增长的图像集合的可扩展性能  

虽然基于关键词或分类的方法在特定用例中可能有用，但基于向量的搜索代表了现代文本到图像搜索需求最先进的高效解决方案。  

尝试我们的演示：[image.manticoresearch.com](https://image.manticoresearch.com) 或深入 GitHub 上的源代码：[Manticore 图像搜索演示](https://github.com/manticoresoftware/manticore-image-search/)。  

![图像搜索演示](./image-search-with-manticore/text-to-image-search.png)
