4

我有一个 MySQL 表存储一些用户生成的内容。对于每条内容,我都有一个标题 (VARCHAR 255) 和一个描述 (TEXT) 列。

当用户查看记录时,我想根据标题/描述相似来查找与其“相似”的其他记录。

这样做的最佳方法是什么?我正在使用 PHP 和 MySQL。

我最初的想法是:

1)要么从标题和描述中去掉常用词,留下“唯一”关键字,然后找到共享这些关键字的其他记录。

例如,在句子:“Bob 早上 5 点醒来去上学”中,关键字将是:“Bob,wake, 5, going, school”。然后,如果有另一张唱片的标题谈到“鲍勃”和“学校”,它们将被视为“相似”。

2)或者使用MySQL的全文搜索,虽然我不知道这对这样的事情是否有好处?

这两种方法中哪种方法更好,或者还有另一种更好的方法?

4

3 回答 3

3

我会保持简短(可能太长了)...

我不会“手动”选择他们的关键字或修改您的原始数据。

MySQL 支持使用 MyISAM(不是 InnoDB)引擎进行全文搜索。查询数据库时可用选项的完整描述可在此处获得。查询可以根据查询方法自动去除数据集中常见的停用词和过于常见的词(超过 50% 的行包含它们)。查询扩展也可用,查询类型应根据您的需要决定。

还可以考虑使用像 Lucene 这样的单独引擎。使用 Lucene,您可能会拥有更多功能和更好的索引/搜索。例如,您可以自动删除常用词(它们得分低且不影响搜索)并将事物用作词干。有一点学习曲线,但我肯定会研究它。

编辑:

MySQL '全文自然语言搜索'返回最相似的行(及其相关性分数),而不是布尔匹配搜索。

于 2012-12-19T18:38:55.917 回答
1

您将首先定义相似对您意味着什么,以及您希望如何对两个不同文档之间的相似性进行评分。

使用该算法,您可以处理所有文档并构建相似度得分表。

根据评分算法的复杂性和数据集的大小,这可能不是实时运行的,而是通过 Hadoop 之类的东西进行批处理。

于 2012-12-19T18:28:22.610 回答
0

我做过这样的事情。我用 % 替换字符串中的所有空格,然后在 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 
于 2012-12-19T18:34:20.723 回答