Sphinx/Coreseek簡介&安裝使用

loophome發表於2015-09-21

Sphinx/Coreseek簡介&安裝使用

Sphinx/Coreseek簡介

      在資料庫使用模糊匹配的時候,在資料量少的情況下,使用like '%keywork%'可以解決,但是在資料量大的情況下,查詢時間就變得難以忍受了。尤其是訪問量大的時候,僅僅靠mysql已經無法支撐業務。Sphinx是一個基於SQL的全文檢索引擎,可以結合MySQL,PostgreSQL做全文搜尋,它可以提供比資料庫本身更專業的搜尋功能,使得應用程式更容易實現專業化的全文檢索。Sphinx特別為一些指令碼語言設計搜尋API介面,如PHP,Python,Perl,Ruby等,同時為MySQL也設計了一個儲存引擎外掛。

Sphinx官網:http://sphinxsearch.com/

Sphinx下載地址:http://sphinxsearch.com/downloads/release/ 

      Coreseek 是一款中文全文檢索/搜尋軟體,以GPLv2許可協議開源釋出,基於Sphinx研發並獨立釋出,專攻中文搜尋和資訊處理領域,適用於行業/垂直搜尋、論壇/站內搜尋、資料庫搜尋、文件/文獻檢索、資訊檢索、資料探勘等應用場景。對於中文的搜尋場景,coreseek比sphinx更為適合。

Coreseek官網:http://www.coreseek.cn/

Coreseek下載地址:http://www.coreseek.cn/products-install/

Coreseek安裝

linux下的安裝步驟:參考官方文件http://www.coreseek.cn/products-install/install_on_bsd_linux/

安裝完成後,在bin目錄下有幾個可執行檔案

-rwxr-xr-x 1 # # 6592748 Oct 15  2013 indexer     #索引程式
-rwxr-xr-x 1 # # 6362996 Oct 15  2013 indextool
-rwxr-xr-x 1 # # 6434601 Oct 15  2013 search
-rwxr-xr-x 1 # # 7556446 Oct 15  2013 searchd     #搜尋服務程式
-rwxr-xr-x 1 # # 6295538 Oct 15  2013 spelldump


Coreseek配置

安裝完成後,在/etc下面找到coreseek.conf配置檔案

#主索引資料來源——用於資料初始化
source article_main
{
	type					= mysql
	sql_host				= 127.0.0.1
	sql_user				= #資料庫賬號#
	sql_pass				= #資料庫密碼#
	sql_db					= #資料庫名稱#
	sql_port				= #資料庫埠號#	# optional, default is 3306
	sql_sock				= /tmp/mysql.sock
	sql_query_pre			= SET NAMES utf8  #預執行語句,避免如果資料庫預設字符集不是utf8,會導致查詢不命中的情況#
  
	sql_query			=  #查詢的sql語句#
    #以下是SQL語句返回的值
	sql_attr_uint			= CATE_ID
	sql_attr_uint			= STATUS
	sql_attr_uint			= IS_ABLE
	sql_attr_str2ordinal    = SITE_ID
	sql_attr_timestamp		= ITIME
 
	sql_ranged_throttle	= 0
	sql_query_info		= SELECT * FROM article WHERE ID=$id 
}
#增量索引資料來源——用於資料更新
source article_delta : article_main  #這裡繼承了article_main的配置
{
	sql_query_pre			= SET NAMES utf8 #繼承方式,不能去掉該項
	sql_query			= #查詢的sql語句#
} 
 
#主索引 
index article_main
{
	source			= article_main
	path			= /usr/local/coreseek/var/data/article_main  #指定索引的存放路徑
	docinfo			= extern
	mlock			= 0
	morphology		= none
	charset_dictpath	= /usr/local/mmseg3/etc/
	min_word_len		= 1
	charset_type		= zh_cn.utf-8
	html_strip				= 0
}
#增量索引
index article_delta : article_main
{
	source			= article_delta
	path			= /usr/local/coreseek/var/data/article_delta  #指定索引的存放路徑
}
 
 
indexer
{
	mem_limit			= 1024M
}
 
searchd
{
	#listen				= 127.0.0.1:9312
	log					= /usr/local/coreseek/var/log/searchd.log
	query_log			= /usr/local/coreseek/var/log/query.log
	read_timeout		= 5
	client_timeout		= 5
	max_children		= 50
	pid_file			= /usr/local/coreseek/var/log/searchd.pid
	max_matches			= 1000 #最大匹配數,api的值不能大於該值
	seamless_rotate		= 0
	preopen_indexes		= 0 
	unlink_old			= 1
}


啟動coreseek服務並使用PHP連線

bin/searchd -c etc/coreseek.conf

這裡使用PHP呼叫coreseek的服務,在官網上下載SphinxClient這個class即可,以下是簡單的示例程式碼:

$cl = new SphinxClient ();
$cl->_maxmatches = 200;
$cl->SetServer ('127.0.0.1',9312);
$cl->SetConnectTimeout ( 3 );//超時時間
$cl->SetArrayResult ( true );//返回陣列格式
$cl->SetLimits($start, $page_size);

$cl->SetMatchMode ( SPH_MATCH_ANY );
$cl->SetRankingMode( SPH_RANK_PROXIMITY_BM25);
$cl->SetFilter("is_able", array(1));
$cl->SetSortMode (  SPH_SORT_EXTENDED , '@relevance DESC, ITIME DESC ' );//先按時間段排序,再按相關度排序。
$cl->AddQuery ($keyword, "article_main,article_delta");

$results = $cl->RunQueries();


定時更新文章

由於文章內容會不斷變化,每次更新重新索引所有文章是不現實的,coreseek提供了增量索引。我們制定了索引的更新策略。


#每天凌晨4點更新一次
00 04 * * * /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/coreseek.conf --all --rotate   

#十分鐘更新一次
*/10 * * * * /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/coreseek.conf article_delta --rotate


相關文章