4

我正在使用 MySQL 和 PHP 为我的网站创建一个简单的搜索功能。现在,如果在搜索栏中输入单词“cat”,我将无法检索带有单词“cats”的文章,反之亦然。结尾的“ed”也是如此。

我能想到的解决此问题的唯一方法是从每个长度超过一定长度的单词的末尾删除所有“s”和“ed”(以避免将“Ted”变成“T”等) . 然而,这个简单的解决方案远非完美。我希望有人可以为我提供更好的解决方案。

4

7 回答 7

9

您所指的技术称为词干提取。由于对语言的影响很大,这在应用程序级别很难自己处理。如果您不想处理这个问题,您可以让 MySQL 为您完成繁重的工作,具体取决于您正在运行的 MySQL 版本。如果您使用的是 5.6.4 或更高版本,则它内置于 MyISAM 表和 InnoDB 表的全文搜索机制中。在 5.5 到 5.6.3 版本中,它是为 MyISAM 而不是 InnoDB 表内置的。对于 5.1 版,mnoGoSearch提供了一个插件。在 5.1 之前,我认为您需要在应用程序级别处理它,但我尚未确认。

这些链接可能会帮助您入门。

请注意停用词列表,它是在处理查询时在搜索文本中被忽略的非常常见且通常很短的词的列表。如果停用词列表阻止您获得预期结果,则有一些设置可以控制停用词列表。您可能希望将最小字长设置为 2 或 3(默认为 4)并删除默认列表中的许多字。

如果您确实想自己或使用 PHP 处理词干提取,Martin Porter 对 Porter Stemming Algorithm 进行了详细的技术讨论,并且至少有两种 PHP 实现可用,Jon Abernathy 的 PHP4 中的一个较旧的实现可能有一些缺陷以及由 Richard Heyes 编写的 PHP5 中的较新版本

我假设您主要关心英语,但我相信其他语言也有一些支持。

正如rnmccall 所提到的,如果您需要更高级的搜索功能,您可能需要使用 Sphinx 或 Apache Lucene。

于 2012-07-17T01:27:34.620 回答
3

问题中描述的删除后缀的策略通常称为词干提取。如果您仍然对采用该策略感兴趣,您应该查看http://tartarus.org/~martin/PorterStemmer/以了解词干提取的背景。该页面还具有 Porter 词干分析器的 PHP 实现和更现代算法的链接。

这种词干搜索方法由Sphinx使用,它用于pydoc等。

词干提取方法的主要好处是它简单明了并且可以轻量级。

但是,如果您想要更复杂的搜索功能,您可能应该使用Apache Lucene 之类的东西。

于 2012-07-23T04:17:09.103 回答
1

我建议使用 Lucene。由于您没有运行复杂的查询 - 只需查找索引,因此它还会减少您的数据库压力。您还可以使用 Lucene 运行模糊搜索。

于 2012-07-25T17:24:11.473 回答
0

可能的解决方案:

1.最简单的实现 -> 使用 %operator

像%cats%

2.使用 solr 进行快速实施,因为那里实施了最佳算法。

注意:您也可以将结果缓存在缓存中

于 2012-07-27T18:39:36.937 回答
0

没有任何意思ed或任何你想删除的东西。因为您正在从一个段落中搜索一个字符串,所以您需要提供一个特定的关键字来进行搜索。该关键字可以是完整的字符串(单词),也可以是子字符串(单词的一部分)。

例子:-

你在一个black洞里。

现在您想black通过提供bla搜索字符串进行搜索。然后查询如下:-

SELECT * FROM TABLE_NAME WHERE YOUR_FIELD_NAME LIKE '%BLA%'

使用上面的查询与您的内容完全匹配。您可以提供您想要搜索的段落/段落中的任何子字符串。

希望它会帮助你。

于 2012-07-23T09:14:57.077 回答
0

你可以简单地使用

SELECT * FROM topics WHERE Title LIKE '%cat%'

在查询中搜索标题为猫和猫的主题。如果要从大文本内容中搜索数据,可以使用 FullTextSearch。在这种情况下,您只能使用 MyISAM 表。您可以在此处阅读全文搜索文档

于 2012-07-23T07:26:18.713 回答
0

一个简单的查询将是:

    select * from table where item like '%name%'

为了避免 t 和 ted 的事情,使用该substr()函数并将字符串设置为通用大小,然后将该字符串放在 where 子句中。

于 2012-07-23T19:28:39.297 回答