Windows AND liunx 下安装使用Sphinx(测试OK)
Sphinx的特性
高速索引 (在新款CPU上,近10 MB/秒);高速搜索 (2-4G的文本量中平均查询速度不到0.1秒);高可用性 (单CPU上最大可支持100 GB的文本,100M文档);提供良好的相关性排名支持分布式搜索;提供文档摘要生成;提供从MySQL内部的插件式存储引擎上搜索支持布尔,短语, 和近义词查询;支持每个文档多个全文检索域(默认最大32个);支持每个文档多属性;支持断词;支持单字节编码与UTF-8编码;Sphinx配置
source 源名称1{ …}index 索引名称1{ source=源名称1 …}source 源名称2{ …}index 索引名称2{ source = 源名称2 …}indexer{ …}searchd{ …}
提示
从组成我们可以发现sphinx可以定义多个索引与数据源,不同的索引与数据源可以应用到不同表或不同应用的全文检索。
根据前面的实例,我们配置出我们需要的sphinx.conf,如下:
source cgfinal{ type = mysql strip_html = 0 index_html_attrs = sql_host = localhost sql_user = root sql_pass = admin sql_db = test sql_port= 3306 # optional, default is 3306 sql_query_pre= SET NAMES utf8 sql_query = SELECT ARTICLESID,TITLE,CONTENTS,AUTHOR,CATALOGID,ADDTIME,EDITUSERID,\HITS FROM a.eht_news_articles #sql_query = SELECT * FROM a.eht_news_articles sql_attr_uint= CATALOGID sql_attr_uint= EDITUSERID sql_attr_uint = HITS sql_attr_timestamp = ADDTIME sql_query_post = sql_ranged_throttle= 0 #sql_query_info = SELECT * FROM a.eht_news_articles WHERE ARTICLESID=$id}index cgfinal{ source = cgfinal path = d:/sphinx/data/cgfinal docinfo = extern mlock = 0 morphology = none stopwords = min_word_len = 1 charset_type = utf-8 charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z,\A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6,\U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101,\U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109,\U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F,\U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, \U+0116->U+0117,U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D,\ U+011D,U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, \U+0134->U+0135,U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, \U+013C,U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, \U+0143->U+0144,U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, \U+014B,U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, \U+0152->U+0153,U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159,\ U+0159,U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, \U+0160->U+0161,U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, \U+0167,U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, \U+016E->U+016F,U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175,\ U+0175,U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, \U+017B->U+017C,U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, \U+0430..U+044F,U+05D0..U+05EA, U+0531..U+0556->U+0561..U+0586, U+0561..U+0587, \U+0621..U+063A, U+01B9,U+01BF, U+0640..U+064A, U+0660..U+0669, U+066E, U+066F, \U+0671..U+06D3, U+06F0..U+06FF,U+0904..U+0939, U+0958..U+095F, U+0960..U+0963, \U+0966..U+096F, U+097B..U+097F,U+0985..U+09B9, U+09CE, U+09DC..U+09E3, U+09E6..U+09EF, \U+0A05..U+0A39, U+0A59..U+0A5E,U+0A66..U+0A6F, U+0A85..U+0AB9, U+0AE0..U+0AE3, \U+0AE6..U+0AEF, U+0B05..U+0B39,U+0B5C..U+0B61, U+0B66..U+0B6F, U+0B71, U+0B85..U+0BB9, \U+0BE6..U+0BF2, U+0C05..U+0C39,U+0C66..U+0C6F, U+0C85..U+0CB9, U+0CDE..U+0CE3, \U+0CE6..U+0CEF, U+0D05..U+0D39, U+0D60,U+0D61, U+0D66..U+0D6F, U+0D85..U+0DC6, \U+1900..U+1938, U+1946..U+194F, U+A800..U+A805,U+A807..U+A822, U+0386->U+03B1, \U+03AC->U+03B1, U+0388->U+03B5, U+03AD->U+03B5,U+0389->U+03B7, U+03AE->U+03B7, \U+038A->U+03B9, U+0390->U+03B9, U+03AA->U+03B9,U+03AF->U+03B9, U+03CA->U+03B9, \U+038C->U+03BF, U+03CC->U+03BF, U+038E->U+03C5,U+03AB->U+03C5, U+03B0->U+03C5, \U+03CB->U+03C5, U+03CD->U+03C5, U+038F->U+03C9,U+03CE->U+03C9, U+03C2->U+03C3, \U+0391..U+03A1->U+03B1..U+03C1,U+03A3..U+03A9->U+03C3..U+03C9, U+03B1..U+03C1, \U+03C3..U+03C9, U+0E01..U+0E2E,U+0E30..U+0E3A, U+0E40..U+0E45, U+0E47, U+0E50..U+0E59, \U+A000..U+A48F, U+4E00..U+9FBF,U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF, \U+2F800..U+2FA1F, U+2E80..U+2EFF,U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF, \U+3040..U+309F, U+30A0..U+30FF,U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF, \U+3130..U+318F, U+A000..U+A48F,U+A490..U+A4CF min_prefix_len = 0 min_infix_len = 1 ngram_len = 1 ngrams_chars = U+4E00..U+9FBF, U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF,\U+2F800..U+2FA1F, U+2E80..U+2EFF, U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF,\U+3040..U+309F, U+30A0..U+30FF, U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF,\U+3130..U+318F, U+A000..U+A48F, U+A490..U+A4CF}indexer{ mem_limit = 32M}searchd{ # address = 0.0.0.0 port = 3312 log = d:/sphinx/log/searchd.log query_log = d:/sphinx/log/query.log read_timeout = 5 max_children = 30 pid_file = d:/sphinx/log/searchd.pid max_matches = 1000 seamless_rotate = 1}
相关配置项说明:
Source部分配置项说明#type 数据库类型,目前支持mysql与pgsql#strip_html 是否去掉html标签#sql_host 数据库主机地址#sql_user 数据库用户名#sql_pass 数据库密码#sql_db 数据库名称#sql_port 数据库采用的端口#sql_query_pre 执行sql前要设置的字符集,用utf8必须SET NAMES utf8#sql_query 全文检索要显示的内容,在这里尽可能不使用where或group by,将where与groupby的内容交给sphinx,由sphinx进行条件过滤与groupby效率会更高#注意:select 出来的字段必须至少包括一个唯一主键(ARTICLESID)以及要全文检索的字段,你计划原本在where中要用到的字段也要select出来#这里不用使用orderby#sql_attr_开头的表示一些属性字段,你原计划要用在where,orderby,groupby中的字段要在这里定义#根据我们原先的SQL:#select * from eht_articles where title like ? and catalogid=? And edituserid=? And addtime between ? and ? order by hits desc#我们需要对catalogid,edituserid,addtime,hits进行属性定义(这四个字段也要在select的字段列表中),定义时不同的字段类型有不同的属性名称,具体可以见sphinx.conf.in中的说明index部分配置项说明#source 数据源名#path 索引记录存放目录,如d:/sphinx/data/cgfinal,实际存放时会存放在d:/sphinx/data目录,然后创建多个cgfinal名称,不同扩展名的索引文件。#其他的配置如min_word_len,charset_type,charset_table,ngrams_chars,ngram_len这些则是支持中文检索需要设置的内容。#如果检索的不是中文,则charset_table,ngrams_chars,min_word_len就要设置不同的内容,具体官方网站的论坛中有很多,大家可以去搜索看看。
(TOFIX:翻译不畅)在SPH_MATCH_ANY模式中,本质上是一样的,但它也增加了每个字段的匹配单词数量,在这之前,短语排名权重乘以一个足够大的值以保证在任意一个字段的较高短语排名可以匹配排名较高者,即使它的字段权重比较低。在SPH_MATCH_EXTENDED模式中,最终的权重是短语权重和BM25权重的总和,再乘以1000取整。
Windows下安装Sphinx1、从http://sphinxsearch.com 下载Sphinx 2.0.1-beta
2、解压到合适的位置(我的位置E:\APMServ5.2.6\Sphinx)
3、设置配置文件
sphinx.conf修改sphinx.conf必要项(数据库作为数据源):mysql数据库连接项(参照example.sql建立测试数据到数据库);@CONFDIR@替换成实际目录,然后手动建立好该目录及子目录,这里为
E:\APMServ5.2.6\Sphinxdata # 索引数据目录
E:\APMServ5.2.6\Sphinxlog # 进程文件目录
4、安装Sphinx到Windows服务(启动该服务)searchd.exe --install -c d:\sphinx\sphinx.conf --servicename SphinxSearch
5、PHP客户端测试进入d:\sphinx\api目录,sphinx提供了php, python , ruby , c等客户端代码,如果Php程序员想访问Sphinx,包含sphinxapi.php就可以了 ,test.php是Sphinx提供的访问例子。
在测试之前,需要生成索引文件到E:\APMServ5.2.6\Sphinx\data目录,进入E:\APMServ5.2.6\Sphinx\bin执行indexer.exe -c E:\APMServ5.2.6\Sphinx\sphinx.conf --all
运行成功后必须重新启动Sphinx才能生效。重启后执行test.php
php test.php test
liunx 安装后续介绍
Sphinx使用生成索引
开始 -> 运行 -> 输入cmd回车,打开命令行工具
e:\coreseek\bin\indexer --config e:\coreseek\etc\mysql.conf --all
这一串东西其实就是调用indexer程序来生成所有索引
如果只想对某个数据源进行索引,则可以这样:e:\coreseek\bin\indexer --config e:\coreseek\etc\mysql.conf 索引名称(索引名称指配置文件中所定义的)
--config,--all这些都是indexer程序的参数,想了解更多参数的朋友可以查看文档
运行命令后如果你没看到FATAL,ERROR这些东西,那么索引文件就算生成成功了,比如我看到得就是
………省略………
using config file 'e:\coreseek\etc\mysql.conf'...
indexing index 'mysql'...
collected 4 docs, 0.0 MB
………省略………
第4步:(启动Sphinx)
同样命令行下
e:\coreseek\bin\searchd --config e:\coreseek\etc\mysql.conf
运行后提示了一大堆东西
using config file 'e:\coreseek\etc\mysql.conf'...
listening on all interfaces, port=9312
accepting connections
不用管这些鸟文是啥意思,反正Sphinx是启动好了。
现在有一串鸟文的这个命令行是不能关的,因为关了Sphinx也就关了,如果觉得这样不爽,可以将Sphinx安装成系统服务,在后台运行。
安装系统服务只需在命令行中输入以下命令
e:\coreseek\bin\searchd --config e:\coreseek\etc\mysql.conf --install
安装之后记得启动这个服务,不会启动那我没法,自己google。
第5步:(使用Sphinx)
在web根目录下建立一个search目录(当然不在根目录也行,同样目录名也可以随取),复制E:\coreseek\api\ sphinxapi.php文件到search目录(sphinxapi.php这个是sphinx官方提供的api),开始php程序的编写。
在search目录建立一个文件,名字叫啥都行,我管它叫index.php,其内容如下
<?php
include 'sphinxapi.php'; // 加载Sphinx API
$sc = new SphinxClient(); // 实例化Api
$sc->setServer('localhost', 9312); // 设置服务端,第一个参数sphinx服务器地址,第二个sphinx监听端口
$res = $sc->query('sphinx', 'mysql'); // 执行查询,第一个参数查询的关键字,第二个查询的索引名称,mysql索引名称(这个也是在配置文件中定义的),多个索引名称以,分开,也可以用*表示所有索引。
print_r($res);
打印结果:
Array
(
………省略………
[matches] => Array
(
[2] => Array
(
[weight] => 2
[attrs] => Array
(
[addtime] => 1282622004
)
)
[4] => Array
(
[weight] => 2
[attrs] => Array
(
[addtime] => 1282622079
)
)
)
………省略………
)
Matches中就是查询的结果了,但是仿佛不是我们想要的数据,比如titile,content字段的内容就没有查询出来,根据官方的说明是Sphinx并没有连接到MySQL去取数据,只是根据它自己的索引内容进行计算,因此如果想用Sphinx提供的API去取得我们想要的数据,还必须以查询的结果为依据,再次查询MySQL从而得到我们想要的数据。
查询结果中键值分别表示
2唯一主键
weight权重
attrs sql_attr_*中配置
至此,搜索引擎算是完成一大半了,剩下的大家可以自行完成。
比如:
<?php
$ids = array_keys($res['matches']); // 获取主键
$ids = join(',', $ids);
$query = mysql_query("SELECT * FROM post WHERE id IN ({$ids})");
while($row = mysql_fetch_assoc($query)) {
.....
}
Sphinx的更多配置,程序的参数等,大家可以查看Sphinx的文档。
增量索引的使用(1).在Mysql中建立一个增量表,凡是更新操作(添加,修改,删除),都会将相关ID更新到到增量表;表结构很简单,只记录ID.
(2).修改Sphinx的配置文件
sql_query = SELECT 0 AS in_update FROM documents
sql_attr_uint = in_update
增加了一个字段in_update,用来标记主索引的这条记录,是否在增量表中.
(3).产品的更新操作时,除了更新增量表,同时也利用Sphinx API的
UpdateAttributes方法,将主索引中的相关记录的in_update属性设置成”1″
$Sphinx->UpdateAttributes( $index, array( 'in_update' ), array( $id => '1' ) );
更新完了属性后,发出增量索引更新通知,可以是写队列,写文件等方式.
(4).在查询时,增加过滤器.
$Sphinx->SetFilter( 'in_update', array(0) );
这样,就不会使用到主索引中的处于增量索引中的doc,以免搜索到错误的编辑前的数据.
(5).守护进程接到增量索引更新通知,重建增量索引.
(6).每天某时段更新主索引,清空增量表,清空增量索引…
图片概述:
常用命令1、启动Sphinx
删除索引:
可以在创建索引时,配置文件中设置以下属性:
sql_attr_bool = is_deleted
is_deleted 默认值为 0 ,当记录要删除时,调用接口中的 UpdateAttributes设置其属性值为 1,在搜索和合并索引时增加过滤器只让is_deleted为 0 的记录通过
select id, title, content,1 as is_deleted from table
$ sphinx ->UpdateAttributes('is_deleted', array('is_deleted'),array($id => array(0)));
$sphinx->SetFilter(); SetFilter
设置过滤器只允许“is_deleted”为 0 的那些条件通过,而去除所有标记为已删除(“is_deleted” 为非0)的记录searchd --config /home/myuser/sphinx.conf –stop
安静停止:
searchd --config /home/myuser/sphinx.conf –stopwait
状态:
searchd --config /home/myuser/sphinx.conf –status
指定PID文件
searchd --config /home/myuser/sphinx.conf --pidfile /home/myuser/sphinx.pid
启动的为控制台模式:
searchd --config /home/myuser/sphinx.conf –console
只启动指定索引
searchd --index myindex
客户端方法介绍<?php include_once 'sphinxapi.php';$s = new SphinxClient();$s->setServer("localhost", 9312);$s->SetConnectTimeout ( 1 );//设置链接超时/*$s->AddQuery();//列表查询$s->RunQueries ();//执行列表查询$s->ResetFilters();//清除过滤条件$s->BuildExcerpts($docs, $index, $words);//生成简要$s->BuildKeywords($query, $index, $hits);//生成关键字$s->GetLastError();//错误$s->GetLastWarning();//警告$s->FlushAttributes();//索引刷入硬盘$s->IsConnectError();//链接错误$s->ResetGroupBy();//重设分组$s->SetFieldWeights(array('sub_title'=>1));//加权最小为1$s->SetIDRange($min, $max);//ID范围$s->SetIndexWeights(array('test1'=>1));//索引权重$s->Status();//服务是否可用$s->UpdateAttributes($index, $attrs, $values);//更新硬盘索引*//*参考文档:http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html#matching-modesSPH_MATCH_ALL, matches all query words (default mode);SPH_MATCH_ANY, matches any of the query words;SPH_MATCH_PHRASE, matches query as a phrase, requiring perfect match;SPH_MATCH_BOOLEAN, matches query as a boolean expression (see Section 5.2, “Boolean query syntax”);SPH_MATCH_EXTENDED, matches query as an expression in Sphinx internal query language (see Section 5.3, “Extended query syntax”). As of 0.9.9, this has been superceded by SPH_MATCH_EXTENDED2, providing additional functionality and better performance. The ident is retained for legacy application code that will continue to be compatible once Sphinx and its components, including the API, are upgraded.SPH_MATCH_EXTENDED2, matches query using the second version of the Extended matching mode.SPH_MATCH_FULLSCAN, m*/$s->setMatchMode(SPH_MATCH_ANY);//匹配模式$s->setMaxQueryTime(3);//查询超时//$s->SetSelect ( $select );//设置返回的字段/*$cl->SetSelect ( "*, @weight+(user_karma+ln(pageviews))*0.1 AS myweight" );$cl->SetSelect ( "exp_years, salary_gbp*{$gbp_usd_rate} AS salary_usd, IF(age>40,1,0) AS over40" );$cl->SetSelect ( "*, AVG(price) AS avgprice" ); *//*$cl->SetGroupBy ( "category", SPH_GROUPBY_ATTR, "@count desc" );$cl->SetGroupDistinct ( "vendor" );==SELECT id, weight, all-attributes, COUNT(DISTINCT vendor) AS @distinct, COUNT(*) AS @countFROM productsGROUP BY categoryORDER BY @count DESC*///$s->SetGroupBy ( $groupby, SPH_GROUPBY_ATTR, $groupsort );//汇总//$s->SetGroupDistinct ( $distinct );//设置不重复字段$s->SetArrayResult ( true );//结果是否有ID/* SPH_SORT_RELEVANCE mode, that sorts by relevance in descending order (best matches first); SPH_SORT_ATTR_DESC mode, that sorts by an attribute in descending order (bigger attribute values first); SPH_SORT_ATTR_ASC mode, that sorts by an attribute in ascending order (smaller attribute values first); SPH_SORT_TIME_SEGMENTS mode, that sorts by time segments (last hour/day/week/month) in descending order, and then by relevance in descending order; SPH_SORT_EXTENDED mode, that sorts by SQL-like combination of columns in ASC/DESC order; SPH_SORT_EXPR mode, that sorts by an arithmetic expression. *///$s->SetSortMode ( SPH_SORT_EXTENDED, $sortby );//排序模式/*$s->SetOverride($attrname, $attrtype, $values);$s->ResetOverrides();*//*$s->SetRetries($count);//设置失败重试$s->SetRankingMode($ranker);//设置排名模式 均适用于SPH_MATCH_EXTENDED2搜索//第3个参数当为true时,相当于$attribute!=$value,默认值是false$s->SetFilter ( 'target_type', $filtervals );//设置过滤,值列表$s->SetFilterFloatRange($attribute, $min, $max);//浮动范围$s->SetFilterRange($attribute, $min, $max);//指定范围$s->SetGeoAnchor($attrlat, $attrlong, $lat, $long);*///link//$s->SetFilter ( 'target_type', array(1),true );$s->SetLimits ( 0, 10 );//显示数量:开始 量 最大量 右偏移量$result = $s->query("good","team");//查询print_r($result);