当前位置: 首页 > 编程日记 > 正文

【PHP高效搜索专题(1)】sphinxCoreseek的介绍与安装

我们已经知道mysql中带有"%keyword%"条件的sql是不走索引的,而不走索引的sql在大数据量+大并发量的时候,不仅效率极慢还很有可能让数据库崩溃.那我们如何通过某些关键字来搜索我们想要的文章呢? 虽然mysql的MYISAM提供全文索引,但是只支持中文,并且性能却不敢让人恭维,因此采用Sphinx来做mysql的全文索引工具是一个很好的选择.

简介

Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式的XML数据.

  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的安装与使用

安装
wget http://sphinxsearch.com/files/sphinx-2.2.9-release.tar.gz
tar zxvf sphinx-2.2.9-release.tar.gz
cd sphinx-2.2.9-release
./configure --prefix=/usr/local/sphinx/ --with-mysql=/usr/bin/mysql/
make && make install

--prefix:指定 sphinx 的安装路径
--with-mysql:指定 mysql 安装路径,注意这里的安装路径一般是指通过编译安装的mysql路径,如果你是通过yum来安装的mysql的话,此项可以不用加

make的时候,有可能会报错,不要管,继续等待.如果最终失败的话,再make clean之后,删除目录,重新configure.
注意,此时的sphinx还不能支持中文

安装成功后,按道理应该有三个工具

ls /usr/local/sphinx/bin
indexer 创建索引命令
searchd 启动进程命令
search  命令行搜索命令

其中search命令已经在新版本的sphinx取消了,可以用api文件来进行测试;

配置与使用
cd /usr/local/sphinx/etc
ls
example.sql # 示例sql  
sphinx.conf.dist # 完整版配置项 
sphinx-min.conf.dist # 精简版配置项cp sphinx.conf.dist sphinx.conf 
vim sphinx.conf # 配置数据库连接信息,打开utf8字符集注释(sql_query_pre = SET NAMES utf8),然后可以把以上的示例sql导入数据库里面做测试;cd /usr/local/sphinx/bin./indexer --all # 创建索引,如果后面又新增加了数据,还要重新或增量建立sql;
./search this #搜索test库中有this的;注意,在新版本的sphinx里面该命令已经被取消了,但可以通过api文件来测试$ cd sphinx/api 
$ php test.php test

如果执行indexer命令报错

ERROR: index 'test1stemmed': sql_connect: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

则可能是因为mysql.sock的位置问题,在本机中,该位置是/tmp/mysql.sock(与安装mysql时设置有关),在sphinx.conf中取消这一行的注释即可(去掉前面的#号):

#sql_sock                = /tmp/mysql.sock

然而以上的所有步骤都没有什么卵用,因为sphinx是不支持中文的,所以我们可以选择使用基于sphinx的coreseek,也可以选择其他更方便的扩展,本文就先结束coreseek

coreseek

安装
安装mmseg
wget http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gz
tar zxvf coreseek-4.1-beta.tar.gz
cd coreseek-4.1-beta
ls
csft-4.1  #sphinx中文扩展
mmseg-3.2.14 #中文词库
testpack #先安装mmseg中文分词系统
cd mmseg-3.2.14/
./configure --prefix=/usr/local/mmseg 

如果报错 annot find input file: src/Makefile.in
就依次执行:

aclocal   #是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac” ,如果执行此句还是错误的话就 yum -y install libtool  
libtoolize --force 
automake --add-missing
autoconf
autoheader
make clean#然后再从新编译一下
./configure --prefix=/usr/local/mmseg 
make && make intall

测试

$ /usr/local/mmseg/bin/mmseg -d /usr/local/mmseg/etc /usr/src/coreseek-4.1-beta/mmseg-3.2.14/src/t1.txt
中文/x 分/x 词/x 测试/x
中国人/x 上海市/x$ ./mmseg -d ../etc test.txt
小/x 白兔/x 白/x 又/x 白/x 两/x 只/x 耳朵/x 竖/x 起来/x
爱/x 吃/x 萝卜/x 爱/x 吃/x 菜/x
安装csft-4.1
cd /usr/src/coreseek-4.1-beta/csft-4.1
sh buildconf.sh # 如果不报错就代表没问题,如果输出的warning信息可以忽略,如果出现error则需要解决  ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ --with-mysql
make && make install
配置

配置文件

  • 名为main的主数据源:source main{}
  • 继承名为main的增量数据源:source delta:main{}
  • 名为main的主索引:index main{}
  • 继承名为main的增量索引:index delta:main{}
  • 分布式索引:index dist1{}
  • 索引器:indexer{}
  • 服务进程:searchd{}

增量配置肯定是要做的,所以先准备一个计数器

-- 只记录一行数据
CREATE TABLE sph_counter  
(  
counter_id INTEGER PRIMARY KEY NOT NULL,  
max_doc_id INTEGER NOT NULL  
);  
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/cd /etc
cp sphinx.conf.dist csft.conf #复制为csft名后就可以自动读取#主数据源
source main
{type                    = mysqlsql_host                = localhostsql_user                = rootsql_pass                = 123456sql_db                  = testsql_port                = 3306sql_query_pre           = SET NAMES utf8 sql_query_pre           = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM hr_spider_company;#通过replace into语句记录每次建立数据源最后一条数据id;sql_query               = SELECT * FROM hr_spider_company WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) sql_attr_uint            = id                        #从SQL读取到的值必须为整数                                                      sql_attr_uint            = from_id                #从SQL读取到的值必须为整数,不支持全文检索  sql_attr_uint            = link_id                #从SQL读取到的值必须为整数,不支持全文检索  sql_attr_uint            = add_time                #从SQL读取到的值必须为整数,不支持全文检索  sql_field_string         = link_url                 #字符串字段(可全文搜索,可返回原始文本信息)  sql_field_string          = company_name          #字符串字段(可全文搜索,可返回原始文本信息)  sql_field_string          = type_name             #字符串字段(可全文搜索,可返回原始文本信息)  sql_field_string          = trade_name             #字符串字段(可全文搜索,可返回原始文本信息)  sql_field_string          = email                 #字符串字段(可全文搜索,可返回原始文本信息)  sql_field_string          = description             #字符串字段(可全文搜索,可返回原始文本信息)     sql_attr_timestamp      = date_added  #从SQL读取到的值必须为时间戳,作为时间属性sql_query_info_pre      = SET NAMES utf8  #命令行查询时,设置正确的字符集sql_query_info          = SELECT id,from_id,link_id,company_name,type_name,trade_name,address,description, FROM_UNIXTIME(add_time) AS add_time  FROM hr_spider_company  WHERE id=$id                     #用于PHP-CLI命令行查询时,从数据库读取原始数据信息 #区段查询 每次查询一段数据来建立索引#sql_query_range = SELECT MIN(id),MAX(id) FROM documents#sql_range_step  = 1000#sql_query = SELECT * FROM documents WHERE id>=$start AND id<=$end    
}#主数据索引
index main
{source      = main  #对应的source名称path      = /usr/local/coreseek/var/data/main #主数据索引存储路径及其名称docinfo     = externcharset_type    = zh_cn.utf-8min_word_len = 1 #索引词最小长度 min_prefix_len = 0 #最小索引前缀长度 min_infix_len = 1 #最小索引中缀长度ngram_len = 1 #对于非字母型数据的长度切割(for CJK indexing) charset_dictpath = /usr/local/mmseg/etc/ #分词的词典路径,BSD、Linux环境下设置,/符号结尾html_strip    = 0 #是否去除用户输入查询内容的html标签
}#增量数据源
source delta : main  
{  sql_query_pre           = SET NAMES utf8  sql_query               = SELECT * FROM hr_spider_company WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )sql_query_post_index    = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM hr_spider_company
} #增量数据索引
index delta : main  
{  source          = delta  path            = /usr/local/coreseek/var/data/delta 
}source src1throttled : src1
{sql_ranged_throttle = 100
}#全局index定义
indexer
{mem_limit            = 128M  #内存大小限制 默认是 32M, 最大 2047M, 推荐为 256M 到 1024M之间 
}#searchd服务定义
searchd
{# 监测端口及形式,一下几种均可,默认为本机9312端口 # listen = 127.0.0.1 # listen = 192.168.0.1:9312 # listen = 9312 # listen = /var/run/searchd.socklisten                  = 9312 read_timeout            = 5  # 读取超时时间 max_children            = 30 # searche进程的最大运行数 max_matches             = 1000 # 最大的查询结果返回数 seamless_rotate         = 1 # 是否支持无缝切换(做增量索引时需要) preopen_indexes         = 0 # 在启动运行时是否提前加载所有索引文件 unlink_old              = 1 # 是否释放旧的索引文件pid_file = /usr/local/coreseek/var/log/searchd.pid log = /usr/local/coreseek/var/log/searchd.log  # search进程的日志路径 query_log = /usr/local/coreseek/var/log/query.log  # 查询日志地址 binlog_path     =                                              #关闭binlog日志
}
测试
cd  /usr/local/coreseek/bin
./search 淘宝
使用 sphinx 需要做以下几件事

