coreseek使用
coreseek 配置文件csft_mysql.conf詳解
標簽:?coreseek配置 2015-04-20 14:44?255人閱讀?評論(0)?收藏?舉報 ?分類: 搜索(2)?目錄(?)[+]
這是半年前沒有對外寫的文章,現在拿出來分享下。可能會有一些不正確或不嚴謹的地方,某些語言可能比較輕浮,請見諒。
?
首先說明一下coreseek其實就是基于sphinx的中文分詞版本,sphinx本身并沒有提供中文分詞功能,需要自行安裝中文詞庫比較麻煩,coreseek提供了中文分詞功能,提供了完整的官方中文使用文檔,并且在使用上和官方的sphinx并沒有差別。以coreseek-4.1版本為例
下載地址?http://www.coreseek.cn/news/14/54/?
幫助手冊?http://www.coreseek.cn/products-install/#doc_cn?
?
下面開始coreseek的安裝
安裝過程很簡單,下載coreseek-4.1-win32.zip,解壓至某一個文件夾,這里假設放在d:\coreseek下,雙擊打開test.cmd進行測試,會出來一串命令行的提示信息,留意提示信息,如果沒有提示錯誤就算安裝完成
?
安裝后,先別急著怎么使用,首先要配置好文檔,解縮包中有測試文件這里測試也略,教程盡量簡單點(其實是我懶。。)
配置文件的位置可以放在任何地方,不過建議就放在d:\coreseek\bin\的目錄好了,d:\coreseek\etc\目錄下提供了好多配置的參考,我們把csft_mysql.conf復制至d:\coreseek\bin\下,命名為sphinx.conf(可任意名稱),打開它看到的內容大概是這樣:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #源定義 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日志 } |
這么多字段干嘛用的。。。
先別管這個,看文件中的配置格式
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | source mysql { ????... } ?? index mysql { ????... } .... |
這些就是配置文件中的'類',配置格式就是以類為基礎的,類的格式是?'關鍵字?[名稱]?{}',每個關鍵字的作用:
source:定義數據索引源(就是被搜索的數據啦),如果以mysql為索引源,那么source里的信息包含數據庫賬號、密碼、端口、獲取數據索引的sql語句等
index:定義如何處理索引源,例如索引文件目錄、分詞單位、分詞配置文件、去除數據的html標簽等
indexer:定義indexer服務設置,例如內存使用大小限制、文件索引大小限制
searchd:定義searchd服務設置,用于搜索時的設置,例如服務端口、搜索最大數量限制、搜索超時時間等
?
其實配置文件中好多字段都有默認值的,并不需要我們進行配置(不用寫出來),下面對一些常用的配置字段進行解釋,以mysql數據庫為例
基本環境:
主機?localhost
賬號?root
密碼?root
端口?3306
數據庫?ibos
數據表:email
數據結構:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | CREATETABLEemail ( emailid mediumint(8) unsigned NOTNULLauto_increment COMMENT '郵件id', fromidint(10) unsigned NOTNULLdefault '0' COMMENT '發送人ID', toidint(10) unsigned NOTNULLdefault '0' COMMENT '收件人ID', content text unsigned NOTNULLCOMMENT '郵件內容', subjectvarchar(100) unsigned NOTNULLCOMMENT? '郵件標題', sendtimeint(10)NOTNULLCOMMENT '發送時間', attachmentvarchar(100)NOTNULLCOMMENT '附件ID,以逗號分割', PRIMARYKEY(emailid), ) ENGINE=MyISAM'; |
?
配置內容:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | #定義數據源,取一個好聽的名字,就叫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
?
| 1 2 3 4 5 | source email { ????.... } |
定義子類subemail繼承email類的所有設置:
?
| 1 2 3 4 5 | source subemail : email { #除了source,index也可以使用繼承 ????.... } |
子類中可以重載email中的設置
?
| 1 2 3 4 5 6 7 | source subemail : email { ????sql_host????? = www.ibos.com.cn??? #重載主機 ????sql_query??? = SELECT * FROM subemail??? #重載sql_query語句 } |
其實繼承很少被使用到,但有一個很實用的例子就是有很多數據源使用同一數據庫的時候,繼承就派上用場了
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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,而每次重新構建主索引時,這個表都會被更新。
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | # 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 andpath 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設置成空也不行,因為在繼承來的數據源上第一次運行這個指令的時候,繼承來的所有值都會被清空,這樣編碼設置的部分也會丟失。因此需要再次顯式調用編碼設置查詢。
原文地址:http://my.oschina.net/melonol/blog/127438
總結
以上是生活随笔為你收集整理的coreseek使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一百三十期:14种常见编程语言的优缺点
- 下一篇: 第四十七期:漫画:什么是公有云、私有云和