DQL-2.7.开始使用Dgraph-模糊搜索

翻译自:这里

在之前的教程中,我们通过建模tweet作为示例,学习了如何在Dgraph中构建高级文本搜索。我们使用全文索引和trigram索引查询tweet,并在tweet上实现全文和正则表达式搜索。

在本教程中,我们将继续探索Dgraph的字符串查询功能,使用第5和第6教程中的twitter模型。特别是,我们将使用Dgraph的模糊搜索功能实现twitter用户名搜索特性。

在我们深入之前,让我们回顾一下我们如何在前两个教程中建模tweets:

模糊查询

为产品或用户名提供搜索功能需要搜索与字符串最接近的匹配项,如果不存在完全匹配项。这个特性可以帮助您获得相关的结果,即使出现了拼写错误或者用户没有根据存储的确切名称进行搜索。这正是模糊搜索所做的:它比较字符串值并返回最接近的匹配。因此,它非常适合我们在twitter用户名上实现搜索的用例。

模糊搜索的功能基于Dgraph中存储的用户名值与搜索字符串之间的Levenshtein距离。

Levenshtein距离是一个度量标准,它定义了两个字符串的距离。两个单词之间的Levenshtein距离是将一个单词更改为另一个单词所需的最小单字符编辑次数(插入、删除或替换)。

例如,字符串book和back之间的Levenshtein距离为2。值2是合理的,因为通过更改两个字符,我们将单词book更改为back。

现在您已经理解了什么是模糊搜索以及它可以做什么。接下来,让我们学习如何在Dgraph中的字符串谓词上使用它。

在Dgraph中实现模糊搜索

要在Dgraph中对字符串谓词使用模糊搜索,首先要设置三元组索引trigram。转到Schema选项卡并在user_name谓词上设置三元组合索引。

在user_name谓词上设置了trigram索引之后,您可以使用Dgraph的内置函数match来运行模糊搜索查询。

下面是match函数的语法:match(predicate, search string, distance)

match函数有三个参数:

  • 用于查询的字符串谓词的名称。
  • 用户提供的搜索字符串
  • 表示前两个参数之间的最大Levenshtein距离的整数。这个值应该大于0。例如,当整数为8时,返回距离值小于或等于8的谓词。

为distance参数使用更大的值可能匹配更多的字符串谓词,但它也会产生不太准确的结果。

在使用match函数之前,让我们首先获取存储在数据库中的用户名列表。

{
    names(func: has(user_name)) {
        user_name
    }
}

从结果中可以看到,我们有四个用户名:Gopherpalooza、Karthic Rao、Francesc Campoy和Dgraph Labs。

首先,我们将Levenshtein Distance参数设置为3。我们希望看到Dgraph返回距离所提供的搜索字符串3个或更少距离的所有用户名谓词。

然后,我们将第二个参数,即用户提供的搜索字符串,设置为graphLabs。

转到查询选项卡,将查询粘贴到下面并单击Run。

{
    user_names_Search(func: match(user_name, "graphLabs", 3)) {
        user_name
    }
}

我们得到了肯定的匹配!因为搜索字符串graphLabs与Dgraph Labs的谓词值的距离为2,所以我们在搜索结果中看到它。

让我们再次运行上面的查询,但这一次我们将使用搜索字符串graphLab。转到查询选项卡,将查询粘贴到下面并单击Run。

{
    user_names_Search(func: match(user_name, "graphLab", 3)) {
        user_name
    }
}

我们仍然与user_name谓词的值Dgraph Labs!这是因为搜索字符串graphLab与Dgraph Labs的谓词值的距离为3,所以我们可以在搜索结果中看到它。

在本例中,搜索字符串graphLab和谓词Dgraph Labs之间的Levenshtein距离为3,因此匹配。

对于查询的最后一次运行,让我们将搜索字符串更改为Dgraph,但将Levenshtein Distance保持在3。

{
    user_names_Search(func: match(user_name, "Dgraph", 3)) {
        user_name
    }
}

现在你不会再看到Dgraph Labs出现在搜索结果中,因为单词Dgraph和Dgraph Labs之间的距离大于3。但是根据正常的人类原理,当使用Dgraph作为搜索字符串时,您自然会期望Dgraph Labs出现在搜索结果中。

这是基于Levenshtein距离算法的模糊搜索的缺点之一。模糊搜索的有效性随着距离参数值的减小而降低,并且随着字符串谓词中包含的单词数量的增加而降低。

因此,不建议对可能包含很多单词的字符串谓词使用模糊搜索,例如,存储博客文章、生物、产品描述等值的谓词。因此,使用模糊搜索的理想候选谓词是名称、邮政编码、地点等谓词,其中字符串谓词中的单词数量通常在1-3之间。

同时,根据用例,距离参数的调整对模糊搜索的有效性至关重要。

posted @ 2021-12-08 11:06  KILLNPE  阅读(236)  评论(0编辑  收藏  举报