sphinx 分词搜索 php,sphinx分词搜索

安装部署

1.Lamp环境准备

2.下载支持中文的Sphinx ---> coreseek

3.安装环境

m4,gcc,gcc-c++,automake,libtool

4.安装中文分词组件mmseg

##安装mmseg

$ cd mmseg-3.2.14

$ ./bootstrap    #输出的warning信息可以忽略,如果出现error则需要解决

$ ./configure --prefix=/usr/local/mmseg3

$ make && make install

5.安装coreseek前准备

依赖mysql及依赖库

mysql-server

mysql-devel

6.安装coreseek

$ cd csft-3.2.14 或者 cd csft-4.0.1 或者 cd csft-4.1

$ sh buildconf.sh    #输出的warning信息可以忽略,如果出现error则需要解决

$ ./configure --prefix=/usr/local/coreseek  --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql

$ make && make ins tall

配置

#

# Minimal Sphinx configuration sample (clean, simple, functional)

#

source post

{

type                    = mysql

sql_host                = localhost

sql_user                = root

sql_pass                =

sql_db                    = test

sql_port                = 3306    # optional, default is 3306

#设置字符集

sql_query_pre = set names utf8

#设置数据来源

sql_query= select id,title,content from post

#sql_attr_uint            = group_id

#sql_attr_timestamp        = date_added

#提取具体数据

sql_query_info_pre = set names utf8

sql_query_info            = SELECT * FROM post WHERE id=$id

}

#配置索引

index ind_post

{

source    = post

path = /usr/local/coreseek/var/data/post

docinfo        = extern

#去除html标签

html_strip = 1

#完整的去除指定标签

html_remove_elements = style,script

#去除标签的时候,留下点东西

html_index_attrs = img=title,alt; a=title,alt

#设置索引字符集

charset_type    = zh_cn.utf-8

#设置词典

charset_dictpath = /usr/local/mmseg3/etc/

}

indexer

{

mem_limit                = 32M

}

searchd

{

port                    = 9312

log                        = /usr/local/coreseek/var/log/searchd.log

query_log                = /usr/local/coreseek/var/log/query.log

read_timeout            = 5

max_children            = 30

pid_file                = /usr/local/coreseek/var/log/searchd.pid

max_matches                = 1000

seamless_rotate            = 1

preopen_indexes            = 0

unlink_old                = 1

}

使用

1.基本搜索

开启服务接口

/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf

2.处理高亮

$opts = array(

"before_match" => "",

"after_match" => ""

);

foreach($list as $key=>$val){

$list[$key] = $sp->buildExcerpts($val,"ind_post",$keyword,$opts);

}

注意:处理后会变为索引数组

3.设置匹配模式

$sp->setMatchMode(SPH_MATCH_ANY);

4.设置排序模式

1.按照默认权重排序

$sp->setSortMode(SPH_SORT_EXTENDED,"@weight desc");

2.人工干预排序

1.配置文件设置属性字段

sql_attr_uint  = weight

2.重建索引

3.排序

$sp->setSortMode(SPH_SORT_EXTENDED,"weight desc @weight desc");

====================================

#开启去除标签

html_strip                              = 1

#去除标签的时候留下的信息

html_index_attrs                        = img=alt,title; a=title;

#完整去除的标签

html_remove_elements                    = style, script

====================================

增量索引

1.给数据库添加一张表,记录完整索引位置

不管数据是否存在,没有就添加,存在就更新

replace into sp_count(id,max_id) values(1,8);

replace into sp_count(id,max_id) values(1,(select max(id) from post));

2.修改主数据源

#更新最大id

sql_query_pre = replace into sp_count(id,max_id) values(1,(select max(id) from post));

#将当前所有的数据做主索引

sql_query = select id,title,content,weight from post where id <= (select max_id from sp_count where id = 1);

3.添加增量数据源

source postnew : post

{

sql_query_pre = set names utf8

sql_query = select id,title,content,weight from post where id > (select max_id from sp_count where id = 1);

}

4.主索引不变,添加增量索引

index ind_postnew : ind_post

{

source = postnew

path = /usr/local/coreseek/var/data/postnew

}

5.结合操作系统的计划任务即可

每天晚上4:30做主索引,每5分钟做增量索引

30 4 * * * /usr/local/coreseek/bin/indexer ind_post --rotate

*/5 * * * * /usr/local/coreseek/bin/indexer ind_postnew --rotate

====================================

更新词典词条

1.编辑/usr/local/mmseg3/etc/unigram.txt   词典模板文件

2. ../bin/mmseg -u unigram.txt  重新得到词典

3.替换词典  mv unigram.txt.uni uni.lib

4.重新创建索引

具体代码

header("content-type:text/html;charset=utf-8");

//包含类文件

include "./sphinxapi.php";

//接收关键字

$keyword = $_GET["keyword"];

//实例化sphinx对象

$sp = new SphinxClient();

//连接服务器

$sp->setServer("127.0.0.1","9312");

//设置匹配模式

$sp->setMatchMode(SPH_MATCH_ANY);

//执行搜索

$result = $sp->query($keyword,"*");

if($result["total"] == 0) exit("查无数据");

//整理所有id

$ids = join(",",array_keys($result["matches"]));

//连接数据库查数据

$dsn = "mysql:host=localhost;dbname=test";

$pdo = new PDO($dsn,"root","");

$sql = "set names utf8";

$pdo->query($sql);

$sql = "select * from post where id in ({$ids})";

//最终结果

$data = $pdo->query($sql)->fetchAll(2);

$opts = array(

"before_match" => "",

"after_match"=> ""

);

//处理结果

foreach($data as $key=>$val){

$data[$key] = $sp->buildExcerpts($val,"ind_post",$keyword,$opts);

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值