时间:2021-07-01 10:21:17 帮助过:3人阅读
include(‘sphinxapi.php‘);
$cl = new SphinxClient();
//设置sphinxserver地址与port,假设是本机则能够为localhost
$cl->SetServer( "192.168.16.6", 9312 );
//下面设置用于返回数组形式的结果
$cl->SetArrayResult ( true );
//$cl->SetMatchMode( SPH_MATCH_ANY );//匹配模式
//$cl->SetFilter( ‘group_id‘, array( 2 ) );
$result = $cl->Query( ‘研究生创业‘, ‘test1‘ ); //參数 keyword 索引名
if ( $result === false ) {
echo "Query failed: " . $cl->GetLastError() . ".\n";
}
else {
if ( $cl->GetLastWarning() ) {
echo "WARNING: " . $cl->GetLastWarning() . "";
}
echo ‘<pre>‘;
print_r( $result );
}
?>
运行后的结果:
Array
(
[error] =>
[warning] =>
[status] => 0
[fields] => Array
(
[0] => title
[1] => content
)
[attrs] => Array
(
[group_id] => 1
[date_added] => 2
)
[matches] => Array
(
[5] => Array
(
[weight] => 2
[attrs] => Array
(
[group_id] => 2
[date_added] =>1296491832
)
)
)
[total] => 1
[total_found] => 1
[time] => 0.078
[words] => Array
(
[研究生] =>Array
(
[docs] => 1
[hits] => 2
)
[创业] =>Array
(
[docs] => 2
[hits] => 2
)
)
)
在matches中的就是查询结果。我们注意到sphinx是将记录中的主键ID值返回而不是返回全部数据。上面的样例中的键名5就是记录的ID(假设在查询前运行$cl->SetArrayResult( true );则数组结构会有些许差异)。至此搜索server已经为我们完毕了大部分工作。接下来我们通过主键ID值来查询我们想要的数据就能够了。
Sphinx存储引擎的使用
SphinxSE是一个能够编译进MySQL 5.x版本号的MySQL存储引擎。它利用了该版本号MySQL的插件式体系结构。虽然被称作“存储引擎”。SphinxSE自身事实上并不存储不论什么数据。它事实上是一个同意MySQLserver与searchd交互并获取搜索结果的嵌入式client。全部的索引和搜索都发生在MySQL之外。
SphinxSE的适用于:
使将MySQL FTS 应用程序移植到Sphinx
使没有Sphinx API的那些语言也能够使用Sphinx
当须要在MySQL端对Sphinx结果集做额外处理(比如对原始文档表做JOIN,MySQL端的额外过滤等等)时提供优化。
要通过SphinxSE搜索,须要建立特殊的ENGINE=SPHINX的“搜索表”,然后使用SELECT语句从中检索,把全文查询放在WHERE子句中。
创建一张表sphinx表(用来连接MYSQL和SPHINX)
CREATE TABLEt1
(
id INTEGER UNSIGNED NOT NULL,
weight INTEGER NOT NULL,
query VARCHAR(3072) NOT NULL COMMENT ‘查询的单词’,
group_id INTEGER,
INDEX(query) COMMENT ‘必需要给query字段建一个索引’
) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312/songs";
SELECT b.*
FROM t1a,curl_songs b WHERE a.id=b.id AND query=’冬天的雪’
搜索表前三列的类型必须是INTEGER,INTEGER和VARCHAR。这三列分别相应文档ID,匹配权值和搜索查询。查询列必须被索引。其它列必须无索引。列的名字会被忽略,所以能够随意命名,參数CONNECTION来指定用这个表搜索时的默认搜索主机、port号和索引,语法格式:CONNECTION="sphinx://HOST:PORT/INDEXNAME"。
运行SQL语句
查询出全部冬天的雪的记录:
SELECT a.*
FROM curl_songs a,t1 b
WHERE a.id=b.id AND b.query=”冬天的雪”
+----+--------------------+-----------------------+
| id |title | content |
+----+--------------------+-----------------------+
| 5 | 研究生的故事 | 研究生自主创业 |
+----+--------------------+-----------------------+
1 row in set(0.04 sec)
结果返回了我们想要的数据,可见利用SphinxSE能够只在SQL语句上做非常小的修改就可以非常方便的实现全文检索。
主索引 + 增量索引
前提:数据不会被改变
第一步:建表: (用来存索引过的最大的记录 id)
Create table a
{
Idint unsigned not null primary key,
Max_id int unsigned,
}
第二步:改动配置文件为:见 sphinx配置文件.doc
第三步:先运行./bin/indexer –c ./etc/sphinx.conf –test1 生成全部的索引-〉一个数据源的主查询,仅仅有第一次运行
第四步:定期运行:./bin/indexer–c ./etc/sphinx.conf delta --rotate à 生成增量的索引文件
第五步:合并到主索引中./bin/indexer –merge test1 delta –c ./etc/sphinx.conf --rotate
Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词
标签: