zoukankan      html  css  js  c++  java
  • DQL2.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之间。

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

  • 相关阅读:
    Analyzing the Go runtime scheduler from source code perspective
    golang教材
    Kafka#4:存储设计 分布式设计 源码分析
    机器学习应该准备哪些数学预备知识?
    Why does deep learning work?
    Deep Reinforcement Learning
    How do I learn machine learning?
    What are some good books/papers for learning deep learning?
    why deep learning works
    AI 名校课程&书籍 需要学习
  • 原文地址:https://www.cnblogs.com/no-celery/p/15660463.html
Copyright © 2011-2022 走看看