【问题标题】:Mysql search 2 columns and order by more relevantMysql搜索2列并按更相关的顺序排列
【发布时间】:2017-11-07 07:14:43
【问题描述】:

我正在建立一个带有文章部分的网站,我正在寻找一种搜索功能,它将搜索文章标题和文章内容以查找包含所有搜索词的结果,然后返回包含搜索词单词的文章结果,例如如下例: 搜索词:“Facebook 调整 News Feed 以打击‘垃圾邮件’和误导性广告”。

理想的做法是返回与确切字词匹配的所有结果,然后按更相关的结果进行搜索,例如“Facebook 调整新闻提要”等。

以下是我目前做的代码:

"p.Title,p.ID,p.Publish_Date, p.Sponsored, p.Featured, p.Seo_Link, p.Content, 
                (SELECT GROUP_CONCAT(t.Tag_ID)
                FROM Tag_Post_Relationship t
                WHERE p.ID  =  t.Post_ID) AS Tags, 
                MATCH (Title, Content) AGAINST ('".$search_term."'IN BOOLEAN MODE) AS Relevance FROM Posts p WHERE NOT Post_Type = 'p'   AND Publish_Date < '{$dateNow}'   AND Visibility = 'p' AND
                (MATCH (p.Title, p.Content) AGAINST ('".$search_term."' IN BOOLEAN MODE))

                ORDER BY Relevance DESC"

【问题讨论】:

    标签: php mysql relevance


    【解决方案1】:

    要在 SQL 数据库中有效地执行此操作,您需要将模糊文本比较算法(例如 Levenshtein 距离)实现为您可以调用的函数或过程。这将允许您根据它们与您的搜索词的匹配程度来对您的文章进行排名。 SQL 中的 Levenshtein 距离示例如下:http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=66781

    您在请求搜索时执行的存储过程中使用该算法。存储的过程会将搜索词与每个标题和文章进行比较,并按最接近的匹配对结果进行排序,精确匹配为 1。

    在 SQL 之外,还有许多可用于 API 级别的高级文本分析包。我使用了 Python 的 Jellyfish 和 NLTK 库,效果很好。

    另一种选择是使用 Apache Solr (http://lucene.apache.org/solr/features.html) 或 Elastic Search 之类的东西,它提供了一个随时可用的 API,用于跨文档和数据的全文搜索。不过,这会增加架构的复杂性。

    【讨论】:

    • 谢谢,这个项目没有大预算,所以我正在寻找一个简单快速的SQL解决方案
    • 那么就需要模糊文本比较功能了。我发布的链接是一个不错的例子。请注意,大型数据集的性能可能会很差,因为函数非常复杂,而且 SQL 引擎通常没有针对大量部分文本搜索进行优化。
    猜你喜欢
    • 2010-09-25
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2012-11-09
    • 1970-01-01
    相关资源
    最近更新 更多