[參考資料](https://blog.csdn.net/moqiang02/article/details/42027243)
[關于排序和分而已,及sphinxapi.php的調用](https://blog.csdn.net/joyatonce/article/details/52059564)
首先了解sphinx是什么?
他是一個服務,用于搜索的服務,也可以說是一個搜索引擎,
如果使用搜索引擎,必須開啟他的服務,
其次在api根據端口號啟用服務,并傳入關鍵字
注意在thinkphp中在new對象的時候要加\,
如下:
public function test()
{
$cl=new \SphinxClient();
$cl->SetServer('127.0.0.1',9312);
$cl->SetArrayResult(true);
$cl->SetMatchMode(SPH_MATCH_ANY);
$cl->SetLimits(0,12);
$index_name="dizhi";
$key="經營部";
$this->s_keywords=$key;
$this->s_index=$index_name;
$this->h_cl=$cl;
$this->h_opts= array(
"before_match" => "",
"after_match" => "",
"chunk_separator" => "
",
//? ? ? ? ? ? "limit" => 6,
//? ? ? ? ? ? "around" =>3
? ? ? ? );
$res=$cl->Query($key,$index_name);
$ids=array_column($res['matches'],"id");
//? ? ? ? var_dump($ids);
? ? ? ? $m=M();
$where['id']=array("in",$ids);
$res=$m->table("address")->where($where)->select();
//BuildExcerpts ( $docs, $this->s_index, $this->s_keywords, $this->h_opts);
? ? ? ? foreach ($resas $k=>$v){
$res[$k]=$cl->BuildExcerpts ( $v, $this->s_index, $this->s_keywords, $this->h_opts);
}
//? ? ? ? var_dump($res);
? ? ? ? $this->assign("res",$res);
$this->display("");
}
-------------------------------------方法結束
第二點要注意的是,在search.exe中是不能搜索中文的,但是可以用英文和數字測試是否可用,
返回的weight和size,就有ip,根據ip去驗證;
下面附上常用命令
indexer.exe -c D:\project\coreseek\sphinx.conf zhilian //生成索引文件
search.exe -c D:\mysoftware\coreseek-3.2.14-win32\sphinx.conf redis? ? //查詢redis的數目
D:\mysoftware\coreseek-3.2.14-win32\bin>indexer.exe -c D:\mysoftware\coreseek-3.
2.14-win32\sphinx.conf --merge zhilian? add_zhilian? --rotate //合并索引
-c 執行? 配置目錄? 索引文件名稱
D:\project\coreseek\bin>searchd.exe? --install? -c? D:\mysoftware\coreseek-3.2.14-win32\sphinx.conf? ? ? ? //安裝服務器
sc delete searchd//刪除服務
replace into a select 1,max(id) from zhilian;//記錄生成的最大id數
D:\mysoftware\coreseek-3.2.14-win32\bin>indexer.exe -c D:\mysoftware\coreseek-3.
2.14-win32\sphinx.conf --merge zhilian? add_zhilian? --rotate//合并索引
D:\mysoftware\coreseek-3.2.14-win32\bin>indexer.exe -c D:\mysoftware\coreseek-3.
2.14-win32\sphinx.conf add_zhilian? //生成新增數據的索引
///////一定要注意? searchd是否啟動服務
sphinx與mysql的配置
創建sphinx統計表,在coreseek_test庫中執行。
CREATETABLEsph_counter
(?
counter_idINTEGERPRIMARYKEYNOTNULL,
max_doc_idINTEGERNOTNULL
);?
創建配置sphinx與mysql的配置文件
# vi /usr/local/coreseek/etc/csft_mysql.conf?
#MySQL數據源配置,詳情請查看:http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html#conf-reference?
#源定義?
source main?
{?
? ? type? ? ? ? ? ? ? ? ? ? = mysql?
? ? sql_host? ? ? ? ? ? ? ? = localhost?
? ? sql_user? ? ? ? ? ? ? ? = root?
? ? sql_pass? ? ? ? ? ? ? ? = 123456?
? ? sql_db? ? ? ? ? ? ? ? ? = coreseek_test?
? ? sql_port? ? ? ? ? ? ? ? = 3306?
? ? sql_query_pre? ? ? ? ? = SET NAMES utf8?
? ? sql_query_pre? ? ? ? ? = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM hr_spider_company;?
? ? sql_query? ? ? ? ? ? ? = SELECT * FROM hr_spider_company WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) #sql_query第一列id需為整數?
? ? #title、content作為字符串/文本字段,被全文索引 (注:執行報錯的話把下面的幾行注釋掉)
? ? sql_attr_uint? ? ? ? ? ? = id? ? ? ? ? ? ? ? ? ? ? ? #從SQL讀取到的值必須為整數?
? ? sql_attr_uint? ? ? ? ? ? = from_id? ? ? ? ? ? ? ? #從SQL讀取到的值必須為整數,不支持全文檢索?
? ? sql_attr_uint? ? ? ? ? ? = link_id? ? ? ? ? ? ? ? #從SQL讀取到的值必須為整數,不支持全文檢索?
? ? sql_attr_uint? ? ? ? ? ? = add_time? ? ? ? ? ? ? ? #從SQL讀取到的值必須為整數,不支持全文檢索?
? ? sql_field_string? ? ? ? = link_url? ? ? ? ? ? ? ? #字符串字段(可全文搜索,可返回原始文本信息)?
? ? sql_field_string? ? ? ? = company_name? ? ? ? ? #字符串字段(可全文搜索,可返回原始文本信息)?
? ? sql_field_string? ? ? ? = type_name? ? ? ? ? ? #字符串字段(可全文搜索,可返回原始文本信息)?
? ? sql_field_string? ? ? ? = trade_name? ? ? ? ? ? #字符串字段(可全文搜索,可返回原始文本信息)?
? ? sql_field_string? ? ? ? = email? ? ? ? ? ? ? ? #字符串字段(可全文搜索,可返回原始文本信息)?
? ? sql_field_string? ? ? ? = description? ? ? ? ? ? #字符串字段(可全文搜索,可返回原始文本信息)?
? ? sql_query_info_pre? ? ? = SET NAMES utf8? ? ? ? #命令行查詢時,設置正確的字符集?
? ? sql_query_info? ? ? ? ? = SELECT id,from_id,link_id,company_name,type_name,trade_name,address,description, FROM_UNIXTIME(add_time) AS add_time? FROM hr_spider_company? WHERE id=$id? ? ? ? ? ? ? ? ? ? #命令行查詢時,從數據庫讀取原始數據信息?
}?
source delta : main? ?
{? ?
? ? sql_query_pre? ? ? ? ? = SET NAMES utf8? ?
? ? sql_query? ? ? ? ? ? ? = SELECT * FROM hr_spider_company WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )?
? ? sql_query_post_index? ? = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM hr_spider_company?
}? ?
#index定義?
index main?
{?
? ? source? ? ? ? ? ? ? ? = main? #對應的source名稱?
? ? path? ? ? ? ? ? ? ? ? = /usr/local/coreseek/var/data/mysql? #請修改為實際使用的絕對路徑,例如:/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_type? ? ? ? = zh_cn.utf-8?
}?
index delta : main? ?
{? ?
? ? source? ? ? ? ? = delta? ?
? ? path? ? ? ? ? ? = /usr/local/coreseek/var/data/delta?
}?
#全局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? ? = /usr/local/coreseek/var/log/searchd_mysql.pid? #請修改為實際使用的絕對路徑,例如:/usr/local/coreseek/var/...?
? ? log? ? ? ? ? = /usr/local/coreseek/var/log/searchd_mysql.log? #請修改為實際使用的絕對路徑,例如:/usr/local/coreseek/var/...?
? ? query_log? ? = /usr/local/coreseek/var/log/query_mysql.log? ? #請修改為實際使用的絕對路徑,例如:/usr/local/coreseek/var/...?
? ? binlog_path? =? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #關閉binlog日志?
}
我的測試表名為hr_spider_company,你只需要根據實際需求更改為自己的表名即可。
調用命令列表:
啟動后臺服務(必須開啟)
# /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf
執行索引(查詢、測試前必須執行一次)
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate
執行增量索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate
合并索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0
(為了防止多個關鍵字指向同一個文檔加上--merge-dst-range deleted 0 0)
后臺服務測試
# /usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft_mysql.conf? aaa
關閉后臺服務
# /usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --stop
自動化命令:
crontab -e
*/1 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate?
*/5 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0?
30 1 * * *? /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate
以下任務計劃的意思是:每隔一分鐘執行一遍增量索引,每五分鐘執行一遍合并索引,每天1:30執行整體索引。
Coreseek官方教程中建議php使用直接include一個php文件進行操作,事實上php有獨立的sphinx模塊可以直接操作coreseek(coreseek就是sphinx!)已經進入了php的官方函數庫,而且效率的提升不是一點點!但php模塊依賴于libsphinxclient包。
[第一步] 安裝依賴libsphinxclient
# cd /var/install/coreseek-4.1-beta/csft-4.1/api/libsphinxclient/?
# ./configure? --prefix=/usr/local/sphinxclient?
configure: creating ./config.status?
config.status: creating Makefile?
config.status: error: cannot find input file: Makefile.in? #報錯configure失敗? ? ?
//處理configure報錯?
編譯過程中報了一個config.status: error: cannot find input file: src/Makefile.in這個的錯誤,然后運行下列指令再次編譯就能通過了:?
# aclocal?
# libtoolize --force?
# automake --add-missing?
# autoconf?
# autoheader?
# make clean?
//從新configure編譯?
# ./configure?
# make && make install?
[第二步] 安裝sphinx的PHP擴展
http://pecl.php.net/package/sphinx?
# wget http://pecl.php.net/get/sphinx-1.3.0.tgz?
# tar zxvf sphinx-1.3.0.tgz?
# cd sphinx-1.3.0?
# phpize?
# ./configure --with-php-config=/usr/bin/php-config --with-sphinx=/usr/local/sphinxclient?
# make && make install?
# cd /etc/php.d/?
# cp gd.ini? sphinx.ini?
# vi sphinx.ini?
extension=sphinx.so?
# service php-fpm restart?
打開phpinfo看一下是否已經支持了sphinx模塊。
$s =newSphinxClient;
$s->setServer("127.0.0.1",9312);
$s->setMatchMode(SPH_MATCH_PHRASE);?
$s->setMaxQueryTime(30);
$res = $s->query("寶馬",'main');#[寶馬]關鍵字,[main]數據源source?
$err = $s->GetLastError();?
var_dump(array_keys($res['matches']));
echo"
"."通過獲取的ID來讀取數據庫中的值即可。"."
";
echo'
';
var_dump($res);?
var_dump($err);?
echo'';
調用示例二:支持分頁
header("Content-type: text/html; charset=utf-8");
require("./sphinxapi.php");
$s =newSphinxClient;
$s->setServer("192.168.252.132",9312);
//SPH_MATCH_ALL, 匹配所有查詢詞(默認模式); SPH_MATCH_ANY, 匹配查詢詞中的任意一個; SPH_MATCH_EXTENDED2, 支持特殊運算符查詢?
$s->setMatchMode(SPH_MATCH_ALL);?
$s->setMaxQueryTime(30);//設置最大搜索時間?
$s->SetArrayResult(false);//是否將Matches的key用ID代替?
$s->SetSelect ("*");//設置返回信息的內容,等同于SQL?
$s->SetRankingMode(SPH_RANK_BM25);//設置評分模式,SPH_RANK_BM25可能使包含多個詞的查詢的結果質量下降。?
//$s->SetSortMode(SPH_SORT_EXTENDED);? ? ? ? ? ? ? ? //發現增加此參數會使結果不準確?
//$s->SetSortMode(SPH_SORT_EXTENDED,"from_id asc,id desc");? //設置匹配項的排序模式, SPH_SORT_EXTENDED按一種類似SQL的方式將列組合起來,升序或降序排列。?
$weights =array('company_name'=>20);
$s->SetFieldWeights($weights);//設置字段權重?
$s->SetLimits (0,30,1000,0);//設置結果集偏移量? SetLimits (便宜量,匹配項數目,查詢的結果集數默認1000,閥值達到后停止)?
//$s->SetFilter ( $attribute, $values, $exclude=false );? ? //設置屬性過濾?
//$s->SetGroupBy ( $attribute, $func, $groupsort="@group desc" );? ? //設置分組的屬性?
$res = $s->query('@* "汽車"','main','--single-0-query--');#[寶馬]關鍵字,[news]數據源source?
//代碼高亮?
$tags =array();
$tags_name =array();
foreach($res['matches']as$key=>$value){
$tags[] = $value['attrs'];
$company_name[] = $value['attrs']['company_name'];
$description[] = $value['attrs']['description'];
}?
$company_name = $s->BuildExcerpts ($company_name,'main','汽車', $opts=array() );//執行高亮,這里索引名字千萬不能用*?
$description = $s->BuildExcerpts ($description,'main','汽車', $opts=array() );//執行高亮,這里索引名字千萬不能用*?
foreach($tagsas$k=>$v)
{?
$tags[$k]['company_name'] = $company_name[$k];//高亮后覆蓋?
$tags[$k]['description'] = $description[$k];//高亮后覆蓋?
}?
// 高亮后覆蓋?
$i =0;
foreach($res['matches']as$key=>$value){
$res['matches'][$key] = $tags[$i];
$i++;?
}?
$err = $s->GetLastError();?
echo'
';
var_export($res);?
var_export($err);?
echo'';
******************************************************************************************************************
錯誤:FATAL: failedto lock pid file '/home/zhangjie_z.pt/local/sphinx/var/log/searchd.pid':Resource temporarily unavailable (searchd alrecoreseek+php之sphinx擴展安裝+php調用示例 - CSDN博客ady running?)
意思就是你已經打開了一個search進程,你需要找到相關進程號ps -e|grep searchd,然后kill PID殺死之前的進程,再啟動新進程)
啟動 searchd 服務時提示如下錯誤:
index 'test1': search error: failed to open /var/lib/sphinx/test1.sph: sphinx 錯誤解決 index 'test1': search error: failed to open /var/lib/sphinx/test.sph:No such file or directory; NOT SERVING
這個錯誤可能是沒有建立好索引導致的,所以 indexer --all 很重要
CentOS6.x安裝Coreseek和Sphinx擴展for PHP - 簡書
安裝coreseek與sphinx遇見的問題 - sphinx- - ITkeyowrd
搭建coreseek(sphinx+mmseg3)詳細安裝配置+php之sphinx擴展安裝+php調用示例 - CSDN博客
關于coressek的相關筆記整理如下:
訊搜可以替代coreseek