Heim >Backend-Entwicklung >PHP-Tutorial >全文索索 - PHP 站内搜索,mysql 是否该加 FULLTEXT ,效率与LIKE相比如何

全文索索 - PHP 站内搜索,mysql 是否该加 FULLTEXT ,效率与LIKE相比如何

WBOY
WBOYOriginal
2016-06-06 20:31:261317Durchsuche

以往制作PHP 站内搜索都是使用的 where title like '%$kw%' OR content like '%$kw%' 这样模式,一直没用FULLTEXT,数据表是MYISAM的。
1)是否有必要使用 FULLTEXT,效率相比是否会提高? where match(title,content) against ('$kw')
2)对于数据表会有什么影响?增加存储空间?拖慢查询?


info 表会有 20万数据

title varchar(60) NOT NULL
content text NOT NULL

问题

刚刚发现Yii2 貌似不支持 fulltext? yii2 内建db 默认 使用PDO ,PDO支持fulltext 吗

回复内容:

以往制作PHP 站内搜索都是使用的 where title like '%$kw%' OR content like '%$kw%' 这样模式,一直没用FULLTEXT,数据表是MYISAM的。
1)是否有必要使用 FULLTEXT,效率相比是否会提高? where match(title,content) against ('$kw')
2)对于数据表会有什么影响?增加存储空间?拖慢查询?


info 表会有 20万数据

title varchar(60) NOT NULL
content text NOT NULL

问题

刚刚发现Yii2 貌似不支持 fulltext? yii2 内建db 默认 使用PDO ,PDO支持fulltext 吗

中文分词比英文复杂的多,
mysql 的FULLTEXT 貌似是不支持中文分词的,所以,你还是用sphinx,solr等引擎吧。

http://www.sqlite.org/fts3.html
SQLite官方测试中,50多万条数据用LIKE '%keyword%'模糊搜索耗时22.5秒,用MATCH 'keyword'全文搜索仅耗时0.03秒,比模糊搜索快749倍.

FULLTEXT能利用索引进行查询,速度肯定要比LIKE模糊搜索快得多.
MySQL5.6.4后的InnoDB支持中文全文检索.
https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html

比如要实现对自己博客的所有文章进行全文搜索:

<code>CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    article_fc TEXT,
    FULLTEXT idx (article_fc)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
</code>

插入文章时,对标题title和正文content这两个字段进行SCWS中文分词并用空格分隔后存入一个用于全文搜索的字段比如article_fc,该字段要求建立FullText全文索引.

用户搜索时,先用SCWS对输入进行分词比如获得关键词word1和word2,然后用MATCH AGAINST语句对进行全文搜索:

<code>SELECT * FROM articles WHERE MATCH(article_fc) AGAINST('word1 word2');
</code>

article_fc字段所在的表也可以和标题正文所在的文章表分开,查出后连接文章表读出标题正文即可.

SCWS是马明练hightman开发的一个PHP PECL中文分词扩展,提供有词典.如果不能安装PECL扩展,作者还提供了一个PHP实现的中文分词库PSCWS:
http://www.xunsearch.com/scws/

不想用数据库的FULLTEXT,可以试试SCWS作者马明练开发的开源中文搜索引擎XunSearch:
http://www.cloud-sun.com/view/product
【性能劲爆】XunSearch 单库最多支持 40 亿条数据,在 5 亿网页大约 1.5TB 的数据中检索时间不超过 1 秒(非缓存)。
【简单易用】前端是使用脚本语言 PHP 编写的开发工具包。API 简单清晰,开发难度极低,提供全中文的示例代码、文档、辅助脚本工具等。
【功能丰富】除支持基础的自定义分词、字段检索、布尔搜索外,还直接支持用户急需的相关搜索、拼音搜索、搜索建议等专业功能。

赞同楼上讲的,mysql就不适合干这种事。

sphinx、solr、lucene、elasticsearch 等

表加上全文索引后存储空间肯定是要增加的,而且也会影响插入速度,全文搜索还是不要用MYSQL了,加了fulltext后查询也不会很快。PHP可以考虑用solr吧,PHP有对应的扩展。

xunsearch吧。如果你觉得segment本身的搜索不错的话。

http://www.9958.pw/post/coreseek_sphinx 这个或许会有帮助

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn