引導:本人是個php菜鳥,公司的業務並不繁瑣,但是最近使用到了全文搜索,就想着用sphinx。
大致分爲三個部分,1:安裝;2配置:3調用api 。這裏主要說一下配置及調用api。安裝的步驟我之前單獨寫了一個帖子可以去看看,如果不太明白可以去官網,安裝步驟說的很清楚,廢話不多說,開始。
一、爲什麼要用增量索引?其實我個人認爲對數據量小的業務來說用增量索引完全沒有必要。可以定時重新生成索引就OK了。增量索引就是對 截至到上次生成的索引 以後添加的內容單獨生成索引,這樣數據量比較小,並且不影響業務處理,然後定期進行索引合併,爲了保持數據統一性,還需要定期從新生成索引。
1、上次生成索引的id需要記錄下來,可以用一張表來存儲。
CREATE TABLE
tbl_pre_coursevideo(
id
int(11) NOT NULL DEFAULT '0',
maxid
int(11) NOT NULL DEFAULT '0',
id
PRIMARY KEY ()
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、配置文件
source mysql
{
type = mysql
sql_host = 127.0.0.1
sql_user = root
sql_pass = 123456
sql_db = test
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF #如果這裏報錯去mysql配置文件修改
sql_query_pre = REPLACE INTO tbl_pre_coursevideo SELECT 1, MAX(id) FROM tbl_coursevideo #在剛纔新建的表中將當前索引生成的最多id存起來,爲增量索引做準備。
sql_query = SELECT id,title,create_time, subtitle,content,type FROM tbl_coursevideo WHERE id <=(SELECT maxid FROM tbl_pre_coursevideo WHERE id=1)
#上面這條sql可以分爲兩部分WHERE 之前,是對數據的查詢(根據自己的業務來定)where之後,是對剛纔的記錄
最大ID 的篩選
sql_attr_uint = id #從SQL讀取到的值必須爲整數
sql_attr_timestamp = create_time #從SQL讀取到的值必須爲整數,作爲時間屬性
sql_field_string = title #字符串字段(可全文搜索,可返回原始文本信息)
sql_field_string = subtitle #字符串字段(可全文搜索,可返回原始文本信息)
sql_field_string = content #字符串字段(可全文搜索,可返回原始文本信息)
}
source increment : mysql
{
sql_query_pre = SET NAMES utf8
sql_query = SELECT id,title,create_time, subtitle,content,type FROM
tbl_coursevideo WHERE id >(SELECT maxid FROM tbl_pre_coursevideo WHERE id=1)
#這是增量索引的數據源sql。和上面保持一致,唯一的變化,就是where條件之後,這裏查詢的是大於上次重新生成索引的id,即:剛剛添加的數據
}
#index定義
index mysql
{
source = mysql #對應的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_dictpath = etc/ #Windows環境下設置,/符號結尾,最好給出絕對路徑,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
}
index increment : mysql
{
source=increment
path = /usr/local/coreseek/var/data/increment
charset_dictpath = /usr/local/mmseg3/etc/
charset_type = zh_cn.utf-8
}
#全局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/...
}
使用:
1、生成索引(一下命令都是我自己的安裝環境路徑,具體的修改成自己的)
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all
#生成索引
這時tbl_pre_coursevideo 表裏會增加一條記錄。存放的就是你內容表中的最大id
2、
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft.conf
#開啓後臺進程
這時候對mysql數據源進行搜索的話其實已經是有數據的。
3、增量索引(內容表新增數據的前提)
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf increment --rotate
#執行完成以後會提示生成幾條增量索引數據,即你剛纔在內容表添加的數據條數。這時候其實就可以測試你的增量索引成功沒cl->Query($keyword, ‘increment ‘);調用api時可以用增量索引查詢你剛添加的內容
4、合併索引
usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf
–merge mysql increment –rotate
cl->Query('查詢的關鍵字', 'mysql'); //就能查詢出來剛纔的新添加的數據,以及以前的數據。
5、爲了保持數據統一,還需要定時從新生成索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all --rotate
#--rotate 是不影響服務器搜索時可以添加這個屬性
二、
1、調用api,這是我自己封裝的,sphinxapi.php安裝完成的文件裏有這個類
require 'sphinxapi.php';
class Sphinx {
private $host = '127.0.0.1';
private $port = 9312;
private $cl;
/*
* @desc 構造函數 初始化sphinx對象
*/
public function __construct() {
$this->cl = new SphinxClient ();
$this->cl->SetServer($this->host, $this->port);
$this->cl->SetConnectTimeout(1);
$this->cl->SetArrayResult(true);
$this->cl->SetMatchMode(SPH_MATCH_EXTENDED2);
$this->cl->SetRankingMode(SPH_RANK_WORDCOUNT);
}
/*
* @desc 搜索
* @param $page 頁數
* @param $pagesize 條數
* @param $keyword 搜索關鍵字
* @param $source 索引源
*/
public function search($keyword, $p, $pagesize) {
$page = ($p - 1) * 10;
$this->cl->SetLimits($page, $pagesize); //分頁
$res = $this->cl->Query($keyword, $source); //sphinx 查詢
}
}
2、定時任務
yum install crontab //安裝
crontab -e //打開編輯
然後定時 執行增量索引,合併索引,從新生成索引
住:如果說合並索引頁成功了。但是查詢出來的數據一直爲空,那你就看看配置文件那
path = /usr/local/coreseek/var/data/increment #這裏的配置,主索引是否和增量索引這隻的路徑一樣,increment 就是索引的文件名,會在data文件夾下。
至此就講了。如果有什麼不會的,把這篇博客好好看看,包括註釋,這都是我遇到的一些問題,都給註釋了起來。如果有什麼不明白的地方也可以給我留言,知無不盡。下次給大家講一講分詞哪一塊。