TL;DR
我们很高兴地介绍Manticore Search中的两个新重要功能:模糊搜索和查询建议(或“自动完成”)。这些功能改善了搜索能力,提供了更友好的用户体验。您可以在我们的开源 GitHub问题搜索演示 中看到它们的实际效果。
介绍
您可能 已经阅读过 关于GitHub问题搜索演示以及我们如何 为其添加语义搜索 的内容。最近,我们为其添加了自动完成功能。这个过程非常简单,只需进行最小的更改。有关更多详细信息,请查看这篇文章: 新模糊搜索和自动完成 。今天,我们想分享两个进一步改善搜索体验的新功能:模糊搜索和查询建议(也称为“自动完成”):
- 模糊搜索帮助用户即使在有小错误的情况下也能找到结果。
- 查询建议在用户输入时建议相关短语,加快搜索过程。
这些功能不仅改善了我们 GitHub问题搜索工具 的可用性,还展示了Manticore Search在处理现实世界搜索场景中的高级能力,增强了用户界面并提供了更相关的结果。
实现模糊搜索
容错挑战
搜索工具的一个常见挫折是,当一个简单的拼写错误导致没有结果时。用户期望搜索引擎能够理解他们的意图,即使他们有小的拼写错误。在某些情况下,这可以通过使用语义搜索的上下文理解来解决,然而,对于传统的关键词搜索,模糊搜索是理想的解决方案。
使用CALL QSUGGEST的传统模糊匹配
历史上,Manticore Search通过其 <code>CALL QSUGGEST</code>和<code>CALL SUGGEST</code> 方法提供了对模糊匹配的内置支持。第一个方法允许您找到给定短语中的最后一个单词,使用Levenshtein距离实现一种容错搜索,但仅适用于最后一个单词。而后者仅适用于短语中的第一个单词。使用 Manticore PHP客户端 的示例:
$params = [
'index' => 'issue',
'body' => [
'query'=> 'fzzy',
'options' => [
'limit' => 10,
'max_edits' => 2,
],
],
];
$response = $client->suggest($params);
在这个代码片段中,客户端使用CALL SUGGEST函数为拼写错误的单词“fzzy”找到建议。max_edits参数控制输入单词与潜在建议之间允许的最大Levenshtein距离。Levenshtein距离是将一个单词更改为另一个单词所需的最小单字符编辑(插入、删除或替换)次数。通过将max_edits设置为2,我们允许最多2个字符的差异,使得在该编辑距离内找到拼写错误和相似单词成为可能。
虽然这种方法很强大,但由于您需要在应用程序中处理函数返回的所有建议,因此可能会有些复杂。此外,CALL QSUGGEST不处理键盘布局猜测(我们稍后会讨论)。为了使模糊搜索更友好且更易于集成,我们在Manticore Search中引入了一个新选项,允许使用特定参数进行模糊搜索,而无需额外的代码或自定义逻辑。
新的简化模糊匹配
现在,我们有了一个更简单的选项。通过在搜索查询选项中添加fuzzy=1,您可以轻松启用模糊搜索。
这是一个简单的示例:
$client = new Client();
$index = $client->index('issues');
$query = 'fzzy serch';
$result = $index->search($query)->option('fuzzy', 1)->get();
foreach ($result as $hit) {
echo $hit->getTitle() . "\n";
}
这段代码为拼写错误的“fzzy serch”启用模糊搜索,使Manticore能够找到“fuzzy search”。在我们的 Github搜索演示 中,它的效果如下:

