PHP+MYSQL实现全文检索及全文检索工具

使用分词类库,分词类库请参见:http://www.xunsearch.com/scws/

如何使用PHP实现全文检索功能?

很多人可能马上可以想出几种方案,比如:文件检索法、采用SQL的like语句等方法,但这些方法效率都相当的低。

这里介绍一种比较高效的PHP全文检索实现方法,这就是采用MYSQL的FULLTEXT字段类型。但是MYSQL的FULLTEXT字段对中文的支持不是很好,本文也一并介绍如何通过PHP+MYSQL实现中文全文检索功能。

首先需要用到一个PHP中文分词扩展模块——SCWS,关于这个模块的安装和使用大家可以到www.ftphp.com/scws去查找相关内容(如有问题请留言)。

然后再看看mysql的fulltext字段类型的相关信息:

MySQL3.23.23之后的版本开始支持全文索引和搜索。全文索引在 MySQL 中是一个 FULLTEXT 类型索引。

FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。

MYSQL全文搜索通过 MATCH() 函数完成。

下面举一简单例子:

1、新建数据表:

CREATE TABLE fulltext_sample(copy TEXT,FULLTEXT(copy)) TYPE=MyISAM;

这里的copy就是一个fulltext类型的字段,如果建表的时候没有添加全文检索字段,也可以通过alert来添加,如:

ALTER TABLE fulltext_sample ADD FULLTEXT(copy)

2、插入数据:

INSERT INTO fulltext_sample VALUES

(‘It appears good from here‘),

(‘The here and the past‘),

(‘Why are we hear‘),

(‘An all-out alert‘),

(‘All you need is love‘),

(‘A good alert‘);

3、数据检索:

SELECT * FROM fulltext_sample WHERE MATCH(copy) AGAINST(‘love‘);

上面就是mysql的全文检索功能,注意:在全文索引上进行搜索是不区分大小写的。

下面再看如何实现中文全文检索。

fulltext字段是以词语为单位,词语之间需要用空格隔开,而汉语的句子中各个词语之间并不会用空格隔开,因此我们需要对中文进行分词,这也就是为什么上面需要强词用到中文分词扩展模块。

但是尽管对中文进行分词,MYSQL还是不能通过MATCH来实现中文的全文检索,这需要通过一定的方法来进行转换,一个比较简单实用的方法是采用下面这个函数(当然还有更好的),它将中文进行了urlencode转换。

function q_encode($str)

{

$data = array_filter(explode(" ",$str));

$data = array_flip(array_flip($data));

foreach ($data as $ss) {

if (strlen($ss)>1 )

$data_code .= str_replace("%","",urlencode($ss)) . " ";

}

$data_code = trim($data_code);

return $data_code;

}

将转换过后的内容保存至事先定义好的fulltext字段。同样,在查询的时候也需要将查询的关键词进行同样方法的转换。

PHP+Mysql实现UTF8全文搜索的方法

本文讲解一下如何在海量的数据中能够快速的进行全文检索呢?MySQL提供了一个全文索引功能,也就是把字段设置上FULLTEXT索引属性,然后通过SELECT的MATCH AGAINST语句进行查找。

我们开发的一个纯英文站点TouchUs - The Global Yellow Pages & Business Directory(www.touchus.org)就是利用MySQL的这一功能,实现了对十多万条数据的平均全文检索时间小于0.5秒。但是在开发TouchUs的中文网站——城市黄页网时(www.city39.cn),碰到了新的问题。原来英文排版时词和词之间是通过空格区分的,FULLText可以完全支持,但是对中文或者是东亚文字就没有这么简单了,因为中文的词和词之间并没有明显的分隔,所以MySQL不支持中文字符的全文检索。

如何让MySQL也能支持中文的全文检索呢?偶然间产生了一个思路,那就是能不能在中文分词后,通过对中文进行编码转化成英文字符,这样就在中英文间建立一个特定的联系,然后再进行全文检索,这样不就实现了中文的全文索引了吗?经过试验,答案是肯定的。下面是在城市黄页网中实现的具体过程:

1. 建立一个单独的索引表,比如对应members表,我们建立一个members_index表。

用户信息表(members)                    用户信息全文索引表(members_index)

User_id                                              user_id

User_name                                       index_intro

User_introduction

在members_index表的index_intro中加入fulltext索引。

2. 对用户信息表(members)的User_introduction字段内容进行中文分词处理

中文分词的处理过程,可以参考简易中文分词系统http://www.ftphp.com/scws/,在城市黄页网中,我们采用了scws的PHP扩展模块方式来实现中文分词。scws的php扩展模块安装非常简单,只需简单编译配置后即可使用。在具体的php代码中,我们写了如下的函数来实现分词后将分词结果用空格进行连接。

//中文分词函数

function str_fc($str) {

$so = scws_new();

$so->set_charset(‘utf8‘);

// 这里没有调用 set_dict 和 set_rule 系统会自动试调用 ini 中指定路径下的词典和规则文件

$so->send_text($str);

while ($tmp = $so->get_result())

{

foreach (  $tmp as $ss ){

$s = trim($ss[word]);

if ( $s )

$mystr .= trim($ss[word]) . " ";

//echo urlencode(trim($ss[word])) . " ";

}

}

return $mystr;

}

该函数返回就是用空格连接的分词结果。

