sphinx
编译安装:./configure --prefix=/usr/local/sphinx --with-msyql=/usr/local/mysql
使用mysql作为数据源 静
sphinx监听在9312端口,给其他程序提供调用
sphinx 索引
词 --> 词所对应的文本ID
php请求sphinx一个词语,shpinx去索引检索这个词语所对应的文本ID,然后返回文本ID,php根据
文本id去mysql取对应的文本
shpinx创建索引
将文本提取出来传递给分词组件,分词组件会把词全部拆分,分词组件把拆分好的词传给语言处理组件,语言处理组件会把词语还原成原来的样子
比如说把过去式的词还原为原来的词语,把词语排序,去重得到唯一值,把词传给索引组件,
索引组件会把词对应相应的文本ID形成索引
分词组件
1,将文档分成一个一个单独的单词
2,去除标点
3,去除停词(如is a this,中文的 是 这个)
经过分词后得到的结果称为词元
词元经过语言处理组件后得到词
文档频率和词频
文档频率是指在几篇文档出现过,词频就是出现过几次
sphinx索引表
词--->文档频率--->文档号1--->词频--->文档号2--->词频......
如:love 2 1 3 2 1....
如何进行搜索
1,用户提交查询语句
2,sphinx对查询语句进行语法词法分析语言处理
3,搜索索引得到对应的文档
4,对文档进行排序
缺点:
必须要有主键
主键必须为整型
不负责数据存储
配置复杂
php要用sphinx要安装shpinx模块,就像安装xcache一样不过在这之前要
cd coreseek-3.2.14/csft-3.2.14/api/libsphinxclient/
./configure
make && make install
tar xf sphinx-1.1.0
cd sphinx-1.1.0
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx
make && make install
vim /etc/php.ini
extension=sphinx.so
编译安装后命令
indexer 创建索引命令,searchd 启动进程命令 search 命令行搜索命令
---------------
中文分词
分词算法:
1,基于字符串匹配
2,基于理解
3,基于统计
字符串匹配
又叫机械分词,基于字典的
在足够大的字典中进行词条匹配,若找到就匹配成功
三个要素:词典,文本扫描顺序,匹配原则
-------------
配置文件
Source 源名称1{
#添加数据源,这里会设置一些连接数据库的参数比如数据库的IP、用户名、密码等
#设置sql_query、设置sql_query_pre、设置sql_query_range等后面会结合例子做详细介绍
……
}
Index 索引名称1{
Source=源名称1
#设置全文索引
……
}
Indexer{
#设置Indexer程序配置选项,如内存限制等
……
}
Searchd{
#设置Searchd守护进程本身的一些参数
……
}
Source和Index都可以配置多个。
#定义一个数据源
source search_main
{
#定义数据库类型
type = mysql
#定义数据库的IP或者计算机名
sql_host = localhost
#定义连接数据库的帐号
sql_user = root
#定义链接数据库的密码
sql_pass = test123
#定义数据库名称
sql_db = test
#定义连接数据库后取数据之前执行的SQL语句
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF
#创建一个sph_counter用于增量索引
sql_query_pre = CREATE TABLE IF NOT EXISTS sph_counter \
( counter_id INTEGER PRIMARY KEY NOT NULL,max_doc_id INTEGER NOT NULL)
#取数据之前将表的最大id记录到sph_counter表中
sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(searchid) FROM v9_search
#定义取数据的SQL,第一列ID列必须为唯一的正整数值
sql_query = SELECT searchid,typeid,id,adddate,data FROM v9_search where \
searchid<( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) \
and searchid>=$start AND searchid<=$end
# sql_attr_uint和sql_attr_timestamp用于定义用于api过滤或者排序,写多行制定多列
sql_attr_uint = typeid
sql_attr_uint = id
sql_attr_timestamp = adddate
#分区查询设置
sql_query_range = SELECT MIN(searchid),MAX(searchid) FROM v9_search
#分区查询的步长
sql_range_step = 1000
#设置分区查询的时间间隔
sql_ranged_throttle = 0
#用于CLI的调试
sql_query_info = SELECT * FROM v9_search WHERE searchid=$id
}
#定义一个增量的源
source search_main_delta : search_main
{
sql_query_pre = set names utf8
#增量源只查询上次主索引生成后新增加的数据
#如果新增加的searchid比主索引建立时的searchid还小那么会漏掉
sql_query = SELECT searchid,typeid,id,adddate,data FROM v9_search where \
searchid>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) \
and searchid>=$start AND searchid<=$end
sql_query_range = SELECT MIN(searchid),MAX(searchid) FROM v9_search where \
searchid>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}
#定义一个index_search_main索引
index index_search_main
{
#设置索引的源
source = search_main
#设置生成的索引存放路径
path = /usr/local/coreseek/var/data/index_search_main
#定义文档信息的存储模式,extern表示文档信息和文档id分开存储
docinfo = extern
#设置已缓存数据的内存锁定,为0表示不锁定
mlock = 0
#设置词形处理器列表,设置为none表示不使用任何词形处理器
morphology = none
#定义最小索引词的长度
min_word_len = 1
#设置字符集编码类型,我这里采用的utf8编码和数据库的一致
charset_type = zh_cn.utf-8
#指定分词读取词典文件的位置
charset_dictpath = /usr/local/mmseg3/etc
#不被搜索的词文件里表。
stopwords = /usr/local/coreseek/var/data/stopwords.txt
#定义是否从输入全文数据中取出HTML标记
html_strip = 0
}
#定义增量索引
index index_search_main_delta : index_search_main
{
source = search_main_delta
path = /usr/local/coreseek/var/data/index_search_main_delta
}
#定义indexer配置选项
indexer
{
#定义生成索引过程使用索引的限制
mem_limit = 512M
}
#定义searchd守护进程的相关选项
searchd
{
#定义监听的IP和端口
#listen = 127.0.0.1
#listen = 172.16.88.100:3312
listen = 3312
listen = /var/run/searchd.sock
#定义log的位置
log = /usr/local/coreseek/var/log/searchd.log
#定义查询log的位置
query_log = /usr/local/coreseek/var/log/query.log
#定义网络客户端请求的读超时时间
read_timeout = 5
#定义子进程的最大数量
max_children = 300
#设置searchd进程pid文件名
pid_file = /usr/local/coreseek/var/log/searchd.pid
#定义守护进程在内存中为每个索引所保持并返回给客户端的匹配数目的最大值
max_matches = 100000
#启用无缝seamless轮转,防止searchd轮转在需要预取大量数据的索引时停止响应
#也就是说在任何时刻查询都可用,或者使用旧索引,或者使用新索引
seamless_rotate = 1
#配置在启动时强制重新打开所有索引文件
preopen_indexes = 1
#设置索引轮转成功以后删除以.old为扩展名的索引拷贝
unlink_old = 1
# MVA更新池大小,这个参数不太明白
mva_updates_pool = 1M
#最大允许的包大小
max_packet_size = 32M
#最大允许的过滤器数
max_filters = 256
#每个过滤器最大允许的值的个数
max_filter_values = 4096
}
二、sphinx的管理
1. 生成Sphinx中文分词词库(新版本的中文分词库已经生成在了/usr/local/mmseg3/etc目录下)
cd /usr/local/mmseg3/etc
/usr/local/mmseg3/bin/mmseg -u thesaurus.txt
mv thesaurus.txt.uni uni.lib
2. 生成Sphinx中文同义词库
#同义词库是说比如你搜索深圳的时候,含有深圳湾等字的也会被搜索出来
/data/software/sphinx/coreseek-3.2.14/mmseg-3.2.14/script/build_thesaurus.py unigram.txt > thesaurus.txt
/usr/local/mmseg3/bin/mmseg -t thesaurus.txt
将thesaurus.lib放到uni.lib同一目录
3. 生成全部索引
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf �Call
若此时searchd守护进程已经启动,那么需要加上―rotate参数:
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --all --rotate
4. 启动searchd守护进程
/usr/local/coreseek/bin/searchd --config /usr/local/coreseek/etc/sphinx.conf
5. 生成主索引
写成shell脚本,添加到crontab任务,设置成每天凌晨1点的时候重建主索引
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --rotate index_search_main
6. 生成增量索引
写成shell脚本,添加到crontab任务,设置成每10分钟运行一次
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --rotate index_search_main_delta
7. 增量索引和主索引的合并
写成shell脚本,添加到计划任务,每15分钟跑一次
/usr/local/coreseek/bin/indexer --config /usr/local/coreseek/etc/sphinx.conf --merge index_search_main index_search_main_delta --rotate
8. 使用search命令在命令行对索引进行检索
/usr/local/coreseek/bin/search --config /usr/local/coreseek/etc/sphinx.conf 游戏
网站编码要统一UTF-8
---------------
【编译分词库mmseg3】
1、首先给 新版本号 命名的目录下的configure文件赋予可执行权限 chmod u+x configure
2 在所编译版本目录下执行
cd mmseg3 && chmod +x bootstrap configure
./bootstrap #输出的warning信息可以忽略,如果出现error则需要解决
./configure --prefix=/data/postmall/repository/mmseg3
make && make install
cd /data/postmall/search/
ln -snf /data/postmall/repository/mmseg3 mmseg
【编译sphinx】
1、首先给 新版本号 命名的目录下的configure文件赋予可执行权限 chmod u+x configure
2、在所编译版本目录下执行--编译
./configure --prefix=/data/postmall/repository/sphinx2/sphinx.{版本号} --with-mmseg-includes=/data/postmall/search/mmseg/include/mmseg --with-mmseg-libs=/data/postmall/search/mmseg/lib --enable-id64
3、make install
*【注意】如果在进行第3步make过程中报错,需要做以下更改,目的是引入mmseg的库文件和lib文件
修改src/Makefile
在以下俩项后添加
LIBS为LIBS=-L/data/postmall/search/mmseg/lib -lmmseg -lrt
CPPFLAGS为 CPPFLAGS=-I/data/postmall/search/mmseg/include/mmseg
make install
4拷贝sphinx配置文件以及 mmseg生成的库文件至新目录
cd /data/postmall/search/sphinx2
cp mmseg.ini uni.lib /data/postmall/repository/sphinx2/sphinx.{版本号}
cp ./etc/* /data/postmall/repository/sphinx2/sphinx.{版本号}/etc/
5 停止API 的JAVA程序以及 增量推送程序searchBox{35 36} (注意 俩组类型不同,这里的操作也不同, 选择当前环境进行执行)
ps -ef|grep RTSE.Interface|awk '{print $2}'|xargs kill -9
ps -ef|grep searchb|awk '{print $2}'|xargs kill -9
5 停止API的TOMCAT以及增量推送程序 RTSE_Indexer (55 58 59)
ps -ef|grep tomcat1|awk '{print $2}'|xargs kill -9
ps -ef|grep RTSE_indexer|awk '{print $2}'|xargs kill -9
6 停止sphinx2 (注意 不同项目sphinx2后面的配置文件不同,主要是在启动命令后加--stop进行停止)
/data/postmall/search/sphinx2/bin/searchd -c /data/postmall/search/sphinx2/etc/psbc_score_mall_listing.conf --stop
7 做软连接 进行版本更新
cd /data/postmall/search,然后 ln -snf /data/postmall/repository/sphinx2/sphinx.{版本号}/ sphinx2
8启动sphinx2
/data/postmall/search/sphinx2/bin/searchd -c /data/postmall/search/sphinx2/etc/psbc_score_mall_listing.conf
9进行sphinx2功能检查
mysql -h0 �CP 6906 // 检查连通性
mysql> show LISTING; //检查索引完整、存在
mysql> desc LISTING; // 检查索引结构
mysql> select * from LISTING; // 检查索引数据采样
mysql> select count(*) from LISTING; // 检查索引汇总功能
mysql> select * from LISTING where id = -1; // 选择一个未被占用的数值准备测试插入、删除,推荐-1
mysql> insert into LISTING (id) values(-1); // 检查索引可以insert
mysql> select * from LISTING where id = -1; // 检查索引可以insert后可select
mysql> delete from LISTING where id = -1; // 检查索引可以delete
mysql> select * from LISTING where id = -1; // 检查索引可以insert后可select
mysql>\q // 结束测试
10 启动api进程以及增量推送进程
35,36
====
/usr/local/jdk/bin/java -jar /data/postmall/repository/RTSE.Interface/RTSE.Interface.jar -k startService >/dev/null &
/usr/local/jdk/bin/java -jar /home/web/searchb/searchbox.jar -k maall >/dev/null 2>&1 &
====
55,58,59
~/t1_restart.sh
/usr/local/jdk/bin/java -jar /data/postmall/search/RTSE.Indexer/RTSE.Indexer.jar -k startService > /dev/null 2>&1 &
---------------
安装coreseek
tar xf coreseek
1,先安装mmseg
yum -y install glibc-common libtool autoconf automake mysql-devel expat-devel gcc-c++
cd mmseg-3.2.14
#automake
./bootstrap
./configure --prefix=/usr/local/mmseg
make && make install
测试
[root@node3 mmseg-3.2.14]# /usr/local/mmseg/bin/mmseg -d /usr/local/mmseg/etc src/t1.txt
中文/x 分/x 词/x 测试/x
中国人/x 上海市/x
具体步骤看官网
http://www.coreseek.cn/products-install/install_on_bsd_linux/
2,安装csft
cd csft-3.2.14
sh buildconf.sh #输出的warning信息可以忽略,如果出现error则需要解决
./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg=/usr/local/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ --with-mysql=/usr/local/mysql
make && make install
##配置测试,测试是否可以正确运行
$ /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx-min.conf.dist
mysql数据源的配置可参考testpack/etc/csft_mysql.conf文
词典的构造
cp一个配置文件
cp spinx.conf.dist csft.conf
注释stopwords wordfomns excptions
增量索引
在mysql里创建一个表,用于记录在建立完全索引时最大的文本ID值
mysql> create table sph_counter(counter_id int unsigned auto_increment primary key,max_doc_id int);
mysql> insert into sph_counter select 1,2;
mysql> select * from sph_counter;
+------------+------------+
| counter_id | max_doc_id |
+------------+------------+
| 1 | 2 |
+------------+------------+
1 row in set (0.00 sec)
mysql> replace into sph_counter select 1,3;
mysql> select * from sph_counter;
+------------+------------+
| counter_id | max_doc_id |
+------------+------------+
| 1 | 3 |
+------------+------------+
1 row in set (0.00 sec)
用于更新计数器表
sql_query_pre = replace into sqh_counter select 1,max(id) from t1
主数据源语句
sql_query = select id,tit,cnt from t1 where id<=(select max_doc_id from sph_counter where counter_id=1)
增量数据源语句
sql_query = select id,tit,cnt from t1 where id>(select max_doc_id from sph_counter where counter_id=1)
分区段查询
# in sphinx.conf
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
如果这个表(documents)中,字段ID的最小值和最大值分别是1 和2345,则sql_query将执行3次:
将 $start 替换为1,并且将 $end 替换为 1000;
将 $start 替换为1001,并且将 $end 替换为 2000;
将 $start 替换为2001,并且将 $end 替换为 2345.
显然,这对于只有2000行的表,分区查询与整个读入没有太大区别,但是当表的规模扩大到千万级(特别是对于MyISAM格式的表),分区区段查询将提供一些帮助。
4.7. 分布式搜索
为提高可伸缩性,Sphnix提供了分布式检索能力。分布式检索可以改善查询延迟问题(即缩短查询时间)和提高多服务器、多CPU或多核环境下的吞吐率(即每秒可以完成的查询数)。这对于大量数据(即十亿级的记录数和TB级的文本量)上的搜索应用来说是很关键的。
其关键思想是对数据进行水平分区(HP,Horizontally partition),然后并行处理。
在不同服务器上设置Sphinx程序集(indexer和searchd)的多个实例;
让这些实例对数据的不同部分做索引(并检索);
在searchd的一些实例上配置一个特殊的分布式索引;
然后对这个索引进行查询.
agent = specification:remote-indexes-list
specification = hostname ":" port | path
“hostname”是远程主机名,“port”是远程TCP端口,而“remote-index-list”是一个逗号分隔的远程索引列表。
全部代理会被并行搜索。然而同一个代理的多个索引是依次搜索的。这使您可以根据硬件来优化配置。
利用分布式索引给本地加速
index dist
{
type = distributed
local = chunk1
agent = localhost:9312:chunk2
agent = localhost:9312:chunk3
agent = localhost:9312:chunk4
}
注意其中一块是本地搜索的,而同一个searchd示例又向本身查询,以便并行地启动其他三个搜索。
index poi_dist
{
type = distributed #### 设置为分布式搜索
local = poi_name #### 设置查询本地全量索引
local = poi_name_incr #### 设置查询本地增量索引
local = poi_rt #### 设置查询本地实时索引
agent = srv24:9340:poi_name #### 也可以通过agent来进行查询远程全量索引
}
示例:
agent = localhost:9312:chunk2 # contact itself
agent = /var/run/searchd.s:chunk2
agent = searchbox2:9312:chunk3,chunk4 # search remote indexes
1:主配置文件 dist.conf
source sour1{}建立源1
index index1{}建立索引1
index dist{
type = distributed //表示为分布式
local = index1 //本地索引
agent = localhost:9311:index2 //分布式其它索引ip地址端口和索引名称 可以有多个
}
searchd{
listen = 9312
pid_file = F:/www/sphinx/data/searchd_mysql.pid
}
2:第二个配置文件 dist1.conf
source source2{}
index index2{}
searchd{
listen = 9311//这里的端口和pid_file一定不要和上面的重复,应为这要分别开始守护进程的,避免冲突
pid_file = F:/www/sphinx/data/searchd_mysqls.pid
}
然后先开dist1.conf的searchd守护,然后再开dist.conf守护,就可以用了,