您可以在 fuzzy search documentation 中阅读更多关于模糊匹配的内容。
实现查询建议(自动完成)
预测搜索的力量
查询建议或自动完成功能使搜索更快,并帮助用户发现他们可能没有想到的相关查询:
使用CALL KEYWORDS的传统自动完成
与CALL QSUGGEST相同,对于模糊匹配,Manticore Search历史上还有另一种方法CALL KEYWORDS,可用于自动完成功能。此方法允许您对表中的关键词执行前缀和中缀匹配,提供了一种简单而有效的实现自动完成功能的方法。不幸的是,它仅适用于严格的前缀/后缀匹配,没有容错能力,这意味着如果用户犯了错误,它将找不到任何关键词。以下是如何使用Manticore PHP客户端:
$index = 'myindex';
$query = 'pref*';
$response = $client->keywords($index, $query);
foreach ($response as $keyword) {
echo $keyword['normalized'] . ' (docs: ' . $keyword['docs'] . ', hits: ' . $keyword['hits'] . ")\n";
}
在这个示例中,我们使用CALL KEYWORDS方法查找myindex表中以pref开头的所有关键词。pref*末尾的星号(*)表示前缀匹配。您还可以通过在搜索词的两侧放置星号来使用中缀匹配,例如*some*。
虽然这种方法快速且简单,但缺乏模糊匹配的灵活性。您需要给定前缀或中缀的精确匹配,使其适用于需要精确关键词建议的情况。这就是新的自动完成方法的作用,以改善搜索体验。
新的自动完成方法
我们引入了一种新方法,该方法从多个输入词构建建议并支持拼写错误。此方法结合了 CALL KEYWORDS 和 CALL QSUGGEST 的功能。
例如,以下是如何在 PHP 客户端中使用新自动完成功能:
$client = new Client();
$result = $client->autocomplete([
'body' => [
'table' => 'issues',
'query' => 'hllo wor',
'options' => [
'fuzziness' => 1,
'layouts' => ['us', 'ru'],
],
],
]);
foreach ($result[0]['data'] as $suggestion) {
echo $suggestion . "\n";
}
此代码为输入 "hllo wor" 建议 "hello world",考虑了拼写错误和键盘布局问题。
内部实现方式如下:我们重用了模糊搜索中的模糊逻辑来创建相关建议。该方法使用低级的 CALL KEYWORDS 和 CALL QSUGGEST 功能从您的数据集中生成变体。
为了确保建议的准确性,我们根据单词长度和可用文档的数量评估距离。例如,如果用户输入 "hllo wor" 而您的数据中包含 "hello world",系统将由于其模糊性特征建议 "hello world"。这种方法帮助用户即使在拼写错误的情况下也能收到准确的建议。
您可以在 自动完成文档 中找到有关自动完成的更多信息。
键盘布局猜测
我们还添加了键盘布局猜测。如果您曾经在错误的布局下输入过,您会欣赏这个功能。Manticore 现在可以识别您意图的输入,即使在布局切换的情况下。
我们映射了常见的键盘布局,包括特定语言的布局和 QWERTY。现在,Manticore 可以确定您意图的输入,即使在发生布局错误时也能提高准确性。
好处包括:
- 提高多语言用户的搜索准确性
- 消除因意外布局切换而产生的挫败感
- 与我们的模糊搜索和自动完成功能无缝集成
将新功能应用于 GitHub 问题搜索演示
有了这些新功能,我们很高兴增强我们的 GitHub 问题搜索演示。由于 Manticore 的用户友好设计,集成模糊搜索和自动完成变得简单。
为了启用模糊搜索,我们只需在搜索查询中包含 这些行 :
$search->option('fuzzy', 1);
$search->option('layouts', ['ru', 'us', 'ua']);
对于查询建议,我们利用了 新的自动完成 功能:
$result = $client->autocomplete([
'body' => [
'table' => $table,
'query' => $query,
'options' => [
'fuzziness' => 1,
'layouts' => ['ru', 'ua', 'us'],
],
],
]);
这些增强显著改善了我们演示中的搜索功能,为用户提供了更精确的结果和有用的建议。
在 GitHub 问题搜索演示中的效果
使用 Manticore Search 集成自动完成和模糊搜索与键盘布局猜测改善了用户与搜索工具的互动。通过利用模糊性进行搜索并根据输入模式提供建议,用户可以快速找到相关结果。
以下是自动完成功能的操作方式,模仿流行的搜索建议界面:

此外,模糊搜索通过解决拼写错误等常见问题增强了用户互动。如果有人搜索某个产品但拼写错误,模糊搜索确保他们仍然收到相关结果。以下是在 GitHub 问题搜索演示中的效果:

结论
通过将 模糊搜索 和 查询建议 集成到 Manticore Search 中,我们大大增强了其功能。这些功能使搜索变得更加直观、宽容和高效。
我们鼓励您在我们的 GitHub 问题搜索演示 中尝试这些新功能并分享您的反馈。您的见解对我们继续完善和扩展 Manticore Search 的能力至关重要。
请关注更多更新,如果您觉得这个项目有用,请考虑给我们的 GitHub 仓库 点个星!
