這是半年前沒有對外寫的文章,如今拿出來分享下。可能會有一些不正確或不嚴謹的地方,某些語言可能比較輕浮,請見諒。 php
首先說明一下coreseek其實就是基於sphinx的中文分詞版本,sphinx自己並無提供中文分詞功能,須要自行安裝中文詞庫比較麻煩,coreseek提供了中文分詞功能,提供了完整的官方中文使用文檔,而且在使用上和官方的sphinx並無差異。以coreseek-4.1版本爲例 html
下載地址 http://www.coreseek.cn/news/14/54/ mysql
幫助手冊 http://www.coreseek.cn/products-install/#doc_cn sql
下面開始coreseek的安裝 數據庫
安裝過程很簡單,下載coreseek-4.1-win32.zip,解壓至某一個文件夾,這裏假設放在d:\coreseek下,雙擊打開test.cmd進行測試,會出來一串命令行的提示信息,留意提示信息,若是沒有提示錯誤就算安裝完成 數據結構
安裝後,先別急着怎麼使用,首先要配置好文檔,解縮包中有測試文件這裏測試也略,教程儘可能簡單點(實際上是我懶。。) less
配置文件的位置能夠放在任何地方,不過建議就放在d:\coreseek\bin\的目錄好了,d:\coreseek\etc\目錄下提供了好多配置的參考,咱們把csft_mysql.conf複製至d:\coreseek\bin\下,命名爲sphinx.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, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents #sql_query第一列id需爲整數 #title、content做爲字符串/文本字段,被全文索引 sql_attr_uint = group_id #從SQL讀取到的值必須爲整數 sql_attr_timestamp = date_added #從SQL讀取到的值必須爲整數,做爲時間屬性 sql_query_info_pre = SET NAMES utf8 #命令行查詢時,設置正確的字符集 sql_query_info = SELECT * FROM documents WHERE id=$id #命令行查詢時,從數據庫讀取原始數據信息 } #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 #中文分詞配置,詳情請查看: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定義 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 = var/log/searchd_mysql.pid #請修改成實際使用的絕對路徑,例如:/usr/local/coreseek/var/... log = var/log/searchd_mysql.log #請修改成實際使用的絕對路徑,例如:/usr/local/coreseek/var/... query_log = var/log/query_mysql.log #請修改成實際使用的絕對路徑,例如:/usr/local/coreseek/var/... binlog_path = #關閉binlog日誌 }
這麼多字段幹嗎用的。。。 ui
先別管這個,看文件中的配置格式 編碼
source mysql { ... } index mysql { ... } ....
這些就是配置文件中的'類',配置格式就是以類爲基礎的,類的格式是 '關鍵字 [名稱] {}',每一個關鍵字的做用:
source:定義數據索引源(就是被搜索的數據啦),若是以mysql爲索引源,那麼source裏的信息包含數據庫帳號、密碼、端口、獲取數據索引的sql語句等
index:定義如何處理索引源,例如索引文件目錄、分詞單位、分詞配置文件、去除數據的html標籤等
indexer:定義indexer服務設置,例如內存使用大小限制、文件索引大小限制
searchd:定義searchd服務設置,用於搜索時的設置,例如服務端口、搜索最大數量限制、搜索超時時間等
其實配置文件中好多字段都有默認值的,並不須要咱們進行配置(不用寫出來),下面對一些經常使用的配置字段進行解釋,以mysql數據庫爲例
基本環境:
主機 localhost
帳號 root
密碼 root
端口 3306
數據庫 ibos
數據表:email
數據結構:
CREATE TABLE email ( emailid mediumint(8) unsigned NOT NULL auto_increment COMMENT '郵件id', fromid int(10) unsigned NOT NULL default '0' COMMENT '發送人ID', toid int(10) unsigned NOT NULL default '0' COMMENT '收件人ID', content text unsigned NOT NULL COMMENT '郵件內容', subject varchar(100) unsigned NOT NULL COMMENT '郵件標題', sendtime int(10) NOT NULL COMMENT '發送時間', attachment varchar(100) NOT NULL COMMENT '附件ID,以逗號分割', PRIMARY KEY (emailid), ) ENGINE=MyISAM';
配置內容:
#定義數據源,取一個好聽的名字,就叫email吧。。。 source attach { type = mysql #定義數據源的類型 sql_host = localhost sql_user = root sql_pass = root sql_db = ibos sql_port = 3306 #sql_query_pre是獲取數據源前執行的操做,內容是mysql可執行的語句,你能夠設置多個sql_query_pre,sphinx將會按順序執行 sql_query_pre = SET NAMES utf8 #通常設置好編碼以保證數據格式正確 sql_query_pre = xxx #sql_query就是真正獲取數據源的語句,內容是mysql可執行的語句 #SELECT的第一個字段是非負整數而且值都不相同的,搜索結果返回的ID就是這個,建議使用數據表的主鍵,這裏是emailid #其它字段是用來設置搜索條件和但願被搜索的字段,若是那個字段你認爲對搜索沒有做用,那就不要選擇 sql_query = SELECT emailid,fromid,toid,subject,content,sendtime,attachement FROM email #sql_attr_ 索引屬性,主要被用來設置搜索條件,而且搜索結果返回的信息也包含這些屬性的值 #設置某個屬性的前提是在sql_query中有返回這個字段的數據 #sql_attr_uint,從SQL讀取到的值必須爲整數 sql_attr_uint = fromid sql_attr_uint = toid #sql_attr_timestamp,從SQL讀取到的值必須爲整數,做爲時間屬性 sql_attr_timestamp = sendtime #程序運行前執行的查詢操做,這個沒有什麼意義,能夠不寫,僅僅用於調試目的 sql_query_info = SELECT * FROM email } #接下來要配置如何處理索引源,名稱建議和索引源同樣吧 index email { source = email #對應的source名稱 path = d:\coreseek\data\email #生成索引文件的路徑(包含文件名),可自定義 min_word_len = 1 #最小分詞長度 html_strip = 1 #是否去除html標籤,強烈建議開啓此項,像郵件這些富文本包含大量html標籤,對搜索沒有任何幫助,並且增長搜索時間和索引文件大小(至少增大5倍以上) charset_dictpath = d:\coreseek\etc\ #中文分詞配置文件目錄 charset_type = zh_cn.utf-8 } #還能夠定義多個索引源 source diary { } index diary { source :diary } #indexer服務定義,注意沒有名字!這個設置是全局的! indexer { mem_limit = 128M #內存大小限制 } #searchd服務定義,注意沒有名字!這個設置是全局的! searchd { listen = 9312 #服務端口,默認9312 read_timeout = 5 #最大搜索時間 max_matches = 1000 #最大匹配數 max_children = 30 #子進程數目限制 #這幾項看文檔吧 pid_file = d:\coreseek\var\log\searchd_mysql.pid log = d:\coreseek\var\log\searchd_mysql.log #所有searchd運行時事件會被記錄在這個日誌文件中。 query_log = d:\coreseek\var\log\query_mysql.log #所有搜索查詢會被記錄在此文件中 }
好了,配置就到這裏,那如何進行搜索,那就要用到cmd命令行,別嚇着了,其實咱們記住三個命令就能夠了
開始 - 運行 - cmd 打開命令行模式
創建索引
d:\coreseek\bin\indexer -c d:\coreseek\bin\sphinx.conf --all #sphinx.conf就是剛剛咱們的配置文件
按回車,如無心外會看到正在創建索引的信息,稍等一會就能夠了
開始搜索,注意命令行模式並不支持中文搜索(用其它方式,例如PHP沒問題),coreseek官方有解決辦法,可是咱們通常不用命令行進行搜索,這裏只是測試
d:\coreseek\bin\search -c d:\coreseek\bin\sphinx.conf 搜索字符串
例:搜索banana
d:\coreseek\bin\search -c d:\coreseek\bin\sphinx.conf banana
如無心外就會有搜索結果信息了。。。
打開控制檯,這條和搜索那條命令不同,是searchd不是search,這個命令下一篇講PHP的時候會用到
d:\coreseek\bin\searchd -c d:\coreseek\bin\sphinx.conf #Ctrl + c 可關閉控制檯
打開控制檯的做用就是讓讓sphinx監聽端口,接收搜索命令,例如用PHP代碼執行sphinx搜索就要打開控制檯
由於是類,因此能夠繼承。。
定義父類email
source email { .... }
定義子類subemail繼承email類的全部設置:
source subemail : email { #除了source,index也可使用繼承 .... }
子類中能夠重載email中的設置
source subemail : email { sql_host = www.ibos.com.cn #重載主機 sql_query = SELECT * FROM subemail #重載sql_query語句 }
其實繼承不多被使用到,但有一個很實用的例子就是有不少數據源使用同一數據庫的時候,繼承就派上用場了
source setdb { #setdb類只實現鏈接數據庫 sql_host = localhost sql_user = root sql_pass = root sql_db = ibos sql_port = 3306 } souce email : setdb{ #繼承setdb類 sql_query = ... #直接寫查詢語句,而不用再寫數據庫信息 } souce diary : setdb { sql_query = ... } souce article : setdb { sql_query = ... } souce forum : setdb { sql_query = ... }
如下是出自官方文檔,以爲官方解釋得比較清楚,更多例子參考文章中的附件 IBOS的配置文件中email的增量索引配置
有這麼一種常見的狀況:整個數據集很是大,以致於難於常常性的重建索引,可是每次新增的記錄卻至關地少。一個典型的例子是:一個論壇有1000000個已經歸檔的帖子,但天天只有1000個新帖子。
在這種狀況下能夠用所謂的「主索引+增量索引」(main+delta)模式來實現「近實時」的索引更新。
這種方法的基本思路是設置兩個數據源和兩個索引,對不多更新或根本不更新的數據創建主索引,而對新增文檔創建增量索引。在上述例子中,那1000000個已經歸檔的帖子放在主索引中,而天天新增的1000個帖子則放在增量索引中。增量索引更新的頻率能夠很是快,而文檔能夠在出現幾分種內就能夠被檢索到。
肯定具體某一文檔的分屬那個索引的分類工做能夠自動完成。一個可選的方案是,創建一個計數表,記錄將文檔集分紅兩部分的那個文檔ID,而每次從新構建主索引時,這個表都會被更新。
# in MySQL CREATE TABLE sph_counter ( counter_id INTEGER PRIMARY KEY NOT NULL, max_doc_id INTEGER NOT NULL ); # in sphinx.conf source main { # ... sql_query_pre = SET NAMES utf8 sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents sql_query = SELECT id, title, body FROM documents \ WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) } source delta : main { sql_query_pre = SET NAMES utf8 sql_query = SELECT id, title, body FROM documents \ WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) } index main { source = main path = /path/to/main # ... all the other settings } # note how all other settings are copied from main, # but source and path are overridden (they MUST be) index delta : main { source = delta path = /path/to/delta }
請注意,上例中咱們顯示設置了數據源delta的sql_query_pre選項,覆蓋了全局設置。必須顯示地覆蓋這個選項,不然對delta作索引的時候也會運行那條REPLACE查詢,那樣會致使delta源中選出的數據爲空。但是簡單地將delta的sql_query_pre設置成空也不行,由於在繼承來的數據源上第一次運行這個指令的時候,繼承來的全部值都會被清空,這樣編碼設置的部分也會丟失。所以須要再次顯式調用編碼設置查詢。