Sphinx全文检索
什么是全文检索
结构化数据:指具有固定格式或有限制长度的数据,如数据库,元数据等
非结构化数据:指没有固定格式或不定长的数据,非结构化数据还有一种叫法:全文数据。如邮件,word文档等
对结构化数据的收索:sql语句,再如对windows的收索:文件名,类型,修改时间。
对非结构化数据的收索:如windows对文件内容的收索,linux下的grep命令,再如google和baidu可以收索大量内容数据
全文检索分成两种:顺序扫描和索引扫描。
顺序扫描:如要找到内容包含某个字符串的文件,会一个文档一个文档的从头到尾地找,如like查找。
索引扫描:把非结构化数据中的内容提取出来一部分重新组织,让它变成有结果化,这部分我们提取出来的数据就叫索引。
全文检索大体分成两个过程:索引创建(indexing)和收索索引(search)
索引创建:将现实世界中所有的结构化和非结构化的数据提取信息,创建索引的过程。
收索索引:就是得到用户的查询请求,收索创建的索引,然后返回果的过程。
Sphinx的优点
Sphinx是sql phrase index(查询词组索引)的缩写,sphinx是一个基于sql的全文检索索引,sphinx全文检索引擎,coreseek支持中文分词的全文检索引擎
Sphinx创建索引过程:
一些需要创建索引的文档(documents);
将文档传给分词组件(tokenizer);
将得到的词元(token)传给语言处理组件(LinguisticProcessor);
将得到的词(term)传给索引组件(indexer)。
Sphinx收索索引过程
用户输入查询语句
对查询语句进行词法解析,语法分析,及语言处理
搜索索引,得到符合语法树的文档
根据得到的文档和查询语句的相关性,对结果进行排序
什么是中文分词
什么时候使用sphinx
Sphinx实验手册
环境准备
Linux-5.5mysql-5.1 apache-2.2.9 php5.2.6
Sphinx-0.9.9-releasehttp://www.sphinxsearch.com/downloads/sphinx0.9.9.tar.gz
coreseek-3.2.14.tar.gz中文分词
sphinx-1.1.0.tgzphp里的模块
准备mysql数据
Createtable post(
Id int unsigned auto_increment primary key,
Title varchar(200),
Content text);
Insertinto post(Id,Title,content) values (“linux”,”linux1234567”,”linux is good”);
Insertinto post(Id,Title,content) values (“windows”,”windows1234567”,”windows isbad”);
Insertinto post(Id,Title,content) values (“freebsd”,”freebsd1234567”,”freebsd is verygood”);
安装sphinx
Tarxzf sphinx0.9.9.tar.gz
Cdsphinx0.9.9
./configure--prefix=/usr/local/sphinx �Cwith-mysql=/usr/local/mysql
Make&& make install
简单测试sphinx
Sphinx的bin/中有三个主要命令,indexer创建索引,searchd启动进程命令,search搜索命令。
配置sphinx
Cpsphinx.conf.dist sphinx.conf
Vimsphinx.conf (配置文件结构主数据源source main{}; 增量数据源source delta:main{}; 主数据索引index main{}; 增量数据索引index delta:main{}; 分布式索index dist1{}; 索引器indexer{}; 服务进程searchd{})。
Source src1{
Type = mysql
Sql_host = localhost
Sql_user = root
Sql_pass = 123
Sql_db = post
Sql_port = 3306
Sql_sock = /tmp/mysql.sock
Sql_query_pre = SET NAMES UTF8
Sql_query_pre = SET SESSION query_cache_type = OFF
Sql_query = SELECT Id,Title,Content FROM post
#sql_attr_uint = group_id #order
#sql_attr_timestamp= data_added #order
Sql_query_info = SELECT * FROM post WHERE Id=$Id
}
Source srclthottled:src1 #继承主数据源
Index text1{
Source = src1
Charset_type = utf-8
Charset_table =
Path= /var/data/test1
}
增量数据源加注释::setnu :480,484s/^/#/g
分布式加注释: 491,522s/^/#/g
Indexer{
mem_limit = 100
}
创建索引
命令是indexer
-c 指定配置文件
--all 对所有索引重新编制索引
--rotate用于轮换索引,在不停止服务的时候,增加索引
--merge合并索引
/usr/local/sphinx/bin/indexer-c/usr/local/sphinx/etc/sphinx.conf �Call
测试搜索
指令search
/usr/local/sphinx/bin/search-c /usr/local/sphinx/etc/sphinx.conf linux
/usr/local/sphinx/bin/search -c /usr/local/sphinx/etc/sphinx.confwindows
/usr/local/sphinx/bin/search-c /usr/local/sphinx/etc/sphinx.conf freebsd
/usr/local/sphinx/bin/search-c /usr/local/sphinx/etc/sphinx.conf “linux windows freebsd”
Coreseek
Coreseek 是带有中文分词的sphinx,coreseek提供了为sphinx设计的中文分词包libmmseg,libmmseg包含了mmseg中文分词
下载coreseek http://www.coreseek.cn
解压安装
Tarxzf coreseek-3.2.14.tar.gz
Cdcoreseek-3.2.14/mmse-3.2.14/
./configure--prefix=/usr/local/mmseg (会有error,继续使用automake)
Automake
Make&& make install
Cd csft-3.2.14/
./configure --prefix=/usr/local/coreseek�Cwith-mysql=/usr/local/mysql �Cwith-mmseg=/usr/local/mmseg�Cwith-mmseg-includes=/usr/local/mmseg/include/mmseg �Cwith-mmseg-libs=/usr/local/mmseg/lib
Make && make install
配置带有中文分词的sphinx配置文件
Cd/usr/local/coreseek/etc/
Cpsphinx.conf.dist csft.conf
Vimcsft.conf
大部分与以上的配置一样,以下是不太点
Charset_type= zh_cn.utf-8
Chatset_dictpath= /usr/local/mmseg/etc/ 安装mmseg的目录
测试
创建索引
/usr/local/coreseek/bin/indexer �Cc /usr/local/coreseek/etc/csft.conf�Call
/usr/local/coreseek/bin/search [-a] �Cc /usr/local/coreseek/etc/csft.conf ‘云络科技’
用php去使用sphinx技术
使用php程序操作sphinx做一个搜索引擎
Sphinx集成到php程序中,有两种方式:sphinxphp模块和 sphinx类(coreseek源码api中)
准备数据
建立sphinx配置文件
生成索引
启动searchd服务必须开启sphinx端口9312
用php客户程序去连接sphinx服务
启动进程命令:searchd
-c--stop --pidfile �Cp选项注意端口不要被占用
方法一Php加载sphnx模块
Wgethttp://pecl.php.net/get/sphinx-1.1.0.tgz
Tarzxf sphinx-1.1.0.tgz
Cdsphinx-1.1.0
/usr/local/php/bin/phpize
./configure--with-php-config=/usr/local/php/bin/php-config --with-sphinx
提示
Checking for libsphinxclient headers in default path…. Notfind
Configure error: cannot find libsphinxclientheaders
Cd coreseek-3.2.14/ csft-3.2.14/api/libsphinxclient/
./configure
Make && make install
再继续加载sphinx模块
Cd sphinx-1.1.0
./configure --with-php-config=/usr/local/php/bin/php-config--with-sphinx
Make && make install
Vi /usr/local/php/etc/php.ini
Extension = sphnx.so 添加
/usr/local/apache2/bin/apachectl restart
方法二使用api类连接sphinx
Cp/tmp/coreseek-3.2.14/csft-3-2.14/api/sphinxapi.php /usr/local/apache2/htdos/
Include ‘sphinxapi.php’
$sphinx = new SphinxClient();
$sphinx->SetServer(“localhost” 9312);
$result = $Sphinx->query($keyword,”*”);
Print_r($result);
[matches]=>Array
[6]=>Array
[weight]=>4
[attrs]=>Array
[group_id]=>1
[data_added=>13801380999]
Index.php
Find.php
当数据量大时实现实时索引
数据库里的数据很大,然后我们在加入的记录,希望能够立即检索到,全部重新建立索引很消耗资源,这就需要使用“主索引+增量索引”,实现原理是设置两个数据源和两个索引。
1、创建一个计数器
在数据库里增加一个计数表,记录将文档分成两个部分的文档ID,每次从重新构建主索引时,更新这个表。
create table sph_counter(
counter_id INTEGER AUTO_INCREMENT PRIMARYKEY NOT NULL,
max_doc_id INTEGER NOTNULL );
2、再次修改配置文件
主数据源继承数据源主索引继承索引(增量索引)
主数据源
source main {
sql_qurry_pre = replace into sph_counter select 1,max(id) from post
sql_query = select id,title,content from post where id<=(selectmax_doc_id from sph_counter where counter_id = 1)
}
增量数据源
source delta : main {
sql_query_pre = set names utf8
sql_query = select id,title,content from post where id>(selectmax_doc_id from sph_counter where counter_id=1)
}
主索引
Index main{
Source main
Path = /usr/local/coreseek/var/data/main
}
继承索引(增量索引)
Index delta:main{
Source=delta
Path=/usr/local/coreseek/var/data/delta
}
测试
./indexer --all --rotate (max_doc_counter更新)
./indexer --delta --rotate
Mysql post 添加一条记录
./indexer --delta �Crotate (max_doc_counter不变)
添加到计划任务里
Main.sh
#/bin/bash
/usr/local/coreseek/bin/indexer main --rotate>>/usr/local/coreseek/var/log/main.log
echo “####################################################”
Delta.sh
#/bin/bash
/usr/local/coreseek/bin/indexer delta --rotate>>/usr/local/coreseek/var/log/delta.log
echo “####################################################”
Chmod +x main.sh delta.sh
Crontab -e
*/10 * * * * delta.sh
00 2 * * * main.sh
Crontab �Cl
分布式索引
对大数据提高搜索速度,把搜索分布到多个服务器上(mysql数据库的操作)
对数据水平分区
过程
1连接远程代理
2 执行查询
3 对本地索引进行查询
4接收来自远程代理的收索结果
5 得到结果合并
6 将合并的结果返回给客户端
Index dist{
Type = distributed
Local = chunk0
Agent = localhost:9312:chunk1
Agent = 10.0.0.2:9312:chunk2
Agent = 10.0.0.3:9312:chunk3
}