簡體   English   中英

如何根據'title'和'description'列在MySQL表中找到“相似”記錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM