SHOPNC只支持迅搜全文检索
但通过修改可以添加shpinx/coreseek中文全文检索
安装coreseek,这个网上有很多教程,这里不再多嘴
修改:/data/config/config.ini.php
$config['fullindexer']['open'] = true;
$config['fullindexer']['type'] = 'coreseek';
$config['fullindexer']['coreseek']['server'] = '0573shop.vicp.net';
$config['fullindexer']['coreseek']['port'] = 9312;
$config['fullindexer']['coreseek']['querylimit'] = 20;
$config['fullindexer']['coreseek']['rankingmode'] = NULL;
$config['fullindexer']['coreseek']['matchmode'] = NULL;
$config['fullindexer']['coreseek']['index_shop'] = 'shop';
$config['fullindexer']['coreseek']['index_store'] = 'store_list';
$config['fullindexer']['type'] = 'coreseek';
$config['fullindexer']['coreseek']['server'] = '0573shop.vicp.net';
$config['fullindexer']['coreseek']['port'] = 9312;
$config['fullindexer']['coreseek']['querylimit'] = 20;
$config['fullindexer']['coreseek']['rankingmode'] = NULL;
$config['fullindexer']['coreseek']['matchmode'] = NULL;
$config['fullindexer']['coreseek']['index_shop'] = 'shop';
$config['fullindexer']['coreseek']['index_store'] = 'store_list';
修改/shop/control/search.php:
public function auto_completeOp() {
try {
if(C('fullindexer.appname')){
require(BASE_DATA_PATH.'/api/xs/lib/XS.php');
$obj_doc = new XSDocument();
$obj_xs = new XS(C('fullindexer.appname'));
$obj_index = $obj_xs->index;
$obj_search = $obj_xs->search;
$obj_search->setCharset(CHARSET);
$corrected = $obj_search->getExpandedQuery($_GET['term']);
if (count($corrected) !== 0) {
$data = array();
foreach ($corrected as $word)
{
$row['id'] = $word;
$row['label'] = $word;
$row['value'] = $word;
$data[] = $row;
}
exit(json_encode($data));
}
}elseif(C('fullindexer.type')=='coreseek'){
//try{
require ( BASE_DATA_PATH.'/api/sphinxapi.php' );
$cl = new SphinxClient ();
$cl->SetServer ( C('fullindexer.coreseek.server'), C('fullindexer.coreseek.port'));
$cl->SetConnectTimeout ( 20 );
$cl->SetArrayResult ( true );
//$cl->SetMatchMode ( SPH_MATCH_ANY);
//echo iconv( 'UTF-8', 'GBK',$_GET['term']); //将字符串的编码从GB2312转到UTF-8
//$cl->SetFilter ( "goods_name", [$_GET['term']]);
$res = $cl->Query ( $_GET['term'], "*" );
//exit(json_encode($res));
//php echo urlShop('goods','index',array('goods_id'=>$v['goods_id']));
if(count($res['matches'])>0){
$data = array();
//$md = Model('goods');
foreach($res['matches'] as $item){
if(!$item['attrs']['goods_name'])continue;
$row=array();
$row['id'] = $item['id'];
//$good = $md->getGoodsInfo(array('goods_id'=>$item['id']));
$row['value'] = $item['attrs']['goods_name'];;// // $good['goods_jingle'];//
$row['label'] = $item['attrs']['goods_name']; //$good['goods_name'];// 在下拉框中的值
$row['url'] = urlShop('goods','index',array('goods_id'=>$item['id']));
$data[] = $row;
}
//$data[] = $res;
exit(json_encode($data));
}
// }
}
} catch (XSException $e) {
if (is_object($obj_index)) {
$obj_index->flushIndex();
}
// Log::record('search\auto_complete'.$e->getMessage(),Log::RUN);
}
}
try {
if(C('fullindexer.appname')){
require(BASE_DATA_PATH.'/api/xs/lib/XS.php');
$obj_doc = new XSDocument();
$obj_xs = new XS(C('fullindexer.appname'));
$obj_index = $obj_xs->index;
$obj_search = $obj_xs->search;
$obj_search->setCharset(CHARSET);
$corrected = $obj_search->getExpandedQuery($_GET['term']);
if (count($corrected) !== 0) {
$data = array();
foreach ($corrected as $word)
{
$row['id'] = $word;
$row['label'] = $word;
$row['value'] = $word;
$data[] = $row;
}
exit(json_encode($data));
}
}elseif(C('fullindexer.type')=='coreseek'){
//try{
require ( BASE_DATA_PATH.'/api/sphinxapi.php' );
$cl = new SphinxClient ();
$cl->SetServer ( C('fullindexer.coreseek.server'), C('fullindexer.coreseek.port'));
$cl->SetConnectTimeout ( 20 );
$cl->SetArrayResult ( true );
//$cl->SetMatchMode ( SPH_MATCH_ANY);
//echo iconv( 'UTF-8', 'GBK',$_GET['term']); //将字符串的编码从GB2312转到UTF-8
//$cl->SetFilter ( "goods_name", [$_GET['term']]);
$res = $cl->Query ( $_GET['term'], "*" );
//exit(json_encode($res));
//php echo urlShop('goods','index',array('goods_id'=>$v['goods_id']));
if(count($res['matches'])>0){
$data = array();
//$md = Model('goods');
foreach($res['matches'] as $item){
if(!$item['attrs']['goods_name'])continue;
$row=array();
$row['id'] = $item['id'];
//$good = $md->getGoodsInfo(array('goods_id'=>$item['id']));
$row['value'] = $item['attrs']['goods_name'];;// // $good['goods_jingle'];//
$row['label'] = $item['attrs']['goods_name']; //$good['goods_name'];// 在下拉框中的值
$row['url'] = urlShop('goods','index',array('goods_id'=>$item['id']));
$data[] = $row;
}
//$data[] = $res;
exit(json_encode($data));
}
// }
}
} catch (XSException $e) {
if (is_object($obj_index)) {
$obj_index->flushIndex();
}
// Log::record('search\auto_complete'.$e->getMessage(),Log::RUN);
}
}
实现了首页搜索框的自动完成
附coreseek conf文件参考:
#源定义
source shop
{
type = mysql
sql_host = DBHOST
sql_user = DBUSER
sql_pass = DBPASS
sql_db = DBNAME
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query = SELECT goods_id, goods_name, store_id FROM shopnc_goods
#sql_query第一列id需为整数
#title、content作为字符串/文本字段,被全文索引
#sql_attr_uint = goods_id #从SQL读取到的值必须为整数
sql_attr_uint = store_id #从SQL读取到的值必须为整数
#sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性
#sql_attr_string = goods_name
# sql_field_string = store_name
sql_field_string = goods_name
sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集
sql_query_info = SELECT * FROM shopnc_goods WHERE goods_id=$id #命令行查询时,从数据库读取原始数据信息
}
source store_list
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = shopnc
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query = SELECT store_id , store_name, grade_id,member_name,seller_name,store_address,store_keywords,\
store_description,store_qq FROM shopnc_store
sql_field_string = store_name
sql_field_string = member_name
sql_field_string = store_address
sql_field_string = store_description
}
#index定义
index shop
{
source = shop #对应的source名称
path = E:/public/coreseek41/var/data/shop #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
#charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
charset_dictpath = E:/public/coreseek41/etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
#以下部分为中文分词核心配置
#stopwords = /path/to/stowords.txt的位置
ngram_len = 0
#以上部分为中文分词核心配置
}
index store_list:shop
{
source = store_list
path = E:/public/coreseek41/var/data/store_list
}
#全局index定义
indexer
{
mem_limit = 128M
}
#searchd服务定义
searchd
{
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
pid_file = E:/public/coreseek41/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
log = E:/public/coreseek41/var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
query_log = E:/public/coreseek41/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
binlog_path = #关闭binlog日志
}