什么是全文索引?
这里先引入两个概念,结构化数据和非结构化数据。
结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。
全文检索的基本思路:将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。
这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。
这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
mysql的全文索引是根据英文的特点来开发的,如英文“this is my mysql database”,英文可以根据空格和标点去分开每个单词,然后统计单词的位置,生词索引树。然而中文却没有这样的特点,只能利用sphinx或者lucence去利用词库,匹配出关键词,然后构建索引树,通过关键词索引树可以直接获取数据的id,然后用id去数据库进行查询,直接命中数据库的索引,提升查询效率。第三方的全文索引还可以统计关键词的次数,提供相关度查询等功能
MySQL支持在CHAR、VARCHAR、TEXT类型的列上定义全文索引
mysql 5.6.4之前只有Myisam支持,5.6.4之后则Myisam和innodb都支持,不过mysql中的全文索引目前只支持英文(不支持中文)
sphinx 这是英文的全文检索引擎
coreseek 这是支持中文词库的全文检索引擎
方法一:
windows下安装coreseek
1 下载coreseek安装包,安装包的文件如下图所示,本实例是coreseek4.1
链接:https://pan.baidu.com/s/1nNm1wRiYKwR0FRUiX4Efwg
2 进入到etc目录下,找到csrf_mysql.conf
对里面的配置进行相应修改
安装coreseek
d:/web/coreseek/bin/searchd --install --config d:/web/coreseek/etc/csft_mysql.conf --servicename Coreseek
并启动 Coreseek 服务
sc start Coreseek
如要已启动服务,要更新索引
d:/web/coreseek/bin/indexer -c d:/web/coreseek/bin/coreseek.conf --all --rotate
3 打开cmd进入到coreseek所在目录,输入如下命令生成索引文件
.\bin\indexer.exe –c .\etc\csft_mysql.conf --all
如下图所示你的索引就创建好了
4 coreseek的搜索服务打开
输入以下命令
.\bin\searchd.exe -c .\etc\csft_mysql.conf
输入完毕如下图所示如果没出任何问题你的coreseek搜索服务就开启拉了
测试查询
输入 bin\search -c etc\csft_mysql.conf xxxx
xxxx 为要查询的内容
dos下最好只查询英文内容,因为dos下由于编码原因,不一定能查询出来。
dos下的查询主要是起到测试的作用,真正的查询应该还是要通过调用API
5 这时可以看下etc目录下有没有如下图所示三个文件
6 让php操作coreseek
打开coreseek 文件目录的api目录找到 sphinxapi.php文件复制到你的域名文件下
我的环境是PHPStudy所有我放在WWW目录下我创建了一个sphinx文件夹里面放入如图所示的两个PHP文件
Ses.php里面的内容:
SPH_MATCH_ALL匹配所有查询词(默认模式)
SPH_MATCH_ANY匹配查询词中的任意一个
SPH_MATCH_PHRASE将整个查询看作一个词组,要求按顺序完整匹配
SPH_MATCH_BOOLEAN将查询看作一个布尔表达式
SPH_MATCH_EXTENDED将查询看作一个Sphinx内部查询语言的表达式
SPH_MATCH_FULLSCAN使用完全扫描,忽略查询词汇
打印出的内容
说明:试验发现,用这种方法搜索只能搜索出词库中已经存在的数据,也就是如果搜索词在词库中没有,但在数据库中有数据是查不出来的。如:搜索“测试”,这个词在词库中存在,就可以搜索出来;但是搜索“测”,就搜不出来数据了。
方法二:
使用中文分词插件PHPAnalysis,在插入数据时将插入的数据分成一个个词语插入数据库,这样数据库的数据就会以空格相连,像英文一样了。如下图
说明:这是在mysql5.6版本下,因为5.6版本的innodb和MYISAM都是支持全文检索的,而5.6版本以下的innodb引擎是不支持全文检索的
卸载 coreseek
停止服务
sc stop Coreseek
卸载服务 sc delete Coreseek