Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用sphinx给PHP加个给力的搜索功能

用sphinx给PHP加个给力的搜索功能

作者头像
写PHP的老王
发布于 2019-08-12 07:30:53
发布于 2019-08-12 07:30:53
1K00
代码可运行
举报
文章被收录于专栏:写PHP的老王写PHP的老王
运行总次数:0
代码可运行

最近工作上需要实现搜索功能,尝试了几种方案。虽然最终线上部署的还是最low的方案,但是中间的过程还是比较有意思的。业务上根据关键字查找内容。关键字的出处多来源于标题,文章描述等。主要实现方式有一些几种,各个方式各有利弊,需要权衡。

like模糊查询标题和描述,使用或条件查询

like查询估计是最常用的方式了,也是最容易实现的方式。业务代码少,逻辑清晰,准确率也高。不用其他额外操作(比如分词)。但是有个非常致命的问题,那就是效率。效率非常低,特别是在数据量大的情况。测试过程中,在224256行数据中,对3749个字进行like查询,执行总时间长达4003秒。相当于每个查询需要花费1.06秒的查询时间。

生成关键字表,使用关键字表进行查询

对数据内容的标题和内容进行分词,把各个分词结果关联该内容。查询的时候根据查询关键字进行匹配。因为不是模糊搜索,所以可以使用数据库的索引,加快搜索速度。但是效果依赖于分词,以及用户输入关键词匹配程度。

例如标题内容"2018年12月7日美国会通过加拿大边境墙预算",分词内容"2018年12月7日/美国/会/通过/加拿大/边境/墙/预算"。用户输入"美国","加拿大"可以查询到内容。但是如果输入"国会"则无法搜索到内容。如果多个词同时匹配,则需要使用in查询,然后筛选出同时出现的内容。

所以这种生成关键字的方式,虽然查询速度上会比直接使用like查询快,但是业务逻辑会比较复杂。需要在数据插入,更新的同时更新关键词数据。同时查询之前也要对查询内容进行分词操作。查询的准确度依赖于分词结果。

使用sphinx作为搜索引擎

sphinx支持全文搜索,所以在sphinx中查询到关键字对应内容id之后再通过数据库获取内容的全部数据。但是sphinx需要额外的服务(也可以使用sphinxse,不过需要重新编译mysql),同时索引页会带来内存和储存空间上的开销,同时也会涉及到索引实时更新的问题。在224256行数据中,对3749个字进行查找,查找总时间是6.5秒,速度相当快。主要问题有:

1、数据变更之后需要重建索引。数据增删改都需要记录改动状态(这里我使用最后变更时间,也可以使用一个额外表记录,这样可以处理数据删除的情况),使用sphinx的sql_query_killlist可以屏蔽旧的索引数据。

2、需要定期重全量索引,保证增量索引重建速度。增量索引的重建速度影响查询的准确率,避免查询已经变更的历史数据。

3、索引重建可以不关闭服务器,但是会影响内存和磁盘开销。224256行数据,重建全量索引时间8.1秒,占用磁盘空间82.6M。 在业务高峰期重建索引容易引起意外

本地实验查询所使用的字是通过sphinx索引创建的字典生成。 生成方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
indexer --buildstops dict.txt 100000 --buildfreqs test1 -c /path/to/sphinx.conf

