【问题标题】:Search first and last names, order by accuracy of match搜索名字和姓氏,按匹配准确度排序
【发布时间】:2012-10-30 23:04:54
【问题描述】:

我正在尝试在我的网站(它是一个社交网站)上构建一个简单的搜索,我想搜索在该网站上注册的所有用户,并返回一个建议列表(这就是这个查询的目的,建议列表)。

我要搜索的表具有以下列:userIDfnamelname

我想搜索最后 2 列(2 个名称),并按照与搜索词匹配的名称的多少顺序返回它们。

我要运行的查询的第一部分是:

SELECT userID, fname, lname FROM names WHERE

但其余的,我需要帮助。

编辑: 使用此查询进行搜索:

SELECT userID, fname, lname FROM names WHERE fname LIKE '%".$term."%' OR lname LIKE '%".$term."%'

我如何订购它,以便结果按匹配开始的那些排序,所以当我输入 M 它返回说,Markadam 之前

【问题讨论】:

    标签: php mysql search sql-like


    【解决方案1】:

    类似的东西:

    where fname like '%' + @searchterm + '%' or lname like '%' + @searchterm + '%'
    

    【讨论】:

    • 嗯,是的,这将是它的第一部分,但我不完全确定如何做的主要事情是按匹配百分比对这些结果进行排序。例如,如果搜索词是Steve 并且有stevesteven,我希望stevesteven 之前返回
    • 如果您查看我编辑过的问题,那将显示更多我想要完成的工作。
    【解决方案2】:

    您应该考虑使用full text 搜索名称。全文搜索将允许您考虑匹配中的相似性。

    【讨论】:

      【解决方案3】:

      您可以在查询语句的末尾执行 ORDER BY fname ASC(假设该语法适用于您的 DB 语句,它看起来像某种 SQL,所以应该有类似的东西)。这将按字母顺序对名称进行排序,因此 Steve 会出现在 Steven 之前(因为缺少“n”)。我也猜想如果你想根据第一个字母或前几个字母找到一些东西,可能有一个等价物,你可以使用 M* 并且星号将是你的通配符。希望对您有所帮助!

      【讨论】:

        【解决方案4】:

        你可以试试

        SELECT userID, fname, lname,
        myRank = CASE WHEN fname = @term THEN 4 
        WHEN fname like @term + '%' THEN 3
        WHEN fname like '%' + @term + '%' THEN 2
        ELSE.... whatever ranking you want
        FROM names 
        WHERE fname LIKE '%' + @term + '%' 
           OR lname LIKE '%' + @term + '%'
        ORDER BY myRank DESC
        

        【讨论】:

          【解决方案5】:

          我最近遇到了类似的问题并使用了Similarity function provided by the Microsoft Master Data Services。从那里开始,我实现了一个基于单词的trigram function。我的实现会将“海绵宝宝”与“鲍勃,海绵宝宝”相匹配。

          如果您没有 Visual Studio(创建 sql-server 中使用的程序集所必需的),您还可以使用本机 T-SQL 实现所需的功能(即模糊字符串匹配)。一个不错的工具包可以找到here

          更新: 注意:相似性字符串匹配在增量搜索中效果不佳,即“M”与“Mark”不匹配。您将不得不使用其他尝试,可能是模糊字符串匹配和分类为“开始于”、“包含”等的组合。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-09-02
            • 2013-05-22
            • 1970-01-01
            • 1970-01-01
            • 2011-08-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多