sphinx(一)全文检索引擎sphinx

简介: Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用 程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL 也设计了一个存储引擎插件。

QQ图片20220424173205.jpg


一:sphinx简介


Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用 程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL 也设计了一个存储引擎插件。


二:sphinx特性


1:高速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒);


2:高性能的搜索(在2 – 4GB 的文本数据上,平均每次检索响应时间小于0.1秒);


3:可处理海量数据(目前已知可以处理超过100 GB的文本数据, 在单一CPU的系统上可 处理100 M 文档);


4:提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法;


5:支持分布式搜索;


6:支持短语搜索


7:提供文档摘要生成


8:可作为MySQL的存储引擎提供搜索服务;


9:支持布尔、短语、词语相似度等多种检索模式;


10:文档支持多个全文检索字段(最大不超过32个);


11:文档支持多个额外的属性信息(例如:分组信息,时间戳等);


12:支持断词;


三:sphinx执行的过程


步骤1:通过sphinx去MySQL中获取并建立索引文件


步骤2:通过php去sphinx中查询数据并返回ID


步骤3:根据ID去MySQL中查询具体数据



QQ图片20220424173209.png


Database:数据源,是sphinx做索引的数据来源。


Indexer:索引程序,从数据源中获取数据,并将数据生成全文索引。根据需求定期运行Indexer达到定时更新索引的需求。


sphinx使用配置文件从数据库读出数据之后,就将数据传递给Indexer程序,然后Indexer会逐条读取记录,根据分词算法对每条记录建立索引,分词算法可以是一元分词或mmseg分词。


Searchd:Searchd直接与客户端程序进行对话,并使用Indexer程序构建好的索引来快速地处理搜索查询。


App客户端:接收来自用户输入的搜索字符串,发送查询给searchd程序并显示返回结果。


四:Sphinx的工作原理


Sphinx的整个工作流程就是Indexer程序到数据库里面提取数据,对数据进行分词,然后根据生成的分词生成单个或多个索引,并将它们传递给searchd程序。然后客户端可以通过API调用进行搜索。


五:使用场景


1、快速、高效、可扩展和核心的全文检索


数据量大的时候,比MyISAM和InnoDB都要快。


能对多个源表的混合数据创建索引,不限于单个表上的字段。


能将来自多个索引的搜索结果进行整合。


能根据属性上的附加条件对全文搜索进行优化。


2、高效地使用WHERE子句和LIMIT字句


当在多个WHERE条件做SELECT查询时,索引选择性较差或者根本没有索引支持的字段,性能较差。sphinx可以对关键字做索引。区别是,MySQL中,是内部引擎决定使用索引还是全扫描,而sphinx是让你自己选择使用哪一种访问方法。因为sphinx是把数据保存到RAM中,所以sphinx不会做太多的I/O操作。而mysql有一种叫半随机I/O磁盘读,把记录一行一行地读到排序缓冲区里,然后再进行排序,最后丢弃其中的绝大多数行。所以sphinx使用了更少的内存和磁盘I/O。


3、优化GROUP BY查询


在sphinx中的排序和分组都是用固定的内存,它的效率比类似数据集全部可以放在RAM的MySQL查询要稍微高些。


4、并行地产生结果集


sphinx可以让你从相同数据中同时产生几份结果,同样是使用固定量的内存。作为对比,传统SQL方法要么运行两个查询,要么对每个搜索结果集创建一个临时表。而sphinx用一个multi-query机制来完成这项任务。不是一个接一个地发起查询,而是把几个查询做成一个批处理,然后在一个请求里提交。


5、向上扩展和向外扩展


向上扩展:增加CPU/内核、扩展磁盘I/O


向外扩展:多个机器,即分布式sphinx


6、聚合分片数据


适合用在将数据分布在不同物理MySQL服务器间的情况。


例子:有一个1TB大小的表,其中有10亿篇文章,通过用户ID分片到10个MySQL服务器上,在单个用户的查询下当然很快,如果需要实现一个归档分页功能,展示某个用户的所有朋友发表的文章。那么就要同事访问多台MySQL服务器了。这样会很慢。而sphinx只需要创建几个实例,在每个表里映射出经常访问的文章属性,然后就可以进行分页查询了,总共就三行代码的配置。



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
人工智能 Shell
Claude Code思考深度降67%,老金找到个深度数据说明案例,还有怎么破
这两天Claude Code社区炸了。 有人翻了6852次会话记录,发现Claude Code的思考深度从1月到2月底,降了67%。 老金我第一反应是:不会吧,我自己天天用,没感觉啊。 结果看完数据,沉默了。 今天老金我帮你把这件事从头到尾拆一遍。 数据、原因、官方回应、临时修复方案,全给你。 ## 先看数据,数据不会说谎 这件事的源头是GitHub上Claude Code的一个issue,编
|
缓存 关系型数据库 MySQL
ThinkPHP框架show columns引发mysql性能问题
ThinkPHP框架的show columns引发mysql性能问题,结尾有关闭方式。
576 13
|
JSON API 数据安全/隐私保护
【干货满满】分享拼多多API接口到手价,用python脚本实现
拼多多开放平台提供商品价格查询API,通过“pdd.ddk.goods.detail”接口可获取商品基础价、优惠券、拼团价等信息。结合client_id、client_secret及签名机制实现身份认证,支持推广位ID获取专属优惠。本文提供完整Python实现,涵盖签名生成、接口调用与价格解析逻辑,适用于比价工具、导购平台等场景。
|
9月前
|
存储 缓存 固态存储
系统分区完全指南:多种方法实现专业磁盘管理
合理磁盘分区可提升搜索效率、增强容错性、优化性能并便于管理。建议分为系统盘与数据盘,Windows推荐GPT格式,支持更大容量与UEFI启动。可通过系统自带工具或DiskGenius进行分区操作,注意备份、4K对齐及电源稳定。
1992 3
|
NoSQL Ubuntu Redis
Ubuntu开机自启redis
本文介绍了如何在Ubuntu系统中通过创建systemd服务单元文件、重新加载systemd配置、启用服务和启动服务的步骤来实现Redis的开机自启动。
1059 1
|
安全 网络安全
网络安全CTF比赛有哪些事?——《CTF那些事儿》告诉你
网络安全CTF比赛有哪些事?——《CTF那些事儿》告诉你
|
存储 NoSQL MongoDB
Redis在中国火爆,为何MongoDB更受欢迎国外?
本文介绍了Redis和MongoDB的基本概念及其在GitHub Star、DB-Engines Ranking和Google Trends中的数据对比。Redis是一个基于内存的键值对存储数据库,适合快速读写场景;MongoDB则是面向文档的数据库,支持大规模数据存储和复杂查询。全球范围内,MongoDB的搜索热度高于Redis,但在中国市场,Redis更受欢迎,因其高性能和低延迟特性满足了中国互联网公司对高并发的需求。总结部分分析了两者的特点及适用场景,并结合中美两国的行业背景解释了其受欢迎程度的不同原因。
608 1
|
Java jvm-sandbox 容器
【alibaba/jvm-sandbox#05】沙箱事件详解
alibaba/jvm-sandbox设计了完善且复杂的沙箱事件,用于实现事件探测和流程控制机制。但不建议对于同一个类、同一个方法多次增强
1219 0
|
存储 Kubernetes 负载均衡
|
传感器 存储 算法
课程设计——基于FPGA的共享单车计费器设计(含源码)
课程设计——基于FPGA的共享单车计费器设计(含源码)