3. 对分词结果进行编码,可以采用多种编码方式,比如base64编码、urlencode编码、汉字转拼音等,对gb2312甚至可以采用区位码编码方式。考虑到存储空间以及便利性,我们采用了PHP的urlencode编码方式。需要注意的是,在编码前,我们可以去掉重复的分词来节约存储空间,编码后要去掉编码结果中的%符号,因为urlencode采用RFC 1738???行编码,会产生很多%,而%在MySQL是通配符。下面是编码过程用到的PHP代码

$data = str_fc($data);  //中文分词

$data = array_filter(explode(" ",$data)); //删除数组空项

$data = array_flip(array_flip($data));  //删除重复项

//对分词结果进行urlcode编码

foreach (  $data as $ss ) {

if (strlen($ss)>1 )

$data_code .= str_replace("%","",urlencode($ss)) . " ";

}

这里的$data_code就是编码后的结果。把编码结果根据user_id存入用户信息全文索

引表(members_index)

4. 在进行搜索处理时,首先对用户输入的关键字进行同样的分词编码处理,然后通过MySQL的SELECT的MATCH  AGAINST语句进行全文快速检索,根据检索结的user_id即可调用用户信息表(members)中的原始数据进行显示,而没有必要进行一次解码重组。

以上MySQL UTF8中文全文检索方法.

全文检索工具:http://www.xunsearch.com

PHP+MYSQL实现全文检索及全文检索工具

时间: 2024-10-04 18:04:56

PHP+MYSQL实现全文检索及全文检索工具的相关文章

MySQL监控、性能分析——工具篇

MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析.监控预警.容量扩展议题越来越多.“工欲善其 事,必先利其器”,那么我们如何在进行MySQL性能分析.监控预警.容量扩展问题上得到更好的解决方案,就要利用各种工具来对MySQL各种指标进行分 析.本文是读书笔记,下面提及的工具,读者可能都用过,或打算准备是使用.MySQL服务器的发布包没有包含那些能完成许多常见任务的工具,例如监控服务器的工具.比较服务器间数据的工具.我们把这些工具分成以下几类:界面.监

mysql慢查日志分析工具 percona-toolkit

备忘自: http://blog.csdn.net/seteor/article/details/24017913 1. 工具简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取的MySQL协议数据来进行分析.可以把分析结果输出到文件中,分析过程是先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间.次数.占比

mysql几种性能测试的工具使用

mysql几种性能测试的工具使用 近期由于要比较mysql及其分支mariadb, percona的性能,了解了几个这方面的工具,包括:mysqlslap sysbench tpcc-mysql,做一个整理,备忘,分享 1.mysqlslap 安装:简单,装了mysql就有了 作用:模拟并发测试数据库性能. 优点:简单,容易使用. 不足:不能指定生成的数据规模,测试过程不清楚针对十万级还是百万级数据做的测试,感觉不太适合做综合测试,比较适合针对既有数据库,对单个sql进行优化的测试. 使用方法:

mysql几种性能测试的工具

mysql几种性能测试的工具使用 一.mysqlslap 安装:装了mysql就有了 作用:模拟并发测试数据库性能. 优点:简单,容易使用. 不足:不能指定生成的数据规模,测试过程不清楚针对十万级还是百万级数据做的测试,感觉不太适合做综合测试,比较适合针对既有数据库,对单个sql进行优化的测试. 使用方法: 可以使用mysqlslap --help来显示使用方法: Default options are read from the following files in the given ord

MySQL跳过主从错误工具(mysqlha_skiperror.sh)

工具名称:mysqlha_skiperror.sh 工具用途:用于MySQL跳过主从错误 工具参数:options: -P port   指定端口                   -N number   指定跳过错误次数  不指定默认为10次(如果不知道可以设置大一些,会记录log) -C      error code  Take ,  as the separator  指定跳过错误的状态码 可以跳过多个以,分隔 工具示例: mysqlha_skiperror.sh -P 4444 -C

mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有一些常规问题: 比如主库宕机或者从库宕机有可能会导致复制中断,通常需要进行人为修复, 或者很多时候需要把一个从库提升为主库,但对从库和主库的数据一致性不能保证一样. 这种情况下就需要使用percona-toolkit工具的pt-table-checksum组件来检查主从数据的一致性:如果发现不一致的

MySQL高可用复制管理工具 —— Orchestrator介绍

背景 在MySQL高可用架构中,目前使用比较多的是Percona的PXC,Galera以及MySQL 5.7之后的MGR等,其他的还有的MHA,今天介绍另一个比较好用的MySQL高可用复制管理工具:Orchestrator(orch). Orchestrator(orch):go编写的MySQL高可用性和复制拓扑管理工具,支持复制拓扑结构的调整,自动故障转移和手动主从切换等.后端数据库用MySQL或SQLite存储元数据,并提供Web界面展示MySQL复制的拓扑关系及状态,通过Web可更改MyS

MySQL备份--xtrabackup与mysqldump工具使用

MySQL备份----xtrabackup与mysqldump工具的使用 一.Xtrabackup8.0: 一个用于MySQL数据库物理热备的备份工具,支持MySQL.Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具.xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表. 备份原理: Percona XtraBackup的工作原理是在启动时记住日志序列号(LSN),然后复制数据文件.同时,Percona Xtr

关于MySQL的FULLTEXT实现全文检索的注意事项

对于英文,MySQL的FULLTEXT属性来实现全文检索是相当方便且高效的,但是在使用过程中需要注意一些事项. 首先对我们对需要进行检索的字段添加FULLTEXT属性(假设已经建表): SQL: alter table table_name add fulltext index(filed_1,filed_2); 接下来查询数据: SQL:  SELECT * FROM table_name WHERE MATCH (filed_1,filed_2) AGAINST ('keyword'); 此