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搜索演示 中,它是这样的:
您可以在 模糊搜索文档 中阅读更多关于模糊匹配的内容。
实现查询建议(自动完成)
预测搜索的力量
查询建议或自动完成功能使搜索更快,并帮助用户发现他们可能未曾想到的相关查询:
使用 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 仓库 一个星星!