以下是在本地实验的一些数据,生成全量索引的结果。下半部分是mysql like查询和sphinx查询的时间对比

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collected 224256 docs, 82.6 MB
sorted 24.4 Mhits, 100.0% done
total 224256 docs, 82.57 Mb
total 8.1 sec, 10.19 Mb/sec, 27685 docs/secdata count 224256,word count 3749,test times 1
sphinx: etime 6.5123720169067 ,error rate 0
mysql: etime 4003.215970993 ,error rate 0
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写PHP的老王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用PHP+Sphinx建立高效的站内搜索引擎
假设你现在运营着一个论坛,论坛数据已经超过100W,很多用户都反映论坛搜索的速度非常慢,那么这时你就可以考虑使用Sphinx了(当然其他的全文检索程序或方法也行)。
Java架构师必看
2021/03/22
2.4K0
Sphinx + Coreseek 实现中文分词搜索
全文检索是数据库的有力补充,全文检索并不能替代数据库在应用系统中的作用。当应用系统的数据以大量的文本信息为主时,採用全文检索技术能够极大的提升应用系统的价值。
全栈程序员站长
2022/07/20
1.6K0
Sphinx&coreseek实现中文分词索引
众所周知,mysql等数据库的LIKE模糊搜索不支持索引,因此查询效率极低,需要结合第三方索引引擎程序(索引程序)来提高查询性能。
CS逍遥剑仙
2018/10/11
1.7K0
Sphinx&coreseek实现中文分词索引
如何在CentOS 7上安装和配置Sphinx
Sphinx是一个开源搜索引擎,允许全文搜索。众所周知,它能非常有效地对大数据进行搜索。要编制索引的数据通常来自非常不同的来源:SQL数据库,纯文本文件,HTML文件,邮箱等。
SQL GM
2018/09/28
2.9K0
windows7使用Sphinx+PHP+MySQL详细介绍
由于业务需要,需要做类似淘宝商城商品检索的功能,对于数据量很大的情况,MySQL 查询的效率损耗很大,需要使用专门的索引引擎进行搜索查询,实现功能,对于和 PHP 和 Mysql 的结合的索引引擎中, xunsearch 和 sphinx 是较为著名的,但由于 xunsearch 服务器端不支持 windows,所以暂且先考虑 sphinx 的使用。sphinx 目前已支持简体中文、繁体中文和英文的检索,不需要额外安装插件支持。
程序小工
2018/09/12
2.2K0
如何在Ubuntu 16.04上安装和配置Sphinx
Sphinx是一个开源搜索引擎,允许全文搜索。众所周知,它能非常有效地对大数据进行搜索。要编制索引的数据通常来自非常不同的来源:SQL数据库,纯文本文件,HTML文件,邮箱等。
无敌小笼包
2018/09/28
3.3K0
php_sphinx安装使用
Sphinx的使用背景:在mysql中优化的时候,对varchar,char,text对这些数据进行查询时,如果我们使用like ‘%单词’,是无法使用到索引,如果网站的数据量比较大,会拖垮网站的速度。
全栈程序员站长
2022/07/07
6490
sphinx 配置 及 小内存解决办法
不得不说 sphinx 很消耗内存占用,目前种子网站跑的机器是2G内存的,今天重新试了一下1G内存的vps,正常配置下依旧跑不动 查看 searchd.log 依旧被kill掉了。
上山打老虎了
2022/06/14
1.1K0
搜索引擎技术之概要预览
近些天在学校静心复习功课与梳理思路(找工作的事情暂缓),趁闲暇之际,常看有关搜索引擎相关技术类的文章,接触到不少此前未曾触碰到的诸多概念与技术,如爬虫,网页抓取,分词,索引,查询,排序等等,更惊叹于每一幅精彩的架构图,特此,便有记录下来的冲动,以作备忘。
全栈程序员站长
2022/07/09
6740
搜索引擎技术之概要预览
lucene思维导图,让搜索引擎不再难懂
以上是我们java常用的全文搜索引擎框架,很多项目的搜索功能都是基于以上4个框架完成的。
java思维导图
2018/12/21
1.5K0
lucene思维导图,让搜索引擎不再难懂
【迅搜03】全文检索、文档、倒排索引与分词
今天还是概念性的内容,但是这些概念却是整个搜索引擎中最重要的概念。可以说,所有的搜索引擎就是实现了类似的概念才能称之为搜索引擎。而且今天的内容其实都是相关联的,所以不要以为标题上有四个名词就感觉好像内容很多一样,其实它们都是联系紧密的,一环套一环的。
硬核项目经理
2023/11/24
6240
【迅搜03】全文检索、文档、倒排索引与分词
【迅搜05】索引配置(二)字段定义与设计
经过上篇文章的学习,我们已经了解到了 XS 中的默认索引配置是在哪里,也了解到了配置文件如何加载以及服务端的一些简单配置。今天,我们要学习的重点就是剩下的内容,也是非常重要的内容,那就是索引字段的配置定义以及字段设计。
硬核项目经理
2023/12/01
2450
【迅搜05】索引配置(二)字段定义与设计
Elasticsearch 搜索应用实践(搭建篇)
导语| Elasticsearch (ES)是一个分布式搜索和分析引擎,它能为我们提供全文搜索等各种丰富的功能,You know, for search (and analysis)。此前关于 Elasticsearch 大多都是调优分享、分布式相关,关于基础的文档基本是简单介绍,本文是从文档搜索实践出发介绍如何搭建一个全文搜索平台。本文不做 ES 的介绍,因此看文章需要了解 ES 相关基础知识。本文作者:allencao,腾讯应用开发工程师。 前言 最开始接到过一个需求,将部门内的研究报告与文档管理起来
腾讯云大数据
2021/03/11
1.1K0
【从0做项目】Java搜索引擎(1)
简述:在我的搜索引擎网站,用户进行关键字搜索,就可以查询到与这个关键字相关的java在线文档,(包含标题,关键字附近的简述,url),用户点击标题,即可跳转到相关在线文档,适用于JDK17版本。
三三是该溜子
2025/02/15
960
【从0做项目】Java搜索引擎(1)
【总结】两个月的工作任务总结
从 2018.4.2 工作以来,不知不觉已经工作两个多月,并在昨天约谈从这个月开始转正。从刚开始的自己学习,到逐渐接触公司的项目,并完成交付的功能模块,学到了很多,也发现了自己存在的不足,所以作此总结,激励自己,并鞭策自己,不骄不躁,不悲不怒,养成良好的心态,并坚持学习,保持热情!
程序小工
2018/09/12
1.3K0
自建磁力链搜索网站做老司机
简介 下载类的网站应该是大家经常用到的工具了,特别是一些 BT,PT 一类的网站,最近几年比较火的小型站点一般都是磁力搜索类的,但很多网站鱼龙混杂,广告横生(网站挂广告无可厚非,但是时不时弹出令人尴尬的内容就有点儿嗯。。) 最近看到网友 wenguonideshou 制作并修改的源码,叫 ZSKY,虽然貌似没给正式的命名,但是从 demo 来看,应该是 “纸上烤鱼” 的缩写,这个源码实际上是改自另一款很出名的源码 SSBC(手撕包菜),但手撕包菜的使用说明网上一直只是流传着一些坊间的版本,作者似乎也没有
用户1202364
2018/07/09
8.2K0
Elasticearch 搜索引擎(1
总结: elasticsearch是一个基于Lucene的高扩展的分布式搜索服务器,支持开箱即用。 elasticsearch隐藏了Lucene的复杂性,对外提供Restful 接口来操作索引、搜索。 突出优点:
Java_慈祥
2024/08/06
1450
Elasticearch 搜索引擎(1
【迅搜09】索引管理(二)增删改操作
今天我们来学习真正的,最核心的索引管理相关的操作。但其实今天的内容还更简单一些,为啥呢?因为索引管理中,最核心的就是对于数据的增、删、改呀。其实要往大了说,查询也是针对索引的操作,只不过相对来说,搜索引擎引用往往是读多写少,而且相比数据库来说,它的写还要少一些。
硬核项目经理
2023/12/19
2620
【迅搜09】索引管理(二)增删改操作
搜索引擎原理解析:从0开始实现一个搜索引擎
打开谷歌, 输入关键词, 谷歌往往可以很精准的返回你所需要的内容, 这个是怎么实现的呢?简单的思考一下就能得出一个结论:一定是关键词能极为快速和准确的命中具体的内容及地址, 但是搜索引擎的收录页面数量往往是千亿万亿级别的,从这个量级里面检索到你要的数据可以说是大海捞针一点也不夸张。那么搜索引擎是如何让你在数据的汪洋大海里捞到你想要的那根针的那?这就要说到所有的搜索引擎都离不开一个概念: 索引。
政采云前端团队
2023/12/19
1.4K0
搜索引擎原理解析:从0开始实现一个搜索引擎
SQL Server 使用全文索引进行页面搜索
全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询。全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中。全文索引是一种特殊类型的基于标记的功能性索引,它是由 SQL Server 全文引擎生成和维护的。生成全文索引的过程不同于生成其他类型的索引。全文引擎并非基于特定行中存储的值来构造 B 树结构,而是基于要编制索引的文本中的各个标记来生成倒排、堆积且压缩的索引结构。在 SQL Server 2008 中,全文索引大小仅受运行 SQL Server 实例的计算机的可用内存资
逸鹏
2018/04/09
3K0
SQL Server 使用全文索引进行页面搜索
相关推荐
使用PHP+Sphinx建立高效的站内搜索引擎
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验