[英]How to find 'similar' records in a MySQL table based on 'title' and 'description' columns?
我有一個MySQL表存儲一些用戶生成的內容。 對於每個內容,我有一個標題(VARCHAR 255)和一個描述(TEXT)列。
當用戶正在查看記錄時,我希望根據類似的標題/描述找到與其“相似”的其他記錄。
這樣做的最佳方法是什么? 我正在使用PHP和MySQL。
我最初的想法是:
1)從標題和描述中刪除常用單詞以留下“唯一”關鍵字,然后找到共享這些關鍵字的其他記錄。
例如,在句子中:“鮑勃在早上5點醒來並上學”,關鍵詞將是:“鮑勃,醒來,5,去,學校”。 然后,如果有另一條記錄的標題是“bob”和“school”,它們將被視為“相似”。
2)或者使用MySQL的全文搜索,雖然我不知道這對於這樣的事情是否有用?
兩種方法哪種方法會更好,還是有另一種方法更好?
我會保持這么短(可能太長了)......
我不會選擇“手動”關鍵字或修改原始數據。
MySQL支持使用MyISAM(不是InnoDB)引擎進行全文搜索。 此處提供了查詢數據庫時可用選項的完整說明。 查詢可以自動刪除數據集中常見的停用詞和單詞(超過50%的行包含它們),具體取決於查詢方法。 查詢擴展也可用,查詢類型應根據您的需要決定。
考慮使用像Lucene這樣的獨立引擎。 使用Lucene,您可能會有更多功能和更好的索引/搜索。 您可以自動刪除常用詞(它們獲得低分並且不影響搜索)並將事物用作詞干。 有一點學習曲線,但我肯定會研究它。
編輯:
MySQL的全文自然語言搜索 '返回最相似的行(及其相關性得分),而不是布爾匹配搜索。
您首先要定義類似的含義,以及如何對兩個不同文檔之間的相似性進行評分。
使用該算法,您可以處理所有文檔並構建相似性分數表。
根據您的評分算法的復雜性和數據集的大小,這可能不是您實時運行的,而是通過Hadoop之類的東西批量處理。
我做過這樣的事情。 我用%替換字符串中的所有空格,然后在where子句中使用LIKE。 在這里,我會給你我的代碼。 它來自MSSQL,但可以對MySQL進行微調。 希望能幫助到你。
CREATE FUNCTION [dbo].[fss_MakeTextSearchable] (@text NVARCHAR(MAX)) RETURNS NVARCHAR(MAX)
--replaces spaces with wildcard characters to return more matches in a LIKE condition
-- for example:
-- @text = 'my file' will return '%my%file%'
-- SELECT WHERE 'my project files' like @text would return true
AS
BEGIN
DECLARE @searchableText NVARCHAR(MAX)
SELECT @searchableText = '%' + replace(@text, ' ', '%') + '%'
RETURN @searchableText
END
然后使用這樣的函數:
SELECT @searchString = dbo.fss_MakeTextSearchable(@String)
然后在您的查詢中:
Select * from Table where title LIKE @searchString
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.