您的位置:首页 > 其它

sphinx原理以及索引流程

2016-05-17 16:29 302 查看
在使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: