【问题标题】:Efficient MySQL text search高效的 MySQL 文本搜索
【发布时间】:2015-08-14 06:26:57
【问题描述】:

我有一个使用 MySQL 用 PHP 编写的论坛,我想让论坛搜索可用。它将允许用户搜索特定的字符串,以及过滤发布日期和主题等元数据。可以有效地搜索元数据,因为这些字段中的大多数都已编入索引,但我认为主要用例当然是普通的文本搜索,并且不使用可能修剪结果的元数据过滤器。

经过一些测试,我发现,与大多数人的设置相反,SQL_CALC_FOUND_ROWS 比查询两次以获得结果数量要快得多(大约 1.5 倍),所以我最好的查询是:

SQL_CALC_FOUND_ROWS * from blahblah where content like '%term%' limit whatever whatever;

不出所料,这确实很慢,因为它必须对数据库中的每个论坛帖子进行文本匹配。我能做些什么来改善这一点吗?使用 LIKE 运算符时,在内容 (TEXT) 字段上放置索引是否会有所帮助?一般人是怎么做到的?

【问题讨论】:

标签: php mysql search sql-like


【解决方案1】:

即使使用 like 运算符,列上的索引也会有所帮助,但如果您在开头也有通配符,则不会。因此,对于term%,索引将是有益的,但对于%term%,它不会。

但是,您可以查看FULLTEXT 索引。如果您将这样的索引添加到 TEXT 字段,MySQL 会为单独的单词编制索引,并允许您进行各种类似搜索引擎的搜索。要搜索,请使用 MATCH() ... AGAINST 而不是 LIKE

查看文档: https://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

免责声明:我建议您在第一次实验后仔细阅读文档。 FULLTEXT 索引功能强大,但仍有其局限性。

FULLTEXT 索引占用了相当多的空间,它们的构建方式取决于 MySQL 中的核心设置,因此它们在本地设置和服务器之间的行为可能会有所不同。

例如,它们会索引完整的单词,但会忽略非常短的单词和某些停用词。此外,由于它们对单词进行索引,您将无法搜索部分单词。寻找 'term' 不会找到开箱即用的 'determine'。

因此,请确保这些索引可以执行您想要的操作,如果您有共享主机,请确保它们可以按照您喜欢的方式进行配置和调整,然后再进行大型实施。

【讨论】:

  • 啊,谢谢,我以前没见过这个 :) 我只是想一定有比LIKE '%term%' 更好的东西。
猜你喜欢
  • 2015-07-20
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2012-10-05
相关资源
最近更新 更多