mysql全文搜索与中文全文搜索方法

mysql自带的功能。

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引擎上。

 首先用下面表举例:

 代码如下 复制代码

CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

MySQL使用Match()和Against()执行全文搜索,举例如下:

 代码如下 复制代码

SELECT body FROM articles WHERE Match(body) Against('www.111cn.net');

如上Match是正对指定的列进行搜索,Against('www.phpddt.com')是正对指定词进行搜索

另外:

使用查询扩展WITH QUERY EXPANSION,将会搜索出更多结果(mysql会将匹配的行中有用的词再次进行搜索,这样搜索出来的结果更多,但可能不是你想要的);

使用布尔文本搜索IN BOOLEAN MODE,类似我们平时使用seo/seo.html" target="_blank">搜索引擎时用到的的语法:逻辑与、逻辑或、逻辑非等.支持的布尔操作符如下:

全文布尔操作符:
--------------------------------------------------------------------------------------------------------------
|操作符                        |      说明                                                                                  |
--------------------------------------------------------------------------------------------------------------
|    +                       |包含,词必须存在                                                                            
|     -                      |排除,词必须不出现                                                                        
|     >                      |包含,而且增加等级值                                                                     
|     <                      |包含,且减少等级值                                                                         
|     ()                      |把词组成子表达式(允许这些子表达式作为一个组被包含,排除,排列等)
|      ~                     |取消一个词的排序值
|     *                       |词尾的通配符
|     " "                     |定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语) 
----------------------------------------------------------------------------------------------------------------

使用方法如下:

 代码如下 复制代码

SELECT * FROM articles WHERE MATCH (title,body)

     AGAINST ('+apple -banana' IN BOOLEAN MODE);

   + 表示AND,即必须包含。- 表示NOT,即不包含。

 

 代码如下 复制代码

SELECT * FROM articles WHERE MATCH (title,body)

     AGAINST ('apple banana' IN BOOLEAN MODE);

   apple和banana之间是空格,空格表示OR,即至少包含apple、banana中的一个。

 

 代码如下 复制代码

SELECT * FROM articles WHERE MATCH (title,body)

     AGAINST ('+apple banana' IN BOOLEAN MODE);

   必须包含apple,但是如果同时也包含banana则会获得更高的权重。

 代码如下 复制代码

 

SELECT * FROM articles WHERE MATCH (title,body)

     AGAINST ('+apple ~banana' IN BOOLEAN MODE);

   ~ 是我们熟悉的异或运算符。返回的记录必须包含apple,但是如果同时也包含banana会降低权重。但是它没有 +apple -banana 严格,因为后者如果包含banana压根就不返回。

 代码如下 复制代码

 

SELECT * FROM articles WHERE MATCH (title,body)

     AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE);

   返回同时包含apple和banana或者同时包含apple和orange的记录。但是同时包含apple和banana的记录的权重高于同时包含apple和orange的记录。

MySQL对中文全文索引无法正确支持,下面再介绍一个插件,利用mysqlcft 实现中文全文搜索。

Mysqlcft 是为 MySQL 5.1.22 ~ 5.1.25 RC 开发的中文全文索引插件,用于解决MySQL无法正确支持中文全文检索的问题

1、优点:

•精准度很高:采用自创的“三字节交叉切分算法”,对中文语句进行分割,无中文分词词库,搜索精准度远比中文分词算法高,能达到LIKE '%...%"的准确率。
•查询速度快:查询速度比LIKE '%...%"搜索快3~50倍,文章末尾有测试结果;
•标准插件式:以MySQL 5.1全文索引的标准插件形式开发,不修改MySQL源代码,不影响MySQL的其他功能,可快速跟进MySQL新版本;
•支持版本多:支持所有的MySQL 5.1 Release Candidate版本,即MySQL 5.1.22 RC~最新的MySQL 5.1.25 RC;
•支持字符集:支持包括GBK、GB2312、UTF-8、Latin1、BIG5在内的MySQL字符集(其他字符集没有测试过);
•系统兼容好:具有i386和x86_64两个版本,支持32位(i386)和64位(x86_64)CPU及Linux系统;
•适合分布式:非常适合MySQL Slave分布式系统架构,无词库维护成本,不存在词库同步问题。
2、缺点:

•mysqlcft中文全文索引只适用于MyISAM表,因为MySQL只支持对MyISAM表建立FULLTEXT索引;
•MySQL不能静态编译安装,否则无法安装mysqlcft插件;
•基于“三字节交叉切分算法”的索引文件会比海量、ft-hightman等基于“中文分词算法”的索引文件稍大,但不是大很多。
根据我的测试,mysqlcft全文索引的.MYI索引文件是.MYD数据文件的2~6倍

插件下载 https://code.google.com/p/mysqlcft/

时间: 2024-09-29 21:02:06

mysql全文搜索与中文全文搜索方法的相关文章

PHP连接远程MYSQL和MYSQL5.1中文乱码处理方法

本文描述了我在开发我的Blog的过程中所遇到的一些问题以及解决他们的方法.因为本网站采用的是一个免费的远程MySql数据库db4free.net,而且这个数据库是5.1的版本,所以在开发过程中出现了许多问题.故在此发表,以便大家参考. 一.连接远程数据库的方法 对于PHP连接远程MySql数据库,通常要使用如下的语句: 以下为引用的内容:    var $serverName     = 'db4free.net:3306';//数据库服务器     var $dbName         =

mysql导入导出数据中文乱码解决方法小结_Mysql

linux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--default-character-set=utf8, 例如下面的代码: 复制代码 代码如下: mysqldump -uroot -p --default-character-set=utf8 dbname tablename > bak.sql 那么导入数据的时候也要使用-

mysql导入导出数据中文乱码解决方法总结

linux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--default-character-set=utf8, 例如下面的代码:  代码如下 复制代码 mysqldump   -uroot  -p  --default-character-set=utf8   dbname tablename  >  bak.sql 那么导入数据

mysql中文全文搜索之学习笔记

mysql中模糊搜索关键字可以用like关键字,它可以查询出包涵关键字的字段,但当数据量变大时(比如超过百万条),由于不能使用索引,全表扫描会导致性能很差.那怎么能查询出包涵关键字的内容呢?这时可以采用mysql的全文搜索.但有个前提:需要把进行全文搜索的字段添加fulltext索引,并且只能建立在Myisam引擎上.然后用如match(字段1[,字段2,字段3-]) against('关键字1 关键字2')这样的方式搜索,这样可以查询出某些字段中包涵某些关键字的信息. 另外,用like匹配的是

MySQL 4.1.0 中文参考手册 --- 6.8 MySQL 全文搜索

mysql|参考|参考手册|全文搜索|中文 MySQL 4.1.0 中文参考手册 --- 犬犬(心帆)翻译 MySQL Reference Manual for version 4.1.0-alpha. 6.8 MySQL 全文搜索 到 3.23.23 时,MySQL 开始支持全文索引和搜索.全文索引在 MySQL 中是一个 FULLTEXT 类型索引.FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDE

使用 Microsoft SQL Server 2000 的全文搜索功能构建 Web 搜索应用程序

server|web|程序|全文搜索 使用 Microsoft SQL Server 2000 的全文搜索功能构建 Web 搜索应用程序 Andrew B. CenciniMicrosoft Corporation 2002年12月 适用于:    Microsoft SQL Server 2000摘要:学习如何充分利用 SQL Server 2000 的全文搜索功能.本文包含有关实现最大吞吐率和最佳性能的几点提示和技巧. 目录简介 全文搜索功能简介 配置全文搜索功能 全文查询 排位和优化 其他

MySQL中使用Sphinx实现多线程搜索的方法

  这篇文章主要介绍了在MySQL中使用Sphinx实现多线程搜索的方法,修改Sphinx的搜索引擎配置即可,需要的朋友可以参考下 MySQL.Sphinx及许多数据库和搜索引擎中的查询是单线程的.比如说,在一台32个CPU核心.16个磁盘的R910服务器上执行一个查询,它最多只会用到一个核心和一个磁盘.没错,只会使用一个. 如果查询是CPU密集型作业,那么会使用大约3%的整机CPU能力(以上述32核机器为例).如果是磁盘密集型,则大约会使用6%的整机IO能力(也是与上例同样的配置,16个磁盘组

bbmao的神秘配方:打破中文聚类搜索的低迷

尽管元搜索技术在国外搜索市场早已存在 但经过朱明谦"改良"的中文聚类搜索仍然打破了中文搜索市场创新乏力的低迷境况 采访·撰文 于焱 摄影 楼晓宁 3月的一天,朱明谦和往常一样早早来到办公室,打开电脑,登录bbmao主页,收看用户反馈. 十五分钟后,他停下手中的工作,为自己泡上一杯咖啡,站起来眺望远处.窗外是车水马龙的北三环,柳树枝头已经泛起新绿,同事们正陆续走进公司,员工已从最初的几个人增加到十六人,他和联合创始人李昌日不得不搬进一间小一点儿的办公室,把大办公室腾出来.虽然办公环境很挤

Yii2实现同时搜索多个字段的方法_php实例

本文实例讲述了Yii2实现同时搜索多个字段的方法.分享给大家供大家参考,具体如下: Yii2中搜索字段是用的andFilterWhere这个方法,用它可以搜索一个一段. 如果是搜索多个字段的话 ,比如搜索文章标题和文章内容是是否包含需要搜索的关键词,因为他们两个的关系是or,所以就要用到orFilterWhere这个方法 下面就是全部的代码 public function actionIndex() { $key =Yii::$app->request->post("key"