`

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

    博客分类:
  • php
php 
阅读更多

使用分词类库,分词类库请参见: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.itnose.net/detail/6035568.html
更多文章:http://www.itnose.net/type/70.html

 

 

分享到:
评论

相关推荐

    apache+mysql+php+snort+base实现snort

    【Apache+Mysql+Php+Snort+Base 实现 Snort 知识点详解】 Apache、MySQL、PHP、Snort 和 BASE 是构建一个强大的入侵检测系统(IDS)的基础组件。这个组合使得网络管理员能够实时监控网络流量,检测潜在的攻击,并...

    php+mysql实现简单的新闻发布系统

    总的来说,"php+mysql实现简单的新闻发布系统"是一个很好的实践项目,它涵盖了Web开发中的多个核心概念和技术,包括动态网页、数据库交互、异步通信和富文本编辑。对于初学者来说,完成这个项目不仅能提高编程技能,...

    PHP+MySQL实现在线请假管理系统

    通过以上分析,我们可以看到“PHP+MySQL实现在线请假管理系统”是如何利用这两种技术的强项,结合Web开发的最佳实践,来创建一个功能完备、用户体验良好的在线工具。这个系统不仅可以提高工作效率,还为管理者提供了...

    php+mysql实现数据库图片的存储及显示

    本教程将深入探讨如何使用PHP和MySQL实现这一功能,重点在于使用二进制数据来存储和检索图片。 首先,我们需要理解PHP和MySQL的基本概念。PHP是一种广泛使用的开源脚本语言,尤其适合Web开发,可以嵌入到HTML中,...

    Apache+mysql+php

    在IT领域,"Apache+MySQL+PHP"是一个经典的Web开发环境组合,被...总的来说,"Apache+MySQL+PHP"的组合为Web开发者提供了强大、灵活且经济的工具,可以快速构建复杂的Web应用,是初学者入门和专业开发者的首选平台。

    php+mysql+sphinx实现近实时索引

    在构建高性能的Web应用时,有时我们需要快速、准确地对大量数据进行检索,这时...总之,"php+mysql+sphinx"的组合为实现近实时索引提供了一种强大且灵活的解决方案,只要正确配置和使用,就能大大提高数据检索的效率。

    html+php+mysql留言板功能的实现

    在本文中,我们将深入探讨如何使用HTML、PHP和MySQL实现一个功能完备的留言板系统,包括查看、增加和删除留言的功能,并解决中文乱码问题。这是一个常见的Web开发应用场景,对于初学者和进阶开发者来说,都是一个很...

    jQuery+Ajax+PHP+MySQL实现分类列表管理 中文WORD版

    MySQL是一种关系型数据库管理系统,用于存储和检索数据。在本例中,客户分类信息将存储在一个或多个MySQL数据库表中。PHP可以使用MySQLi或PDO扩展与数据库进行通信,执行SQL语句,如INSERT、UPDATE、DELETE等,以...

    一套基于PHP+MYSQL实现支持动态、伪静态、生成HTML模式的七夜图片管理系统源码

    【标题】中的“一套基于PHP+MYSQL实现支持动态、伪静态、生成HTML模式的七夜图片管理系统源码”指的是一个开源的图片管理系统,它利用PHP编程语言与MySQL数据库相结合,构建了一个功能完善的平台。该系统具备动态...

    php+mysql简单简洁留言板

    在这个项目中,PHP处理用户的请求,如提交留言、查看留言等,并通过MySQL数据库存储和检索这些信息。例如,`handle_msg.php`可能包含了处理用户提交留言的逻辑,而`conn.php`则负责建立和管理与数据库的连接。 2. *...

    PHP+mYsql在线考试系统

    在在线考试系统中,PHP主要用于处理HTTP请求,动态生成HTML页面,实现用户交互,如注册、登录验证,试题检索,以及分数计算等功能。 **MySQL数据库介绍** MySQL是一种关系型数据库管理系统(RDBMS),以其高效、...

    php+mysql bbs社区实现

    这个项目的核心是利用PHP作为服务器端脚本语言,处理用户的请求,以及MySQL数据库来存储和检索数据。下面将详细讨论这些知识点。 1. **PHP基础**:PHP是一种广泛使用的开源脚本语言,特别适合于Web开发。在这个BBS...

    php+mysql聊天室系统(Ajax)

    【php+mysql聊天室系统(Ajax)】是一个基于PHP编程语言和MySQL数据库技术构建的实时交互平台,利用Ajax异步技术实现无刷新页面更新,提供流畅的用户体验。在这个系统中,用户可以完成注册、登录等一系列操作,并在...

    教师信息管理系统PHP+MySQL

    总结起来,"教师信息管理系统PHP+MySQL"是一个基于Web的教育管理工具,它利用PHP的动态特性与MySQL的强大数据管理能力,构建了一个高效、可靠的教师信息管理平台。对于初学者来说,这是一个了解Web开发和数据库管理...

    vue商城+php后端+mysql数据库完整版

    在本项目中,PHP可能用于处理API接口,接收前端Vue发送的请求,执行业务逻辑,并将数据存储或检索到MySQL数据库中。 【MySQL数据库】 MySQL是一个关系型数据库管理系统,它在Web应用中非常常见,因为它速度快、稳定...

    图书管理系统 PHP+MYSQL实现

    4. 搜索功能:系统提供了图书信息的搜索功能,这涉及到SQL的LIKE或MATCH AGAINST操作,以及可能的全文检索。用户可以根据书名、作者等关键词快速找到所需图书。 5. 管理员权限:管理员具有对图书信息的增删改权限,...

    php+apache+mysql集成安装程序

    然而,随着技术的发展,现代的开发环境如XAMPP、WAMP、MAMP等也提供了类似的功能,它们不仅包含了PHP、Apache和MySQL,还可能包括其他工具,如PHPMyAdmin(用于管理MySQL数据库)和Composer(PHP的依赖管理工具),...

Global site tag (gtag.js) - Google Analytics