`
kidiaoer
  • 浏览: 822119 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

支持中文的MYSQL全文检索[转]

阅读更多
支持中文的MYSQL全文检索[转]

支持中文的MYSQL全文检索[转] 2008-06-16 16:24 Mysql中文搜索 刘军 目前我国互联网用户数已经突破2.1亿,互联网正在越来越广泛和深刻地影响中国人的生活。在 Web2.0思想的引导下,BBS、blog等社区产品大量增加,越来越多的人加入到网民这个行列中来,也因此导致互联网的信息量呈爆炸式增长,信息检索 就成为了一门新兴而重要的技术。 纵观当前互联网的技术架构,无疑Lamp占据了大半壁江山,中国的形式也是如此,越来越多的公司采用这一技术架构自己的网站,如百度、新浪、雅虎等知名企业都用到了这一技术架构。 然而遗憾的是,中国拥有世界第二的互联网用户数(即将成为第一),但是Lamp中的一大核心MySQL对中文的支持不是太理想。 MySQL3.22后的版本都支持全文搜索,但是仅仅限于英文的全文搜索。当试图在一个含有中文字符(或者其他非单字节字符)的字段中使用全文搜索时,不会得到任何结果,原因就是MySQL不支持中文的全文搜索。 当前使用Lamp的中文站点数不胜数,拿Discuz来说,它目前的搜索功能在从检索的时候还是使用效率很低的like,而用discuz这一系统的 BBS不在少数。全文检索自然就成为了一个需要紧急的处理的问题。 一.前导知识 1. 在MySQL上构造中文全文搜索的主导思想。 MySQL不支持中文全文搜索是因为它只能识别非单字节字符以及中文中没有像英文空格那样对词定界,如果能将中文转换成一种单字节类似英文习惯的存储方式,那么自然就能使用MySQL的全文搜索功能了。 将中文按照汉语使用习惯拆分成词,然后将词中每一个字转换为国标码GB18030,并将这些词用空格连接,这样就能在转换后的这段GB18030编码上进行全文搜索。 2. MySQL全文搜索的语法 SELECT fields list FROM table WHERE MATCH ( col1 , col2 ,...) AGAINST ( expr [ search_modifier ]) search_modifier: { IN BOOLEAN MODE | WITH QUERY EXPANSION } 例如:select * from articles where match(title, body) against(‘北京 奥运’)在字段“title,body”上全文搜索“北京 奥运” 注意,MySQL的全文搜索索引只能建立在Myisam引擎上。 更多的关于search_modifier请查看MySQL手册的全文搜索内容。 3. 中文分词 借助网友hightman的中文分词的php插件。 二.过程实现 1.创建数据库test_fulltext 其中两张表如下 表artilces 字段 类型 整理 属性 Null 默认 额外 操作 id int(11) 否 auto_increment title varchar(255) utf8_general_ci 否 body text utf8_general_ci 否 该表存储了原始的中文信息。 表article_zhcode 字段 类型 整理 属性 Null 默认 额外 操作 id int(11) 否 title varchar(255) utf8_general_ci 否 body text utf8_general_ci 否 表索引 键名 类型 基数 操作 字段 PRIMARY PRIMARY 14 id title FULLTEXT 无 title body 注意:在title和body字段上建立的一个索引,并不是在每个字段上建立索引。 该表的主键id参照articles的主键,该表的title和body保存了articles 2.文章的插入 插入文章时,将原始内容插入到表articles以后,然后使用分词插件将文涨分割为中文词汇,并将这些词汇转换问GB13080的编码插入到 article_zhcode。 使用了如下的代码将文章插入到数据库中 if(isset($_p_addsubmit)){ $time1 = get_microtime(); $_p_body = mb_ereg_replace("\r\n",'
', $_p_body); $sql = "INSERT INTO articles SET title = '{$_p_title}', body = '{$_p_body}'"; mysql_query($sql); $time2 = get_microtime(); $newId = mysql_insert_id(); /** * 分词 */ $splitHandle = getScws(); scws_send_text($splitHandle, $_p_title); $titleKeys = scws_get_result($splitHandle, mb_strlen($_p_title, 'UTF-8')); scws_send_text($splitHandle, $_p_body); $bodyKeys = scws_get_tops($splitHandle, mb_strlen($_p_body, 'UTF-8')); /** * 分词结束 */ /** * 将关键词转换为区位码 */ $tKeyStr = $bKeyStr = ''; foreach ($titleKeys as $titleKey){ $tKeyStr .= zhCode($titleKey['word']) . ' '; } foreach ($bodyKeys as $bodyKey){ $bKeyStr .= zhCode($bodyKey['word']) . ' '; } $sql = "INSERT INTO article_zhcode(id, title, body) VALUES({$newId}, '{$tKeyStr}', '{$bKeyStr}')"; mysql_query($sql); $time3 = get_microtime(); if(!file_exists('performace.txt')){ file_put_contents('performace.txt',"words\ttime1\ttime2\ttimetotal\r\n"); } echo $wc = mb_strlen($_p_title . $_p_body, 'UTF-8') . '
'; echo $time2 - $time1 . '
'; echo $time3 - $time2 . '
'; echo $time3 - $time1 . '
'; file_put_contents('performace.txt', mb_strlen($_p_title . $_p_body, 'UTF-8') . "\t" . $time2 - $time1 . "\t" . $time3 - $time2 . "\t" . $time3 - $time1 ."\r\n", FILE_APPEND); } 在这段代码中使用了几个方法。 scws_send_text(),scws_get_result(), scws_get_tops (),getScws(),zhCode(),其中前三个是hightman网友的分词插件中的,实现了分词的功能。getScws()方法初始化分词插 件的初始化。zhCode()是自己编写的,功能是将中文词转换为GB编码。他们的原型如下: function getScws() { $splitHandle = scws_open(); scws_set_dict($splitHandle, 'd:\software\php\scws\dict.utf8.xdb'); scws_set_rule($splitHandle, 'd:\software\php\scws\rules.utf8.ini'); scws_set_charset($splitHandle, 'utf8'); scws_set_ignore($splitHandle, true); scws_set_multi($splitHandle, true); return $splitHandle; } function zhCode($str) { if(preg_match("/^[a-z0-9 ]+$/i",$str)){ return $str; }else{ $zhCode = ''; $str = iconv('UTF-8', 'GB18030', $str); for($i = 0; $i 3){ scws_send_text($splitHandle, urldecode($_g_keywords)); $keywords = scws_get_tops($splitHandle); foreach ($keywords as $keyword){ $keys .= $keyword['word'] . ' '; $kwStr .= zhCode($keyword['word']) . ' '; } }else{ $keys = urldecode($_g_keywords); $kwStr = zhCode($keys); } $sql = "SELECT b.* FROM article_zhcode AS a LEFT JOIN articles AS b ON a.id = b.id WHERE MATCH(a.title, a.body) AGAINST('{$kwStr}')"; $query = mysql_query($sql); $time2 = get_microtime(); } 其中用到了一个让关键词在浏览器中高亮显示的函数,原型如下: function hlSubstr($str, $substr, $hlColor = 'ff0000') { $substr = str_replace(' ', '|', trim($substr)); $str = mb_ereg_replace($substr, "\\0", $str); if(($pos = mb_strpos($str, ' 200){ $str = mb_substr($str, $pos - 90, 200, 'UTF-8'); }else{ $str = mb_substr($str, 0, 200, 'UTF-8'); } return $str; }
分享到:
评论

相关推荐

    一种MySQL数据库全文检索的实现方法.pdf

    本文介绍了一种 MySQL 数据库全文检索的实现方法,基于 UTF-8 编码的中文网站实现 MySQL 支持中文的全文检索功能。 传统的全文检索方法是通过 SELECT 查询语句实现的,这种方法存在搜索不够精确以及效率非常低下的...

    MySQL数据库进行中文全文检索的模拟实现方法.pdf

    然而,在输入关键字后进行查询找不到任何结果,该表对中文的全文检索是失效的,原因是MySQL对中文的支持不够,在进行中文分词的时候,由于汉字占用2个字节,用对英文分词的方法进行分词便会失败。 为了解决这个问题...

    MySQL实现中文全文检索的解决方案.pdf

    在 MySQL 中,实现中文全文检索是一项挑战性的任务,因为 MySQL 不支持中文字符的全文检索。但是,我们可以通过一些 trick 和解决方案来实现中文全文检索。本文将讨论两种解决方案:基于拼音转换和基于 N-gram 分词...

    基于MySQL的全文检索系统的研究与应用.pdf

    尽管MySQL在数据存储和处理方面表现出色,但默认情况下并不支持中文全文检索。文章中提出了一种解决方案,即通过预处理(分词)和调整数据库配置,以解决MySQL对中文全文检索的不支持问题。 【MySQL索引机制】MySQL...

    mysql 全文检索中文解决方法及实例代码

    2. 在MySQL中创建支持中文字符集的数据表,并配置全文索引。 3. 将分词后的关键词插入数据库,并建立全文索引。 4. 在进行搜索时,同样使用分词系统对搜索内容进行分词处理,然后利用MySQL的全文检索功能查询。 在...

    mysql字符集转换

    它直接影响到数据的存储与检索效果,尤其是对于包含多种语言文本的应用场景而言。本文将围绕“MySQL字符集转换”这一主题展开讨论,通过对给定文件中的标题、描述、标签以及部分内容进行分析,旨在深入讲解MySQL字符...

    Mysql实现全文检索、关键词跑分的方法实例

    在MySQL 5.7.6版本之后,引入了ngram全文解析器,这极大地扩展了其对非英文字符集(如中文、日文和韩文)的支持。以下将详细介绍如何在MySQL中实现全文检索和关键词跑分。 **一、ngram全文解析器** ngram全称是n-...

    横瓜数据库全文检索中间件

    (1)支持目前所有主流数据库(例如Access、SQL_server、Oracle、MySQL、DB2等),这些数据库文件都可以被架构成全文检索,HdMap并且支持异构数据库、多数据库,最多可容纳200个任意类型的数据库,但每个数据库须少于...

    Lucene检索数据库支持中文检索

    ### Lucene检索数据库支持中文检索 #### 一、Lucene简介与原理 ##### 1. Lucene概述 Lucene是一款高性能、全功能的文本搜索引擎库,由Java编写而成。其核心功能是为开发者提供构建搜索应用程序的基础框架。Lucene...

    让MYSQL彻底支持中文

    MySQL 是一款广泛应用的关系型数据库管理系统,但在默认情况下,它可能不直接支持中文字符集,导致处理中文数据时出现乱码或无法正常存储的问题。要让 MySQL 彻底支持中文,主要涉及到数据库服务器的配置、字符集...

    用Sphinx搭建MySQL中文全文搜索

    这时,我们可以借助第三方工具如Sphinx来增强MySQL的全文检索能力,实现高效且精准的中文搜索。本文将详细介绍如何使用Sphinx搭建MySQL的中文全文搜索。 首先,Sphinx是一个开源的全文搜索引擎,它的设计目标是提供...

    mysql 全文模糊查找 便捷解决方案

    然而,MySQL的全文搜索默认只支持英文,对于中文字符,我们需要额外的处理。这里提到的PHP Unicode工具类可能是解决中文全文搜索的一种方式。Unicode是一种字符编码标准,几乎包含了世界上所有的字符,包括中文。`...

    深度解析MySQL 5.7之中文全文检索

    这不,从MySQL 5.7开始,MySQL内置了ngram全文检索插件,用来支持中文分词,并且对MyISAM和InnoDB引擎有效。 在使用中文检索分词插件ngram之前,先得在MySQL配置文件里面设置他的分词大小,比如, [mysqld] ngram_...

    Mysql全文搜索match against的用法

    若要支持中文单字(通常少于4个字符),需要修改配置文件`my.cnf`。 - 在`[mysqld]`部分添加配置项`ft_min_word_len = 2`,以允许长度为2的单词被索引。 - 可以根据需要配置`ft_wordlist_charset`, `ft_wordlist_...

    MySQL中文参考手册

    MySQL中文参考手册是一份详尽的数据库管理系统指南,专为使用MySQL进行数据存储、管理和查询的用户和开发者设计。MySQL是一种流行的开源关系型数据库管理系统的(RDBMS),它以其高效、稳定和易于扩展的特性而受到全球...

Global site tag (gtag.js) - Google Analytics