為了應付日益龐大的資料量,我開始試用coreseek協助全文搜尋的功能,獲得了不錯的效果,因而列出幾項心得留作記錄。
一、官網
http://www.coreseek.cn/products-install/install_on_windows/
有非常豐富的資訊,以及全中文的使用手冊。
二、教學網站
http://www.cnblogs.com/phpway/archive/2013/02/06/2908097.html
這是我獲益最大的教學網站。
三、有的沒的
1.執行coreseek要先跑索引,索引的對象在mysql裡可以是表格,也可以是view,可以用view做索引真的很方便。另外,理論上作為主鍵的數字是不能重複的,但實際使用上似乎可以,尤其用view跑的時候常會有這種情形,但前提是後面的文字內容必須一樣。
2.系統帶的分詞設定很有可能會導致某些資料找不到,用mysql自帶的全文搜尋和coreseek的搜尋結果就可以看出來,所以要求精確搜尋的人記得清空分詞的檔案(預設為var資料夾下的uni.lib、unigram.txt)。
3.資料限制1000筆真的不夠,要在csft_mysql.conf裡改,使用api的話,sphinxapi.php也要改。
4.排序方式說明說講得有點模糊,補充如下:
$sph = new SphinxClient();
$sph->SetSortMode(SPH_SORT_ATTR_ASC,"xxx")
在SphinxClient對象中有個SetSortMode設定,共有六個模式,比較常用的有四種:
SPH_SORT_RELEVANCE 模式, 按相关度降序排列(預設模式)
SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面)
SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面)
SPH_SORT_EXPR 模式,按某个算术表达式排序。
第二三種後面要接一個屬性值,屬性值要在csft_mysql.conf的
sql_attr_uint = xxx
這邊設定,一開始就要讀進去。用的時候直接名字加引號就可以了,不用加$。
5.預設的匹配模式有點麻煩,反正加引號針對那個詞找就好了。
6.其他
以他自帶的csft_mysql.conf範例來說
source mysql
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_port = 3306
//上面這些帳密等都不用加引號
sql_query_pre = SET NAMES utf8
sql_query = SELECT id, group_id FROM documents
#sql_query第一列id需为整数
#title、content作为字符串/文本字段,被全文索引
//這裡第一個是id,第二個是全文,第三個以後是篩選用的attr
sql_attr_uint = group_id #从SQL读取到的值必须为整数
//篩選用的attr欄位名稱
sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性
//沒用過,找不到也無所謂
sql_query_info_pre = SET NAMES utf8
sql_query_info = SELECT * FROM documents WHERE id=$id
//這一行如果用api的話,不用管也無所謂
}
#index定义
index mysql
{
source = mysql #对应的source名称
path = var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
charset_dictpath = 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
}
7.與mysql
使用api的話(coreseek\api\sphinxapi.php),只能撈出id,要用這些id再進mysql撈全文出來,使用表的話當然沒問題,用view就要小心,id不能重複,最好要設計成從id就知道是哪個表出來的,這樣找起來更快一點。
一、官網
http://www.coreseek.cn/products-install/install_on_windows/
有非常豐富的資訊,以及全中文的使用手冊。
二、教學網站
http://www.cnblogs.com/phpway/archive/2013/02/06/2908097.html
這是我獲益最大的教學網站。
三、有的沒的
1.執行coreseek要先跑索引,索引的對象在mysql裡可以是表格,也可以是view,可以用view做索引真的很方便。另外,理論上作為主鍵的數字是不能重複的,但實際使用上似乎可以,尤其用view跑的時候常會有這種情形,但前提是後面的文字內容必須一樣。
2.系統帶的分詞設定很有可能會導致某些資料找不到,用mysql自帶的全文搜尋和coreseek的搜尋結果就可以看出來,所以要求精確搜尋的人記得清空分詞的檔案(預設為var資料夾下的uni.lib、unigram.txt)。
3.資料限制1000筆真的不夠,要在csft_mysql.conf裡改,使用api的話,sphinxapi.php也要改。
4.排序方式說明說講得有點模糊,補充如下:
$sph = new SphinxClient();
$sph->SetSortMode(SPH_SORT_ATTR_ASC,"xxx")
在SphinxClient對象中有個SetSortMode設定,共有六個模式,比較常用的有四種:
SPH_SORT_RELEVANCE 模式, 按相关度降序排列(預設模式)
SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面)
SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面)
SPH_SORT_EXPR 模式,按某个算术表达式排序。
第二三種後面要接一個屬性值,屬性值要在csft_mysql.conf的
sql_attr_uint = xxx
這邊設定,一開始就要讀進去。用的時候直接名字加引號就可以了,不用加$。
5.預設的匹配模式有點麻煩,反正加引號針對那個詞找就好了。
6.其他
以他自帶的csft_mysql.conf範例來說
source mysql
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_port = 3306
//上面這些帳密等都不用加引號
sql_query_pre = SET NAMES utf8
sql_query = SELECT id, group_id FROM documents
#sql_query第一列id需为整数
#title、content作为字符串/文本字段,被全文索引
//這裡第一個是id,第二個是全文,第三個以後是篩選用的attr
sql_attr_uint = group_id #从SQL读取到的值必须为整数
//篩選用的attr欄位名稱
sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性
//沒用過,找不到也無所謂
sql_query_info_pre = SET NAMES utf8
sql_query_info = SELECT * FROM documents WHERE id=$id
//這一行如果用api的話,不用管也無所謂
}
#index定义
index mysql
{
source = mysql #对应的source名称
path = var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
charset_dictpath = 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
}
7.與mysql
使用api的話(coreseek\api\sphinxapi.php),只能撈出id,要用這些id再進mysql撈全文出來,使用表的話當然沒問題,用view就要小心,id不能重複,最好要設計成從id就知道是哪個表出來的,這樣找起來更快一點。
留言
張貼留言