【问题标题】:Is Full Text search the answer?全文搜索是答案吗?
【发布时间】:2010-10-11 11:47:14
【问题描述】:

好的,我有一个类似这样的 mySQL 数据库

ID - 一个 int 和记录的唯一 ID

标题 - 项目名称

描述 - 项目描述

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

SELECT * From ‘item’ where title LIKE %key%

这很有效,因为数据库中没有太多内容,但是搜索“this key”没有找到“this that key”我想改进网站的搜索引擎,甚至可能添加一些对它的排名系统(但这需要很长时间)。

所以对于这个问题,我听说过一种叫做“全文搜索”的东西(据我所知)它是数据库设计的主要内容,但作为这个主题的新手,我对此一无所知,所以......

1) 你觉得有用吗?

还有一个额外的探索者……

2) 我能读到哪些关于数据库设计/搜索引擎设计的信息,这些信息可以为我指明正确的方向。

如果相关的话,该网站目前是用纯 PHP 编写的(即没有框架的 I.E)(我想到了将其转换为 Ruby on Rails)

更新

谢谢大家,我会去全文搜索。 对于后来发现这个的任何人,我在全文搜索中也找到了一个很好的tutorial

【问题讨论】:

    标签: php mysql search


    【解决方案1】:

    '%keyword%' 类型搜索的问题在于,即使您在该列上创建索引,也无法在常规表中有效地搜索它。想想你会如何看待电话簿中的那根绳子。实际上没有办法优化它——你必须扫描整个电话簿——这就是 MySQL 所做的,全表扫描。

    如果您将该搜索更改为“关键字%”并使用索引,您可以获得非常快速的搜索。不过,听起来这不是您想要的。

    因此,考虑到这一点,我已经使用了相当多的全文索引/搜索,这里有一些优点和缺点:

    优点

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

    缺点

    • 仅适用于 MyISAM 表
    • 太短的单词会被忽略(默认最少为 4 个字母)
    • 在 where 子句中需要不同的 SQL,因此您需要修改现有查询。
    • 不匹配部分字符串(例如,'word' 不匹配'keyword',只匹配'word')

    Here is some good documentation on full-text searching.

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

    【讨论】:

    • 谢谢,我很想使用 Sphinx 之类的东西,但老实说,除非需要花费大量时间,否则我宁愿自己构建它,因为我了解它是如何工作的。
    • 我们即将在我们的一个应用程序中实现 sphinx。我们对大量数据进行了大量搜索。我们使用了全文搜索一段时间,但需要转移到 innodb 进行交易。但是,全文很容易实现,而且速度非常快。
    【解决方案2】:

    您也可以考虑 Zend_Lucene。它比 Sphinx 更容易集成,因为它是纯 PHP。

    【讨论】:

    • 不建议这样做,因为它很慢
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      相关资源
      最近更新 更多