1.有数据;
2.建立 sphinx 配置文件;
3.生成索引;
4.启动 searchd 服务进程,默认是9312
5.用 PHP 去连接 sphinx 服务

#启动服务,监听9312端口
cd /usr/local/coreseek/bin/
./searchd
#./searchd -c /usr/local/coreseek/etc/csft_mysql.conf  #如果配置文件不是默认的csft.conf的话# 执行索引(查询、测试前必须执行一次)
./indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate  # 执行增量索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate # 合并索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0  #为了防止多个关键字指向同一个文档加上--merge-dst-range deleted 0 0# 后台服务测试
/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft_mysql.conf  aaa  #关闭后台服务
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --stop 

searchd 命令参数介绍:

  • -c 指定配置文件
  • --stop 停止服务
  • --pidfile 用来显式指定一个 PID 文件
  • -p 指定端口

自动化建立索引

# 每分钟进行一次增量索引
*/1 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate # 每五分钟合并一次索引
*/5 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0  # 每天晚上的一点三十分建一次完整的索引
30 1 * * *  /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate 

参考

Sphinx中文指南

sphinx全文检索之PHP使用教程

coreseek-4.1 参考手册

coreseek-4.1的一些配置说明(左侧边栏)

Sphinx PHP扩展(类)使用说明

sphinx中文版Coreseek中文检索引擎安装和使用方法(Linux)

转载于:https://www.cnblogs.com/nixi8/p/4746179.html

相关文章:

java 开源sns_JEESNS V1.0发布,JAVA 开源 SNS 社交系统

JEESNS V1.0 发布了&#xff0c;本次更新内容&#xff1a;增加后台管理员授权与取消功能增加私信模块解决在微博页面&#xff0c;左侧微博点赞过后&#xff0c;左侧展示列表小手会变黑&#xff0c;但是右侧热门出小手依然是白色修复后台添加栏目、文章成功后&#xff0c;提示页…

Balanced Binary Tree leetcode java

题目&#xff1a;Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 题解&#xff1a;采用递归…

leaflet地图框架

leaflet 中文API LeafLet js 官网&#xff1a; http://leafletjs.com/index.html LeafLet js 官网demo&#xff1a; http://leafletjs.com/examples.html LeafLet js 官网API&#xff1a; http://leafletjs.com/reference-1.3.0.html L.Map API各种类中的核心部分&#xff0c;用…

NR:UE初始搜网流程

UE的初始搜网流程&#xff0c;PSS->SSS->PBCH->RMSI.我画了一个简单的流程图如下&#xff0c;里面标注了每个环节的重点。 UE的初始搜网流程: 分为SSB同步(包括MIB读取)和RMSI的读取。 1. SSB SSB包括&#xff1a; PSS,SSS,PBCH. UE 在GSCN频点上&#xff0c;搜索…

纯CSS3制作的圆角效果按钮菜单

