Heim >php教程 >php手册 >sphinx中文全文检索的实现

sphinx中文全文检索的实现

WBOY
WBOYOriginal
2016-06-13 09:36:24916Durchsuche

首先以下是配置文件:

source cv{
type=mysql
sql_host=localhost
sql_user=root
sql_pass=passwod
sql_db=database
sql_query_pre= SET NAMES utf8
sql_query=\
SELECT id, title, introtext,unix_timestamp(created) as addtime \
FROM jos_content
sql_attr_timestamp=addtime
sql_ranged_throttle=0
}
index cv{
source=cv
path=/usr/local/sphinx/var/data/joomlainx
docinfo=extern
mlock=0
stopwords=
min_prefix_len=0
min_infix_len=0
min_word_len=2
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
ngram_len=1
ngram_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{
port=3312
log=/usr/local/sphinx/var/log/searchd.log
query_log=/usr/local/sphinx/var/log/query.log
read_timeout=5
max_children=30
pid_file=/usr/local/sphinx/var/log/searchd.pid
max_matches=1000
seamless_rotate=1
}

你可以参考一下,使用这个配置文件需要修改用户,密码保存目录等,来符合你自己mysql的要求。sphinx的官网的配置有一些问题,最关键的就是 morphology=none 这段在中文情况下不能使用,否则会导致无法启动searchd服务。

配置完成后,就可以进行索引:

/usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --all

然后可以启动searchd

/usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/sphinx.conf

我们来用php api进行搜索,将安装目录的api文件都 copy 到 网站的根目录下,最重要的是sphinxapi.php

新建一个test.php文件,代码如下:

<?php require 'sphinxapi.php';
$q=$_GET['q']; 
$mode=SPH_MATCH_ALL; 
$host='localhost'; 
$port=3312; 
$index='*'; 
$groupby=''; 
$groupsort='@group desc'; 
$filter='site_id'; 
$filtervals=array(); 
$distinct=''; 
$sortby=''; 
$limit=20; 
$opts=array(
	'before_match'=>'<b>',
	'after_match'=>'</b>',
	'chunk_separator'=>' ... ',
	'limit'=>60,
	'around'=>3
); 
$ranker=SPH_RANK_PROXIMITY_BM25;
$cl=new SphinxClient(); 
$cl->SetServer($host,$port); 
$cl->SetWeights(array(100,1)); 
$cl->SetMatchMode($mode); 
if(count($filtervals))$cl->SetFilter($filter,$filtervals); 
if($groupby)$cl->SetGroupBy($groupby,SPH_GROUPBY_ATTR,$groupsort); 
if($sortby)$cl->SetSortMode(SPH_SORT_EXTENDED,$sortby); 
if($sortexpr)$cl->SetSortMode(SPH_SORT_EXPR,$sortexpr); 
if($distinct)$cl->SetGroupDistinct($distinct); 
if($limit)$cl->SetLimits(0,$limit,($limit>1000)?$limit:1000); 
$cl->SetRankingMode($ranker); 
$cl->SetArrayResult(true); 
$res=$cl->Query($q,$index); 
?>

这是一个最简单的测试实例,注意保存的charset是 utf-8 ,无BOM,现在可以通过 http://www.phpernote.com/test.php 来测试,结果会返回一个数组,sphinx不会返回title和content等内容,因此要根据id在mysql检索以显示文章标题和正文。

目前 sphinx 生成的索引文件不能大于2G

您可能感兴趣的文章

  • Sphinx在windows下安装使用[支持中文全文检索]
  • php.ini 中文英文对照详细配置手册
  • PHP判断上传文件类型最安全,最真实的解决办法
  • php smarty中文截取插件开发示例
  • thinkphp截取中文字符串的方法
  • 在php中分别使用curl的post提交数据的方法和get获取网页数据的方法总结
  • php如何将html中的br换行符转换为文本输入中的换行符
  • php中关于抽象(abstract)类和抽象方法的问题解析
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn