在使用mysql数据库过程中,如果想实现全文检索的优化,可以使用mysql自带全文索引,但是不支持中文。。关于sphinx的安装网上很多教程写的都不错比如:http://www.coreseek.cn/products-install/。这里就不再说明安装方法了。有兴趣的可以自己参考。
MySQL在高并发连接、数据库记录数较多的情况下,SELECT ... WHERE ... LIKE '%...%'的
全文搜索方式不仅效率差,而且以通配符%和_开头作查询时,使用不到索引,需要全表扫描,对数
据库的压力也很大。MySQL针对这一问题提供了一种全文索引解决方案,这不仅仅提高了性能和效
率(因为MySQL对这些字段做了索引来优化搜索),而且实现了更高质量的搜索。但是,至今为
止,MySQL对中文全文索引无法正确支持。
可以使用Sphinx(一种全文检索引擎)技术,Sphinx默认不支持中文索引及检索。以前用Coreseek的补丁来解决,目前Coreseek 不单独提供补丁文件,而基于sphinx开发了Coreseek 全文检索服务器,Coreseek应该是现在用的最多的sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg包含mmseg中文分词。
Sphinx的基本原理与检索流程
这种检索流程使用sphinx官方为我们提供的API文件(php使用sphinxapi.php),首先php通过这个api连接sphinx服务器,获取查询结果的id信息,然后再通过这些id从mysql数据库中 取得相关的数据。
SphinxSE – 基于Sphinx存储引擎检索
这种检索流程,把sphinx编译成mysql的存储引擎,SphinxSE是一个可以编译进MySQL 5.x版本的MySQL存储引擎,它利用了该版本MySQL的插件式体系结构。尽管被称作“存储引擎”,SphinxSE自身其实并不存储任何数据。它其实是一个允许MySQL服务器与searchd交互并获取搜索结果的嵌入式客户端。所有的索引和搜索都发生在MySQL之外。
SphinxSE的使用:
当需要在MySQL端对Sphinx结果集做额外处理(例如对原始文档表做JOIN,MySQL端的额外过滤等等)时提供优化。
要通过SphinxSE搜索,需要建立特殊的ENGINE=SPHINX的“搜索表”,然后使用SELECT语句从中检索,把全文查询放在WHERE子句中。
创建一张表t1
CREATE TABLE t1
(
id INTEGER UNSIGNED NOT NULL,
weight INTEGER NOT NULL,
query VARCHAR(3072) NOT NULL,
group_id INTEGER,
INDEX(query)
) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312/test1";
搜索表前三列的类型必须是INTEGER,INTEGER和VARCHAR,这三列分别对应文档ID,匹配权值和搜索查询。查询列必须被索引,其他列必须无索引。列的名字会被忽略,所以可以任意命名,参数CONNECTION来指定用这个表搜索时的默认搜索主机、端口号和索引,语法格式:CONNECTION=”sphinx://HOST:PORT/INDEXNAME”。
执行SQL语句 select d.id,d.title,d.content from t1 join documents as d on t1.id = d.id and t1.query = '研究生创业';
+—-+——————–+———————–+
| id | title | content |
+—-+——————–+———————–+
| 5 | 研究生的故事 | 研究生自主创业 |
+—-+——————–+———————–+
1 row in set (0.04 sec)
结果返回了我们想要的数据,可见利用SphinxSE可以仅仅在SQL语句上做很小的改动即可很方便的实现全文检索!
主索引 + 增量索引
前提:数据不会被改变
第一步:建表: (用来存索引过的最大的记录 id)
Create table a(
Id int unsigned not null primary key,
Max_id int unsigned,
);
第二步:修改配置文件为:见 sphinx配置文件
第三步:先执行 ./bin/indexer –c ./etc/sphinx.conf –test1
生成所有的索引-〉一个数据源的主查询,只有第一次执行
第四步:定期执行:
./bin/indexer –c ./etc/sphinx.conf delta --rotate
生成增量的索引文件
第五步:合并到主索引中
./bin/indexer –merge test1 delta –c ./etc/sphinx.conf --rotate