coreseek+php之sphinx擴展安裝+php調用示例

[參考資料](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執行整體索引。

Sphinx擴展安裝安裝

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模塊。

php調用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的相關筆記整理如下:

sphinx安裝常見錯誤_mogfee_新浪博客


Linux下Coreseek的安裝配置 - 為程序員服務


訊搜可以替代coreseek

迅搜(xunsearch) - 開源免費中文全文搜索引擎|PHP全文檢索|mysql全文檢索|站內搜索

概述 - 權威指南 - 迅搜(xunsearch) - 開源免費中文全文搜索引擎

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容