2009-03-05 44 views
9

好,我有一个MySQL数据库,看起来像这样全文搜索答案?

ID - 一个int和记录

标题的唯一ID - 项

说明的名字 - 商品描述

我想搜索关键词的标题和描述,目前我正在使用。

SELECT * FROM“项目”,其中标题LIKE%键%

而这个工作和有数据库中的并不多,然而,如搜索“这个关键的”未找到“这是关键“我想改善网站的搜索引擎,甚至可能会添加某种排名系统(但这是相当长的时间)。所以对于这个问题,我听说过一个叫做“全文搜索”的东西(据我所知)是一个数据库设计的主要部分,但作为这个主题的一个新词,我对此一无所知...

1)你认为这会有用吗?

和一个额外的questron ...

2)我读什么可以了解数据库设计/搜索引擎的设计,将点我在正确的方向。

如果是相关的网站目前写成挺直PHP(即没有框架)(救援人员到场将其转换为Ruby on Rails的思想已经跨越了我的心)

更新

谢谢所有,我会去全文搜索。 对于任何一个后来发现,我发现一个好的tutorial全文搜索以及。

回答

9

'%keyword%'类型搜索的问题是,即使您在该列上创建索引,也无法在常规表中高效地搜索它。考虑一下你会如何看待电话簿中的字符串。实际上没有办法优化它 - 你必须扫描整个电话簿 - 这就是MySQL所做的,全表扫描。

如果您将该搜索更改为'keyword%'并使用索引,则可以获得非常快的搜索。这听起来像这不是你想要的,但。

考虑到这一点

所以,我已经使用全文索引/搜索了不少,而且这里有几个优点和缺点:

优点

  • 非常快
  • 返回结果按相关性排序(默认情况下,尽管您可以使用任何分类)
  • 可以使用停用词。

缺点

  • MyISAM表只适用
  • 字太短会被忽略(默认最小为4个字母)
  • 需要where子句中不同的SQL,所以你会需要修改现有的查询。
  • 不匹配的部分字符串(例如, '字' 不匹配 '关键字',只有 '字')

Here is some good documentation on full-text searching

另一种选择是使用搜索系统,如Sphinx。它可以非常快速和灵活。它针对搜索进行了优化,并与MySQL完美集成。

+0

谢谢,我谨慎使用类似狮身人面像的东西,但说实话,除非需要花费大量时间,否则我宁愿自己构建它,这样我就能理解它是如何工作的。 – 2009-03-05 11:40:23

+0

我们正在接近在我们的一个应用程序中实现sphinx。我们对大量数据进行了大量搜索。我们使用全文搜索一段时间,但需要迁移到innodb进行交易。但是,全文很容易实现,速度非常快。 – jonstjohn 2009-03-05 11:44:26

1

你也可以考虑Zend_Lucene。它比Sphinx整合要容易一些,因为它是纯粹的PHP。

2

我猜想MySQL全文足以满足您的需求,但值得注意的是内置支持不能很好地扩展。对于平均尺寸的文件,它开始变得无法用于小至几十万行的表格尺寸。如果你认为这可能会进一步成为问题,那么你应该已经看过狮身人面像。它已经成为MYSQL用户的事实标准,尽管我个人更喜欢使用java lucene实现我自己的解决方案。 :)

另外,我想提一下,全文搜索与标准LIKE'%keyword%' - 搜索有根本的区别。与LIKE搜索全文索引不同,您可以搜索几个不必紧挨着出现的关键字。例如,谷歌等标准搜索引擎就是全文搜索引擎。