php+Sphinx分词中间件的认识和基础使用(亲测)
sphinx安装完毕之后,有两种方式使用
1.安装php拓展
2.调用包里给的sphinxapi.php
这里只介绍调用api的方式。原因:sphinx的php拓展更新的巨慢,不好做系统升级
首先先上图介绍一下各大分词查询中间件,没有更优秀,只有更适合。
图来自:http://www.sphinxsearch.org/archives/492
文章写的相对全面,通俗易懂,可以看看。
sphinx基础使用
性能比较
Windows
Linux
常见错误
性能比较
我想在一个含有55W条数据的表中,查一个关键字。
Mysql:
Sphinx:
Windows
http://sphinxsearch.com/downloads/current/
下载Sphinx 3.1.1(目前最新版),贴一个最基础的配置sphinx.conf
- src1:Source 源,对应每次sphinx数据库操作的内容
- test1:Index 索引,执行src1,并生成日志
- searchd:安装和启动
- src1和test1可以修改
source src1
{type = mysqlsql_host = localhostsql_user = rootsql_pass = rootsql_db = testsql_port = 3306sql_query_pre = SET NAMES utf8sql_query_pre = SET SESSION query_cache_type = OFFsql_query = SELECT * FROM log############ 查询的字段,根据不同的表结构修改# 不建议这种做法,字段设置之后,启动变慢,内存占用变大,直接获取id,再用in查询去数据库里找是最优解sql_field_string = typesql_field_string = post_datasql_field_string = http_responsql_field_string = codesql_field_string = add_timexmlpipe_field = post_data
}index test1
{source = src1############ 目录不存在的话要自己建,下同path = E:\sphinx-3.1.1\data\test1 morphology = nonestopwords =
}indexer
{mem_limit = 32M
}searchd
{listen = 9312listen = 9306:mysql41log = E:\sphinx-3.1.1\log\searchd.logquery_log = E:\sphinx-3.1.1\log\query.logread_timeout = 5max_children = 30pid_file = E:\sphinx-3.1.1\log\searchd.pid
}
将此文件放到bin目录下,我们好来操作和测试。
下面是我的数据表结构
CREATE TABLE `log` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`type` varchar(20) NOT NULL,`post_data` varchar(255) NOT NULL,`http_respon` varchar(100) NOT NULL,`code` varchar(20) NOT NULL,`add_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
打开cmd或者powershell,cd到bin目录,执行命令:
# 这里的test1可以改成--all,sphinx.conf是默认的
.\indexer.exe [-c sphinx.conf] test1
可以看到有一条写入,打开配置文件中的path目录,我这里设置的是data,会发现生成了一系列的.sp*文件。
这边就是sphinx给目标数据做的分词。
我们继续,依旧在bin目录下执行(需要超级管理员权限):
# 安装,如已安装则忽略
.\searchd.exe --install
# 启动sphinx
.\searchd.exe [-c sphinx.conf]
现在,我们试试查询,将api目录里新建一个sphinxSearch.php
api调用文档可以看官方wiki:http://sphinxsearch.com/wiki/doku.php?id=sphinx_manual_chinese#通用api方法
<?phpheader("Content-type:text/html;charset=utf-8");# 引入sphinx接口文件require 'E:\sphinx-3.1.1\sphinxapi.php';$keyword = 'create_time';$sphinx = new SphinxClient();$sphinx->SetServer('localhost',9312);# *表示在所有索引里面进行搜索$result = $sphinx->query($keyword,'*');print_r($sphinx->GetLastError());print_r($result);die;?>
执行 php sphinxSearch.php
可以看到我想要的结果查出来了,这边通常的做法就是,sphinx获取到所有目标的id,再用id去mysql最终结果。
还没完,要想在不停止searchd的情况下想增加sphinx库怎么办?
sphinx这边给出了一个 增量索引 和 合并索引 的概念
以下是给增量索引用的Source 源和index 索引,可以写在同一配置文件sphinx.conf下:
source src2
{type = mysqlsql_host = localhostsql_user = rootsql_pass = rootsql_db = testsql_port = 3306sql_query_pre = SET NAMES utf8sql_query_pre = SET SESSION query_cache_type = OFF############ 需要新增一个config数据表来记录当前sphinx的id,当然也可以找其他方式做新增记录sql_query = SELECT * FROM log where id > (select value from config where name = 'sphinx_max_id')############ 更新完数据,记录当前idsql_query_post = update config set value = (select id from log order by id desc limit 1)# 不建议这种做法,字段设置之后,启动变慢,内存占用变大,直接获取id,再用in查询去数据库里找是最优解sql_field_string = typesql_field_string = post_datasql_field_string = http_responsql_field_string = codesql_field_string = add_timexmlpipe_field = post_data
}
index test1_1
{source = src2path = E:\sphinx-3.1.1\data\test1_1morphology = nonestopwords =
}
数据库截图:
命令行 放到定时任务(需要超级管理员权限):
# 增量索引
.\indexer.exe [-c .\sphinx.conf] test1_1 --rotate
# 增量索引合并 (test1_1合并到test1),当清除增量索引的.sp*文件,或再一次执行增量索引,数据会丢失或被覆盖
.\indexer.exe [-c .\sphinx.conf] --merge test1 test1_1 --rotate
# 如果按照我上面写的方式来新增索引,那么每次增量完一定要合并
当增量执行时,由于数据太多,还没执行完,就执行了合并,这样会造成数据丢失。
在windows下大多数都是用来做本地环境,不会有这种困扰。
这边也建议用Linux来作线上环境,毕竟win搭载个图像,性能肯定有所下降。
有空来更,要睡觉了
Linux
首先一样样,到 http://www.sphinxsearch.org/archives/492 下载源包压缩。
我这里用的是vagrant+虚拟机,可以直接下载放入目录。
贴一下配置文件sphinx.conf,作为测试我放在bin目录下。
配置基础介绍上面有。
里面log和path路径根据各自需求修改,保证目录存在。
source src1
{type = mysqlsql_host = localhostsql_user = rootsql_pass = rootsql_db = testsql_port = 3306sql_query_pre = SET NAMES utf8sql_query_pre = SET SESSION query_cache_type = OFFsql_query = SELECT * FROM logxmlpipe_field = post_data
}
source src2
{type = mysqlsql_host = localhostsql_user = rootsql_pass = rootsql_db = testsql_port = 3306sql_query_pre = SET NAMES utf8sql_query_pre = SET SESSION query_cache_type = OFFsql_query = SELECT * FROM log where id > (select value from config where name = 'sphinx_max_id')sql_query_post = update config set value = (select id from log order by id desc limit 1)xmlpipe_field = post_data
}index test1
{source = src1path = /vagrant/sphinx-3.1.1/data/test1morphology = nonestopwords =
}
index test1_1
{source = src2path = /vagrant/sphinx-3.1.1/data/test1_1morphology = nonestopwords =
}indexer
{mem_limit = 32M
}searchd
{listen = 9312listen = 9306:mysql41log = /vagrant/sphinx-3.1.1/log/searchd.logquery_log = /vagrant/sphinx-3.1.1/log/query.logread_timeout = 5max_children = 30pid_file = /vagrant/sphinx-3.1.1/log/searchd.pid
}
添加索引:
# 这里-c sphinx.conf 要写,不然默认它会去找/etc/sphinx/sphinx.conf
indexer -c sphinx.conf --all
启动:
# 需要sudo权限
searchd -c sphinx.conf# 停止
searchd -c sphinx.conf --stop
查找类sphinxSearch.php
<?phpheader("Content-type:text/html;charset=utf-8");#步骤1:引入sphinx接口文件require './sphinxapi.php';$keyword = '';$sphinx = new SphinxClient();$sphinx->SetServer('localhost',9312);# *表示在所有索引里面进行搜索$result = $sphinx->query($keyword,'*');# 要想在'post_data'字段找关键字'a',要下面这么写。//$result = $sphinx->query("@post_data a",'*');print_r($sphinx->GetLastError());print_r($result);die;?>
其他命令行
# sudo 增量索引
indexer -c sphinx.conf test1_1 --rotate
# 合并索引
indexer -c sphinx.conf --merge test1 test1_1 --rotate
上面有说到,当增量数据很大的时候,还没增量完就合并索引,会导致数据缺失。
解决办法就是
当增量索引的时候,会产生除了test1_1.tmp.spl之外的<.tmp*>缓存文件,写一个脚本去判断是否存在这些文件即可。
常见错误
1.大部分错误都是权限问题,或者是某些目录找不到之类的。
2.我在linux上运行php sphinxSearch.php的时候会有个错误。
searchd error: clisearchd -c sphinx.conf --stopn version (client is v.1.32, daemon is v.1.31)
我找了半天,后来发现,从官网下下来的linux3.*版本,searchd启动之后变成了2.2.11,不明所以。
既然服务端变成了这个版本,客户端我们也去找,客户端指的就是<sphinxapi.php>这个文件。
找到里面的api文件,替换掉当前使用的。
php+Sphinx分词中间件的认识和基础使用(亲测)相关推荐
- IT:后端进阶技术路线图(初级→中级→高级)、后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介、技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略
IT:后端进阶技术路线图(初级→中级→高级).后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介.技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略 目录 后端 ...
- 【文件上传漏洞11】中间件文件解析漏洞基础知识及实验——Nginx
目录 1 文件解析漏洞概述 1.1 概述 1.2 Nginx 解析漏洞 1.2.1 空字节解析漏洞 1.2.2 文件名逻辑漏洞 CVE-2013-4547 1.2.3 CGI-PHP 解析漏洞 2 实 ...
- 用Netty开发中间件:网络编程基础
用Netty开发中间件:网络编程基础 <Netty权威指南>在网上的评价不是很高,尤其是第一版,第二版能稍好些?入手后快速翻看了大半本,不免还是想对<Netty权威指南(第二版)&g ...
- WebLogic管理与维护实战培训(企业级中间件01):基础实战篇
一.WebLogic管理与维护实战培训(企业级中间件)系列课程介绍 风哥WebLogic管理与维护实战培训专题,风哥本专题共6套课程涉及WebLogic基础实战,WebLogic运维管理,WebLog ...
- 计算机辅助设计基础试题,CAD基础知识自测题
CAD基础知识自测题 <CAD基础知识自测题(一)>.本套试题共有三部分,分别为选择填空.判断题和解答题.题目都是基础的关于CAD制图的概念,答案也在题目中标明.另一套关于机械 ...
- sphinx分词搜索
使用背景 在mysql中优化的时候,对varchar,char,text对这些数据进行查询时,如果我们使用like '%单词',是无法使用到索引,如果网站的数据量比较大,会拖垮网站的速度.比如在根据电 ...
- laravel 分词搜索匹配度_elasticsearch基础笔记9-elasticsearch 词项全文搜索
es的核心功能就是搜索和分析.那么我们看看搜索相关内容 1.搜索机制 在进入搜索之前,会对查询体根据情况进行分析和处理. 2.有哪些常用搜索类型 全文查询 词项查询 复合查询 嵌套查询 位置查询 特殊 ...
- 【中间件技术】第三部分 Java企业版规范与中间件(7) EJB构件基础
文章目录 7.1 EJB体系结构 7.1.1 EJB构件概述 1. EJB构件技术 2. EJB构件的特点 3. 在EJB应用中集成遗产系统 4. EJB构件与 `Java Bean` 的比较 7.1 ...
- 【中间件学习】Fluentd基础学习教程
文章目录 引言 安装 推荐的安装方式: 其他安装方式的采坑 测试验证 学习过程 1. 先学习一个简单的采集示例: 2. 学习一下fluentd相关的关键字配置. 日志接入实践 总结 引言 Fluent ...
最新文章
- 5、Java并发性和多线程-相同线程
- 【组合数学】生成函数 ( 线性性质 | 乘积性质 )
- 神经网络到底是如何实现分类的---共振参考系假设
- (二)SpringBoot 整合 JPA
- 【转】Azure云存储及存储账户概述***
- python 为什么只执行一次_python只执行一次
- LeetCode 289. 生命游戏
- 蓝桥杯 ADV-81 算法提高 数的运算
- 响应已被截断_技术:RWD响应式网站网页设计基本原则
- spring Quartz基于配置文件和注解的实现
- php for循环可以变量关联数组,数组与字符串,变量之间的转换+数组元素的回调处理+用for()循环来遍历关联数组...
- MySQL(19)-----日期和时间函数
- txt转excel,添加数据库
- 计算机怎么剪切音乐然后合在一起,怎么在电脑裁剪歌曲 怎么裁剪和拼接音乐...
- python制作脑图_使用Python将xmind脑图转成excel用例(一)
- iOS进阶面试题----多线程
- GISer开发者的技能清单
- 假如我来架构12306网站(一) - 概论
- 唯美烟花特效登录页面,我感觉自己又行了
- 年薪3亿的微信之父,在任何事情上都追求极致,怎么做到的?