<!DOCTYPE html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>纯CSS3制作的圆角效果按钮菜单丨曲阳雕塑</title> <style type"text/css"> nav{display: block; wid…

java 左右键_js 区分鼠标左右键点击

oncontextmenu 是右键事件但是滚轮事件并没有获取到, 使用vue可以用middle获取Title.box {width: 200px;height: 200px;background: deepskyblue;}let div document.getElementById(app)div.oncontextmenu function (e) {e.preventDefault();console.log(右键, e.button)};d…

面向对象设计领域的OCP原则

一、OCP简介&#xff08;OCP--Open-Closed Principle &#xff09;&#xff1a;Software entities(classes,modules,functions,etc.) should be open for extension, but closed for modification。软件实体应当对扩展开放&#xff0c;对修改关闭&#xff0c;即软件实体应当在不…

Python教学课程分享9-面向对象编程

面向对象程序设计的思想主要是针对大型软件设计而提出的&#xff0c;它的一个关键性观念是将数据以及对数据的操作封装在一起&#xff0c;组成一个相互依存、不可分割的整体&#xff0c;即不同对象之间通过消息机制来通信或者同步。对于相同类型对象进行分类、抽象后&#xff0…

UE capability与 双连接相关的参数。

UE capability 分为 Network capability 和 Radio capability, 即网络能力和无线能力。 Netowrk Capability UE 在做Attach Request 时会主动上报自己的网络能力&#xff1b;Radio Capability 网络侧下发Enquiry Capability来请求UE无线能力&#xff0c;UE 回复capability inf…

Linux下Tomcat的安装配置

Linux下Tomcat的安装配置 一.下载安装对应的jdk,并配置Java环境。 官网下载地址&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html 下载将jdk加压后放到/usr/local目录下&#xff1a; [rootmaster ~]#chmod 755 jdk-6u5-li…

python登录代码思路_用python登录Dr.com思路以及代码分享

用python登录Dr.com思路以及代码分享发布于 2014-08-28 22:31:52 | 192 次阅读 | 评论: 0 | 来源: 网友投递Python编程语言Python 是一种面向对象、解释型计算机程序设计语言&#xff0c;由Guido van Rossum于1989年底发明&#xff0c;第一个公开发行版发行于1991年。Python语法…

postgresql开发中可能有用的知识

2019独角兽企业重金招聘Python工程师标准>>> postgresql手册 一、PostgreSQL中可以直接对时间进行加减运算&#xff1a; 查询系统当前时间&#xff1a; select now();或者select current_timestamp;SELECT now()::timestamp 1 year; --当前时间加1年SELECT now():…

css实现 textarea 高度自适应

此textarea非彼textarea &#xff0c;有经验的老司机们应该知道html标签contenteditable这个属性。 利用此属性使当前的标签成为可以输入的状态&#xff0c;等同于输入框。 演示地址&#xff1a;https://xibushijie.github.io/static/textareaHeihgAuto.html <!DOCTYPE html…

LTE PUCCH Format1

PUCCH 格式 1/1a/1b 是向eNodeB传递1或2或4位数据。 这个过程相当复杂&#xff0c;我们用如下3个章节来描述&#xff1a; PUCCH Format 1,1a,1b 所在RB位置PUCCH F1信号的生成PUCCH 多UE 复用 PUCCH Format 1,1a,1b 所在RB位置 LTE中有很多课题(尤其是物理层)&#xff0c;如…

innodb force recovery

innodb force recovery的6种设置&#xff1a; 1.innodb force recovery1&#xff0c;即使发现了损坏页面也继续让服务器继续运行&#xff0c;这个选项对于备份或者转存当前数据尤为有用2.innodb force recovery2&#xff0c;阻止恢复主线程的运行&#xff0c;如果清除操作会导致…

随机森林 java_机器学习weka,java api调用随机森林及保存模型

工作需要&#xff0c;了解了一下weka的java api&#xff0c;主要是随机森林这一块&#xff0c;刚开始学习&#xff0c;记录下。了解不多&#xff0c;直接上demo&#xff0c;里面有一些注释说明&#xff1a;package weka;import java.io.File;import weka.classifiers.Classifie…

[转载]64位linux安装WPS

2019独角兽企业重金招聘Python工程师标准>>> 网上下载了最新的WPS&#xff0a;.deb 安装后发现运行不了。&#xff08;点Unity > WP搜出来的图标&#xff09; 还以为安装有问题。于是重装了几次。还是不成功。 然后打开终端 wps 原来是程序出错了 提示找不到/opt…

mybatis报错There is no getter for property named '***' in 'class ***'

mybatis报错There is no getter for property named *** in class ***&#xff0c; 检查一看是xml中映射字段拼写错误&#xff0c;大小写。 有的时候用插件生成了原始的代码没问题&#xff0c;增加了一个字段在没有再自动生成的时候&#xff0c; 喜欢自己手动加一部分进去&…

LTE - PUCCH Format2

LTE中有很多课题(尤其是物理层)&#xff0c;如果不仔细阅读规范中给出的每个参数和方程&#xff0c;是无法解释清楚的。物理资源分配就是其中之一。 PUCCH格式2/2a/2b的物理资源分配由以下过程确定。看到这些公式千万不要惊慌&#xff0c;方程本身就是高中数学的一部分&#xf…

数据绑定(Binding)

Windows Presentation Foundation (WPF) 中的数据绑定为应用程序提供了一种简单、一致的数据表示和交互方法。元素能够以公共语言运行时 (CLR) 对象和 XML 形式绑定到来自各种数据源的数据。 什么是数据绑定&#xff1f; 数据绑定是在应用程序 UI 与业务逻辑之间建立连接的过程…

java exception源码_Java异常之 Error 和 Exception

简单了解 Java 异常1、实际工作中&#xff0c;遇到的情况不可能是非常完美的。比如&#xff1a;你写的某个模块&#xff0c;用户输入不一定符合你的要求&#xff1b;你的程序要打开某个文件&#xff0c;这个文件可能不存在或者文件格式不对&#xff1b;你要读取数据库的数据&am…

面向对象解决了全局变量问题?

2019独角兽企业重金招聘Python工程师标准>>> 全局变量的应用场景 程序中的某些资源之多能有一个&#xff0c;比如计数器、配置信息、程序运行状态等&#xff0c;而且许多地方需要访问他&#xff0c;那么这个资源就应该&#xff0c;也只能设置成全局变量。在稍微大点…

物理层UL基本流程

物理层发端的基本流程在36.211/36.212(NR:38.211/38.212)中有详细的描述&#xff0c;现在归纳如下。下面列出的每个步骤对于某些信道而言可能会增加其它步骤&#xff0c;也可能有些步骤不需要。 CRC 相关 信道编码(channel coding) LTE: NR: 加扰-Scrambling 加扰过程是da…

java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

import java.util.ArrayDeque;import java.util.Queue;import java.util.Stack;//二叉树的建树&#xff0c;前中后 递归非递归遍历 层序遍历//Node节点class Node {int element;Node left;Node right;public Node() {}public Node(int element) {this.element element;}}// Bi…

html5小趣味知识点系列(一)autofocus

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>autofocus</title> </head> <body><input type"text" autofocus value"页面中只能有一个哦"><!-- 如…

cisco aaa 授权后门测试

最近遇到一个客户aaa没有正确的配置&#xff0c;导致自己被关在设备外面的case&#xff1b;由于是生产环境的多交换机堆叠单元&#xff0c;重启忽略配置也是不允许的&#xff0c;且必须远程操作解决&#xff0c;无疑提升了解决问题的难度。多次尝试后发现通过cisco acs上的一些…

hive的基本命令

创建表 CREATE TABLE pokes (foo INT, bar STRING); 创建表并创建索引字段ds CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING); 显示所有表 SHOW TABLES; 按正条件&#xff08;正则表达式&#xff09;显示表&#xff0c; SHOW TABLES .*s; 表添加一列…

MMSE(Minimum Mean Square Error)

MMSE是一种最小化接收数据的MSE(均方误差)的模型。关于这句话&#xff0c;你的脑海里就会出现很多问题: 什么是均方误差? “最小化MSE”的物理意义是什么? 让我们从一个我们现在非常熟悉的信道模型开始. MMSE作为一种均衡器&#xff0c;是一种后处理算法&#xff0c;它帮助…

java控制台两个字符串_java控制台输入字符串

实验要求: 1/7 1.掌握 JDK 的安装及参数配置方法,能在控制台界面使用 Java 命令进行 Java 程序的编译及运行。 2.掌握 Eclipse 软件安装方法。3.掌握在 ......习题1. 数据类型转换应用【案例简介】下例说明了整型、浮点型、字符串型之间的相互转换。 【案例目的】掌握 Java 中两…

lua单链表实现

List {}--创建一个节点function List.new(val)return {pnext nil, value val}end--往一个节点后添加一个节点function List.addNode(nodeParent, nodeChild)nodeChild.pnext nodeParent.pnextnodeParent.pnext nodeChildreturn nodeChildend--输出链表function List.print…