PHP+MYSQL实现全文检索

如何使用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 全文检索_PHP+MYSQL实现全文检索相关推荐

  1. php mysql mysql_set_charset()._PHP:MySQL函数mysql_set_charset()的用法

    mysql_set_charset (PHP 5 >= 5.2.3) mysql_set_charset - 设置客户端的字符集 本扩展自 PHP 5.5.0 起已废弃,并在将来会被移除.应使用 ...

  2. mysql+基本代码_PHP+MySQL扎实基本功十句话_php

    2.写程序前看看怎么用error_reporting. 3.不懂就问本身没错,但你需要在那之前查查手册. 4.当然,你需要懂得使用手册.手册上找不到答案的时候,应该考虑下网络上的搜索引擎. 5.刚学会 ...

  3. php mysql预处理_PHP MySQL 预处理语句

    预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下:预处理:创建 SQL 语句模板并发送 ...

  4. php mysql 降_PHP,MySQL:mysql替代php in_array函数

    假如我有一个数组并且我想检查一个元素是否是该数组的一部分,我可以继续使用in_array(needle,haystack)来确定结果.我试图看到PHP相当于我的目的.现在你可能有一个即时的答案,你可能 ...

  5. php mysql购物车_php mysql购物车实现程序

    php mysql购物车实现程序 (2015-05-10 21:31:00) 标签: 股票 分类: PHP 简单容易理解.cookie存购物车ID,db存购物车数据. http://www.111cn ...

  6. mysql页码_PHP+MySQL实现输入页码跳转到指定页面功能示例

    本文实例讲述了php+mysql实现输入页码跳转到指定页面功能.分享给大家供大家参考,具体如下: 一.代码 conn.php: $id=mysql_connect("localhost&qu ...

  7. php加mysql分页_php mysql 分页函数

    一款超简单的php mysql 分页,也是很实例的一款函数,他可以自动获取用户增加的参数,而不需要用户来增加,很自能化的一款自能分页程序. ------------------------------ ...

  8. php过滤特殊字符mysql攻击_php – MySQL在特殊字符处切断字符串

    我正在尝试使用 PHP将远程POST数据(iSnare发送的文章)插入MySQL.数据来自远程POST发件人,我可以将其写入纯文本文件而不会出现问题. 不幸的是,当它将它插入MySQL时,MySQL会 ...

  9. php mysql 分类_php+mysql实现无限分类实例详解

    本文实例讲述了php+mysql实现无限分类的方法.分享给大家供大家参考.具体分析如下: 1.数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类: 2.数据库设计通过特定格式进行 ...

最新文章

  1. Linux服务器文件描述符最大值修改
  2. ARM构架之cache初探
  3. KubeVela + KEDA:为应用带来“与生俱来”的弹性伸缩能力
  4. SAP C4C - Field creation not permitted in partner devel
  5. jsp2自定义标签开篇
  6. python变量类型是动态的_python内存动态分配过程详解
  7. UPS不间断电源的种类有哪些 常见的3类UPS电源
  8. 11-基于dev的bug(还没想通)
  9. python web开发基础_python web开发基本概念
  10. Python tkinter版猜数游戏
  11. angelajs中ajax,前端测试数据怎么利用Mock.js进行生成
  12. 【优化预测】基于matlab差分算法优化ANN预测【含Matlab源码 151期】
  13. input 输入法禁用
  14. 三/五/七/九点二次平滑法
  15. photoshop图片显示为索引,解决办法
  16. Cytoskeleton / 艾美捷——BimC驱动蛋白运动域蛋白
  17. Maya: Time Editor Maya教程:时间编辑器 Lynda课程中文字幕
  18. linux安装iso软件命令,linux命令制作iso镜像
  19. Abaqus CAE2022启动时报错“The desired vendor daemon is down”
  20. puts()和gets()

热门文章

  1. notify和notify的区别
  2. 真正的3D桌面!以后的Windows会是这样的?
  3. 小数用二进制如何表示
  4. 中国缘何落后于印度(转)
  5. 列存储、行存储之间的关系和比较
  6. 两个不同对象的list要取交集(list转map的应用)
  7. winform下拉框模糊查询_怎样在c#中实现数据库数据的模糊查询
  8. Spark Graphx Pregel(pregel参数详解,pregel调用实现过程的详细解释)
  9. 优克联与伦敦合作伙伴携手,为欧洲夏季旅游重新开放做准备
  10. 自媒体运营写出好标题,你就成功一半