# Mastering Fuzzy Search with Manticore Search

A comprehensive guide to implementing intelligent fuzzy search with Manticore Search, covering essential concepts like Levenshtein distance and keyboard layout detection, with real-world examples for online stores and content platforms.

模糊搜索代表了一类技术，这些技术能够实现搜索查询与内容之间的智能匹配。在其核心，它关乎在搜索术语不完全匹配时仍能找到相关结果。虽然最常用于处理拼写错误和打字错误，但这项技术远不止简单的错误纠正——它可以解释模糊查询，理解非正式语言，处理部分单词，并识别可能不使用相同术语的相关概念。

本文中我们将探讨的模糊匹配技术，使Manticore Search能够实施智能匹配策略，确保全面检索结果。在此背景下，相关性成为一门细致的艺术，而非僵硬的科学。

## 理解搜索相关性

搜索的基础是精确文本匹配，即查询逐字与索引内容匹配。例如，搜索“laptop”只会返回包含该确切单词的记录，而不是相关术语如“notebook”或“computer”。

精确匹配在许多情况下非常有效。在数据结构良好的情况下，搜索“laptop”会显示所有包含该术语的相关记录，无论是在标题、描述还是分类中。通过增强的数据建模，搜索“laptop”甚至可以返回相关物品，如笔记本电脑配件或计算机服务。

然而，当记录中没有确切的术语，但内容仍然相关时会发生什么？同义词可以帮助解决这个问题。但如果有人搜索“notebook”却输入了“notebok”呢？没有模糊匹配，搜索将不会返回任何结果。

模糊匹配通过使搜索体验更加自然和宽容来增强搜索相关性。当有效实施时，它无缝地整合了原本可能被遗漏的相关项目。就像拼拼图一样，模糊搜索收集相似的碎片，帮助用户找到他们需要的物品。此外，由于用户在搜索过程中经常调整需求，模糊匹配会根据相似性提供选项，就像在选择完美餐点前品尝各种菜肴一样。

现代搜索引擎如Manticore Search、Elasticsearch和Algolia提供了复杂的模糊匹配功能，每种都有其独特的方法。让我们详细探讨Manticore的实现方式。

## 理解模糊搜索

### 什么是模糊搜索？

模糊搜索使非完全相同的单词之间能够匹配。它处理各种类型的输入变化，从简单的拼写错误到复杂的拼写错误。这项技术适应了快速打字、移动用户的输入挑战以及不同语言中的拼写复杂性。它对于匹配用户生成的内容特别有价值，这些内容通常包含拼写和术语的变化。该技术还可以结合语音匹配功能。

其他术语包括近似字符串匹配或模糊字符串匹配。

示例：

- 输入“helo”，找到包含“hello”的记录
- 输入“help”，找到包含help和hello的记录

请参阅更多示例以及Manticore中如何实现这些功能。

### 什么是模糊匹配？

模糊匹配将概念扩展到包括基于各种相似性的信息查找。我们将重点讨论基于语言的相似性，包括同义词、语法变化（复数、动词形式等）、基于词典的方法以及其他语言学或NLP技术。我们还将涵盖常见的搜索引擎功能，如部分单词匹配、短语匹配和过滤功能。

示例：

- 输入“pants”，找到pants、trousers、slacks（同义词）
- 输入“be”，找到Beatles、bees（前缀搜索）

请参阅更多示例以及Manticore中如何实现这些功能。

### 模糊逻辑的其他应用

模糊逻辑帮助根据共享特征对项目进行分类。例如，智能手机、平板电脑和笔记本电脑共享作为便携式计算设备的特征，但由于它们的触摸界面和移动操作系统，智能手机和平板电脑更为相关。

模糊逻辑基于相对相似性建立关系，而不是二元的真/假条件（对象基于两者都是“便携式”而不是具有相同的重量而匹配）。

## 在Manticore中使用Levenshtein距离实现模糊搜索

容错能力允许用户在输入时犯错但仍能找到相关结果。Manticore通过Levenshtein距离算法实现这一点。

### 什么是拼写错误？

