使用全文搜索引擎
站内搜索类型
1、sphinx(斯芬克斯) sphinx不支持中文, coreseek(基于sphinx,并且支持中文)
2、lucene java支持好,为php也提供方法
3、xunsearch(迅搜) 国产、仅支持php
sphinx的使用
优点:
高速的建立索引可达到10M/s
高性能的搜索(在2-4G的文本数据上,平均每次检索响应的时间小于0.1秒)
可处理海量数据(目前已知可以处理100G的文本数据,在单一的CPU的系统上可处理100M的文档)
提供的优秀的相关度算法,基于短语相似度和统计BM2的复合Ranking的方法
支持分布式搜索
提供文档片段生成功能
可作为Mysql的存储引擎提供搜索服务
支持布尔,短语,词语相似度等多种检索模式
缺点:
必须要有主键
主键必须为整数
不负责数据存储
配置不灵活
不多说,直接上案例:
1.下载好sphinx工具,解压目录如下:
2.将sphinx-min.conf.in文件改名为sphinx.conf并移动到bin文件夹中
编辑该文件配置如下:
source src1
{
type = mysql
sql_host = localhost #主机地址
sql_user = root#帐号
sql_pass = #密码
sql_db = oneshop #数据库
sql_port = 3306 # 数据库端口 3306
sql_query = SELECT id, name, tel FROM one_user #查询语句
sql_attr_uint = group_id
sql_attr_timestamp = date_added
sql_query_pre = set names utf8 #数据库编码
}
index test1
{
source = src1
path = D:/xampp/htdocs/sphinx/data #这个一定要配置
charset_type = utf-8 #指定编码
ngram_len = 1 #要找中文需指定为1.
ngram_chars = U+3000..U+2FA1F
}
indexer
{
mem_limit = 128M
}
searchd
{
listen = 9312
listen = 9306:mysql41
log = D:\xampp\htdocs\sphinx\log\searchd.log #进程日志
query_log = D:\xampp\htdocs\sphinx\log\query.log #查询日志
read_timeout = 5
max_children = 30
pid_file = D:\xampp\htdocs\sphinx\log\searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # for RT to work
binlog_path =D:\xampp\htdocs\sphinx\data
}
3.生成查询索引 (coreseek 默认为index.php同目录下的csft.conf)
语法:index [-c 配置文件 --all或者索引源名称
4.安装searchd服务:(注意要以管理员的形式打开cmd 否则code5)
5.加载配置文件
6.启动
7.开始运行代码,我将该test2.php放在\share\doc下,如下:
<?php
require ( "./api/sphinxapi.php" );
$sphinx = new SphinxClient();
$sphinx->SetServer('localhost',9312);
$result = $s->Query('huang123');
echo '<pre>';
print_r($result);
?>
8.返回的是主键id ,仍需根据id去查询数据
由于数据量太少了,这里就不比较速度了
代码部分:
从php手册中可以查到SphinxClient的用法:
1.实例化
$sphinx = new SphinxClient();
2.连接Sphinx服务器(searchd服务)
$sphinx -> setServer(‘localhost’,9312);
3.Query方法搜索关键词,结果是数组,其中matches存储的是检索到的记录
$result = $s->query('huang123',*);
//通过array_keys()函数,可以提取这些id
$ids=array_keys($result['matches']);
//查询
if($ids){
$ids=implode(',',$ids);
...
}
4.Sphinx匹配模式
SPH_MATCH_ALL :匹配所有查询词(默认),完全匹配所有的词
SPH_MATCH_ANY:匹配查询词中的任意一个。匹配任意一个词
SPH_MATCH_PHRASE:将整个查询词看做一个词组,要完全匹配 相当于like
SPH_MATCH_BOOLEAN : 将查询看作一个布尔表达式 | & or ! 例(“妈妈|爸爸”)
SPH_MATCH_EXTENDED2 : 查询看做一个sphinx的表达式
如:@name hjy @tel 1379532142 @ 字段 查询
延伸阅读:
Coreseek/Sphinx增量索引使用详解 http://xiaobu.duapp.com/index.php/2016/07/31/30/
xunsearch
bin/xs-ctl.sh restart 最好将此命令写入 /etc/rc.local 重启自启动
需要一个定时脚本,将需要检索的MySQL数据导入、更新到xunSearch里:
usr/local/php/bin/php /usr/local/xunsearch/sdk/php/util/Indexer.php --rebuild --source=mysql://你的数据库用户名:你的数据库密码@你的数
据库IP/你的数据库名 --sql="你要执行的SQL语句" --filter=debug --project=你的项目名;
保存数据文件的目录:project ;
project表示不同的项目数据目录
配置文件数据类型
代码部分:
ini_set('display_errors' , 'On');
require '/usr/local/xunsearch/sdk/php/lib/XS.php'; // 引入 xunsearch sdk
$xs = new XS('/usr/local/xunsearch/sdk/php/app/demo.ini'); // demo 为项目名称,配置文件是:$sdk/app/demo.ini
$search = $xs->search;
$query = 'hjy'; // 这里的搜索语句很简单,就一个短语
$search->setFuzzy(); //设置模糊搜索
$search->setQuery($query); // 设置搜索语句
$search->setLimit( 100 );
$docs = $search->search(); // 执行搜索,将搜索结果文档保存在 $docs 数组中
var_dump($docs);
$count = $search->count(); // 获取搜索结果的匹配总数估算值
echo '<hr/>';
var_dump($count);