Mysql搜索2列和顺序更相关

时间:2017-06-06 10:09:18

标签: php mysql relevance

我正在构建一个带有文章部分的网站,我正在寻找一个搜索功能,它将搜索包含所有搜索词的结果的文章标题和文章内容,然后将返回包含搜索词词汇的文章结果如下例所示: 搜索字词:“Facebook调整新闻Feed以限制'垃圾邮件'和误导性广告”。

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

以下是我到目前为止所做的代码:

"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"

1 个答案:

答案 0 :(得分:0)

要在SQL数据库中有效地执行此操作,您需要实现模糊文本比较算法,例如Levenshtein距离作为函数或可调用的proc。这样,您就可以根据文章与搜索字词的匹配程度对文章进行排名。 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,用于跨文档和数据进行全文搜索。这会增加您的架构的复杂性。