Sphinx 的介绍和原理探索——不存储原始数据,原始数据来源于SQL,而生成索引放在内存或者磁盘中
2017-01-04 16:07
417 查看
摘自:http://blog.jobbole.com/101672/
What/Sphinx是什么
定义:Sphinx是一个全文检索引擎。特性:
索引和性能优异
易于集成SQL和XML数据源,并可使用SphinxAPI、SphinxQL或者SphinxSE搜索接口
易于通过分布式搜索进行扩展
高速的索引建立(在当代CPU上,峰值性能可达到10 ~ 15MB/秒)
高性能的搜索 (在1.2G文本,100万条文档上进行搜索,支持高达每秒150~250次查询)
Why/为什么使用Sphinx
遇到的使用场景
遇到一个类似这样的需求:用户可以通过文章标题和文章搜索到一片文章的内容,而文章的标题和文章的内容分别保存在不同的库,而且是跨机房的。
可选方案
A、直接在数据库实现跨库LIKE查询优点:简单操作 缺点:效率较低,会造成较大的网络开销
B、结合Sphinx中文分词搜索引擎
优点:效率较高,具有较高的扩展性 缺点:不负责数据存储
使用Sphinx搜索引擎对数据做索引,数据一次性加载进来,然后做了所以之后保存在内存(或磁盘)。这样用户进行搜索的时候就只需要在Sphinx服务器上检索数据即可。而且,Sphinx没有MySQL的伴随机磁盘I/O的缺陷,性能更佳。
How/如何使用Sphinx
Sphinx工作流程图:流程图解释:
Database:数据源,是Sphinx做索引的数据来源。因为Sphinx是无关存储引擎、数据库的,所以数据源可以是MySQL、PostgreSQL、XML等数据。
Indexer:索引程序,从数据源中获取数据,并将数据生成全文索引。可以根据需求,定期运行Indexer达到定时更新索引的需求。
Searchd:Searchd直接与客户端程序进行对话,并使用Indexer程序构建好的索引来快速地处理搜索查询。
APP:客户端程序。接收来自用户输入的搜索字符串,发送查询给Searchd程序并显示返回结果。
倒排索引
倒排索引是一种数据结构,用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。倒排索引(Inverted Index):倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
传统的索引是:索引ID->文档内容,而倒排索引是:文档内容(分词)->索引ID。可以类比正向代理和反向代理的区别来理解。正向代理把内部请求代理到外部,反向代理把外部请求代理到内部。所以应该理解为转置索引比较合适。
倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
index employeesSalariesIndex { type = plain source = employeesSalariesSource path = /home/fkereki/bin/sphinx/var/data/sphinxFilesESI charset_type = utf-8 preopen = 1 }
Sphinx 使用的索引文件独立于 MySQL 使用的索引文件。type=plain 行表示您正在使用标准的 Sphinx 索引文件。其他可能的索引是 distributed(当您具有在网络的几个节点分布的索引文件时)和 rt(表示 real time),您可以立刻更新这些索引。source= 行将一个数据源与一个索引相关联。您可以在一个索引中合并几个数据源,但是在本示例中没有这样做。path= 行定义索引文件名称及其存储位置。
单词词典是倒排索引中非常重要的组成部分,它用来维护文档集合中出现过的所有单词的相关信息,同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息。在支持搜索时,根据用户的查询词,去单词词典里查询,就能够获得相应的倒排列表,并以此作为后续排序的基础。
对于一个规模很大的文档集合来说,可能包含几十万甚至上百万的不同单词,能否快速定位某个单词直接影响搜索时的响应速度,所以需要高效的数据结构来对单词词典进行构建和查找,常用的数据结构包括哈希加链表结构和树形词典结构。
相关文章推荐
- Cassandra二级索引原理——新创建了一张表格,同时将原始表格之中的索引字段作为新索引表的Primary Key,并且存储的值为原始数据的Primary Key,然后再通过pk一级索引找到真正的值
- 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程
- SqlServer2005(2000)数据库字典,将表数据生成SQL脚本的存储过程 (转)
- 将表数据生成SQL脚本的存储过程
- 探索组合索引的数据存储
- 将表数据生成SQL脚本的存储过程
- sql索引影响数据存储位置的示例
- mssql 生成‘批量Insert数据的sql语句’的存储过程
- 由于文件不可访问,或者内存或磁盘空间不足,所以无法打开数据库 'msdb'。有关详细信息,请参阅 SQL Server 错误日志。 (Microsoft SQL Server,错误: 945)
- 探索组合索引的数据存储
- 生成sql表数据存储过程脚本
- ------------------------将表数据生成SQL脚本的存储过程------------------------
- sql生成(查询数据的存储过程)代码的存储过程
- 将表数据生成SQL脚本的存储过程
- 转:生成SQL数据脚本的存储过程
- MSSQL生成表数据SQL插入语句的存储过程
- 将表数据生成SQL脚本的存储过程
- sql生成(c#调用存储过程返回数据表)代码的存储过程
- 从已有数据库生成脚本来获得生成数据表、视图、函数、存储过程以及触发器的SQL语句
- T-SQL 存储过程: (修订版) 根据基本表结构及其数据生成 INSERT INTO ... 的 SQL