- 缺失字符：“laptp” → “laptop”
- 多余字符：“laptopp” → “laptop”
- 错位字符：“lpatop” → “laptop”
- 错误字符：“laptip” → “laptop”

### Levenshtein距离算法

Manticore的容错能力使用基于距离的匹配，实现Levenshtein距离算法。距离衡量的是输入单词与索引中精确匹配之间的差异。具体来说，它表示将一个单词转换为另一个单词所需的最小操作数（添加、删除、替换或交换字符）。完美匹配的距离为0。当存在精确匹配或距离较小时（一个或两个字符差异），记录将包含在结果中。

例如，如果引擎接收到“laptp”，它可以匹配“laptop”（距离=1 / 缺少一个字符），或“laptps”（距离=2 / 需要两个操作）。

距离设置了一个容差阈值。在 Manticore 中，你可以使用 `distance` 参数进行配置，默认值为 2：差异为 3 或更多距离的词将被排除在结果之外。

### 使用 Levenshtein 距离的模糊搜索示例

以下是 Manticore 计算与 "iphone" 匹配所需操作的示例：

- iphone - 0 差异（精确匹配）
- iphon - 1 差异（删除：e）
- iphonee - 1 差异（添加：e）
- iphne - 1 差异（删除：o）
- iphonne - 1 差异（添加：n）
- iphne - 2 差异（删除：o，删除：e）
- iphonne - 2 差异（添加：n，添加：e）
- iphne - 3 差异（删除：o，删除：e，删除：n）- 超过默认阈值

### 结果排序与错误容忍度

关于相关性：所有基于拼写差异的模糊匹配都被视为比精确匹配的相关性更低。因此，距离为 0 的精确匹配记录的排名高于存在错误的记录。同样，存在 1 个错误的记录排名高于存在 2 个错误的记录。

## 键盘布局感知的模糊搜索

Manticore 模糊搜索的一个显著特点是其键盘布局感知功能。此功能理解用户可能使用不同的键盘布局进行输入，从而导致特定类型的错误。

例如，如果有人不小心使用了错误的键盘布局，Manticore 可以通过考虑不同布局中物理按键的位置来解释查询。Manticore 支持 17 种不同的键盘布局，包括 QWERTY、AZERTY、QWERTZ 等，使其高度适应国际应用。

例如，用户在美式键盘上输入 "yucker"，但系统将其解释为德式 QWERTZ 布局。Manticore 识别出不匹配并正确将输入映射为 "zucker"（德语中 "sugar" 的意思）。如果没有布局感知功能，搜索将因 Y/Z 键交换而失败。Manticore 确保即使键盘布局配置错误，用户也能找到结果。

## 在 Manticore 中设置模糊搜索

在 Manticore 中实现模糊搜索非常简单，支持 SQL 和 JSON API。

### 使用 SQL 语法

```sql
SELECT * FROM mytable 
WHERE MATCH('someting') 
OPTION fuzzy=1, layouts='us,ua', distance=2;
```

在此示例中：
- `fuzzy=1` 启用模糊匹配
- `layouts='us,ua'` 指定要考虑的键盘布局（美式和乌克兰式）
- `distance=2` 将最大 Levenshtein 距离设置为 2

### 使用 JSON API

```json
POST /search
{
  "table": "test",
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "*": "ghbdtn"
          }
        }
      ]
    }
  },
  "options": {
    "fuzzy": true,
    "layouts": ["us", "ru"],
    "distance": 2
  }
}
```

此 JSON 示例演示了 Manticore 如何处理跨布局的拼写错误——"ghbdtn" 在美式键盘上输入实际上会是 "привет"（俄语中 "hello" 的意思），如果在俄式键盘上输入。

## 其他模糊匹配技术

### 前缀搜索的局部词匹配

与其他高级搜索引擎一样，Manticore 支持前缀匹配，以实现实时搜索体验。它使引擎能够根据部分单词匹配记录。

例如，包含 "apricot" 的记录会在用户输入 "a"、"ap"、"apr" 时立即返回。无需等待完整单词匹配即可显示结果。

### 同义词

同义词告诉引擎哪些单词和表达式应视为等效——例如，pants = trousers。因此，搜索 "trousers" 会返回 "trousers" 和 "pants"，搜索 "pants" 也会返回 "trousers" 和 "pants"。

虽然基于通用词典的同义词扩展可能过于宽泛，但 Manticore 允许你使用 [wordforms](https://manual.manticoresearch.com/Creating_a_table/NLP_and_tokenization/Wordforms) 为你的数据集定义特定且上下文相关的同义词。

## 优化模糊搜索以获得最佳效果

尽管功能强大，但实现模糊搜索需要仔细考虑。它可能会返回太多结果或意外匹配，这可能会影响感知的相关性。

搜索引擎必须管理这种信息扩展。例如，通过优先显示精确匹配，确保它们出现在结果的顶部，高于模糊匹配：

- 对于拼写错误，精确匹配被认为比模糊匹配更相关（即使错误对用户来说很明显）。
- 对于同义词，精确匹配比同义词匹配更相关（即使查询词有多个含义，同义词可能更合适）。

Manticore 通过在精确匹配之后显示模糊匹配来管理这一点。这是 Manticore 处理搜索变体的全面方法的一部分。

还有许多 UI 模式可以管理这一点。例如，搜索引擎通常在搜索栏下方添加“建议的拼写”。或者它们提供自动完成或查询建议功能，当用户输入时，会以下拉列表的形式提供建议的查询（和类别），用户可以选择作为他们的查询。Manticore 提供了对这些功能的全面支持，如我们在 [Autocomplete API](https://manual.manticoresearch.com/Searching/Autocomplete) 中所述。

但理想的解决方案是隐藏在表面之下，对用户完全透明，其中搜索引擎返回的结果会给人一种直观的感觉，即显示的项目是最佳且最相关的——即使它们不完全匹配查询的文本。

## 实际应用

让我们看看 Manticore 的模糊搜索在现实场景中表现优异的例子：

### 电子商务

在电子商务中，用户经常搜索复杂名称或可能拼错的技术规格的产品。模糊搜索确保他们仍然能找到他们想要的东西：

```sql
SELECT * FROM products 
WHERE MATCH('sansung glaxy') 
OPTION fuzzy=1, distance=2;
```

此查询将成功匹配包含 "Samsung Galaxy" 的产品，即使存在拼写错误。

### 内容管理

对于内容密集型网站，模糊搜索帮助用户即使忘记术语或标题也能发现相关文章：

```sql
SELECT * FROM articles 
WHERE MATCH('artifical inteligence') 
OPTION fuzzy=1;
```

这将匹配关于 "artificial intelligence" 的文章，即使存在拼写错误。

### 国际网站

对于服务多语言受众的网站，键盘布局感知功能特别有价值：

```sql
SELECT * FROM content 
WHERE MATCH('ghdbtn') 
OPTION fuzzy=1, layouts='us,ru';
```

这将匹配包含 "привет"（俄语中 "hello"）的内容，当用户不小心使用错误的键盘布局输入时。

## 结论

模糊搜索不再是可选功能 - 它对于现代搜索实现来说至关重要。Manticore Search 提供了复杂但易于使用的模糊搜索功能，可以显著提升用户体验，同时适应人类生成查询中的自然变化。

通过利用 Manticore 的莱文斯坦距离算法和独特的键盘布局感知功能，您可以创建让用户感觉近乎神奇的搜索体验。即使用户没有完全正确地输入查询，他们也能找到所需内容。

无论您是在构建电子商务平台、内容管理系统，还是任何具有搜索功能的应用程序，使用 Manticore 实现模糊搜索都可以带来更高的用户满意度、更好的参与度，最终提高转化率。

## 其他资源

- [Manticore Search 文档](https://manticoresearch.com/docs)
- [模糊搜索 API 参考](https://manticoresearch.com/docs/latest/Searching/Full_text_matching/Basic_usage/#fuzzy)
- [关于模糊搜索和自动补全的博客文章](https://manticoresearch.com/blog/new-fuzzy-search-and-autocomplete/)
