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分词中间件的认识和基础使用(亲测)相关推荐

  1. IT:后端进阶技术路线图(初级→中级→高级)、后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介、技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略

    IT:后端进阶技术路线图(初级→中级→高级).后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介.技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略 目录 后端 ...

  2. 【文件上传漏洞11】中间件文件解析漏洞基础知识及实验——Nginx

    目录 1 文件解析漏洞概述 1.1 概述 1.2 Nginx 解析漏洞 1.2.1 空字节解析漏洞 1.2.2 文件名逻辑漏洞 CVE-2013-4547 1.2.3 CGI-PHP 解析漏洞 2 实 ...

  3. 用Netty开发中间件:网络编程基础

    用Netty开发中间件:网络编程基础 <Netty权威指南>在网上的评价不是很高,尤其是第一版,第二版能稍好些?入手后快速翻看了大半本,不免还是想对<Netty权威指南(第二版)&g ...

  4. WebLogic管理与维护实战培训(企业级中间件01):基础实战篇

    一.WebLogic管理与维护实战培训(企业级中间件)系列课程介绍 风哥WebLogic管理与维护实战培训专题,风哥本专题共6套课程涉及WebLogic基础实战,WebLogic运维管理,WebLog ...

  5. 计算机辅助设计基础试题,CAD基础知识自测题

    CAD基础知识自测题       <CAD基础知识自测题(一)>.本套试题共有三部分,分别为选择填空.判断题和解答题.题目都是基础的关于CAD制图的概念,答案也在题目中标明.另一套关于机械 ...

  6. sphinx分词搜索

    使用背景 在mysql中优化的时候,对varchar,char,text对这些数据进行查询时,如果我们使用like '%单词',是无法使用到索引,如果网站的数据量比较大,会拖垮网站的速度.比如在根据电 ...

  7. laravel 分词搜索匹配度_elasticsearch基础笔记9-elasticsearch 词项全文搜索

    es的核心功能就是搜索和分析.那么我们看看搜索相关内容 1.搜索机制 在进入搜索之前,会对查询体根据情况进行分析和处理. 2.有哪些常用搜索类型 全文查询 词项查询 复合查询 嵌套查询 位置查询 特殊 ...

  8. 【中间件技术】第三部分 Java企业版规范与中间件(7) EJB构件基础

    文章目录 7.1 EJB体系结构 7.1.1 EJB构件概述 1. EJB构件技术 2. EJB构件的特点 3. 在EJB应用中集成遗产系统 4. EJB构件与 `Java Bean` 的比较 7.1 ...

  9. 【中间件学习】Fluentd基础学习教程

    文章目录 引言 安装 推荐的安装方式: 其他安装方式的采坑 测试验证 学习过程 1. 先学习一个简单的采集示例: 2. 学习一下fluentd相关的关键字配置. 日志接入实践 总结 引言 Fluent ...

最新文章

  1. 5、Java并发性和多线程-相同线程
  2. 【组合数学】生成函数 ( 线性性质 | 乘积性质 )
  3. 神经网络到底是如何实现分类的---共振参考系假设
  4. (二)SpringBoot 整合 JPA
  5. 【转】Azure云存储及存储账户概述***
  6. python 为什么只执行一次_python只执行一次
  7. LeetCode 289. 生命游戏
  8. 蓝桥杯 ADV-81 算法提高 数的运算
  9. 响应已被截断_技术:RWD响应式网站网页设计基本原则
  10. spring Quartz基于配置文件和注解的实现
  11. php for循环可以变量关联数组,数组与字符串,变量之间的转换+数组元素的回调处理+用for()循环来遍历关联数组...
  12. MySQL(19)-----日期和时间函数
  13. txt转excel,添加数据库
  14. 计算机怎么剪切音乐然后合在一起,怎么在电脑裁剪歌曲 怎么裁剪和拼接音乐...
  15. python制作脑图_使用Python将xmind脑图转成excel用例(一)
  16. iOS进阶面试题----多线程
  17. GISer开发者的技能清单
  18. 假如我来架构12306网站(一) - 概论
  19. 唯美烟花特效登录页面,我感觉自己又行了
  20. 年薪3亿的微信之父,在任何事情上都追求极致,怎么做到的?

热门文章

  1. oracle怎么从右边截取,Oracle 字符串截取 从后向前截取方法
  2. 内存卡没有Android,安卓内存卡读不出来怎么办
  3. Spring微服务实战第1章 欢迎迈入云世界,Spring
  4. mikrotik桥接TP-link教程
  5. Android Muti-Window
  6. 小程序动态隐藏分享按钮
  7. BUPT OJ143 Triangle
  8. php微信摇一摇开发文档,摇一摇事件通知
  9. python计算复数的辐角_python做傅里叶变换
  10. 计算机学院机考,东华大学2015年计算机学院研究生复试上机考真题.docx