coreseek使用
coreseek 配置文件csft_mysql.conf詳解
標(biāo)簽:?coreseek配置 2015-04-20 14:44?255人閱讀?評(píng)論(0)?收藏?舉報(bào) ?分類(lèi): 搜索(2)?目錄(?)[+]
這是半年前沒(méi)有對(duì)外寫(xiě)的文章,現(xiàn)在拿出來(lái)分享下。可能會(huì)有一些不正確或不嚴(yán)謹(jǐn)?shù)牡胤?#xff0c;某些語(yǔ)言可能比較輕浮,請(qǐng)見(jiàn)諒。
?
首先說(shuō)明一下coreseek其實(shí)就是基于sphinx的中文分詞版本,sphinx本身并沒(méi)有提供中文分詞功能,需要自行安裝中文詞庫(kù)比較麻煩,coreseek提供了中文分詞功能,提供了完整的官方中文使用文檔,并且在使用上和官方的sphinx并沒(méi)有差別。以coreseek-4.1版本為例
下載地址?http://www.coreseek.cn/news/14/54/?
幫助手冊(cè)?http://www.coreseek.cn/products-install/#doc_cn?
?
下面開(kāi)始coreseek的安裝
安裝過(guò)程很簡(jiǎn)單,下載coreseek-4.1-win32.zip,解壓至某一個(gè)文件夾,這里假設(shè)放在d:\coreseek下,雙擊打開(kāi)test.cmd進(jìn)行測(cè)試,會(huì)出來(lái)一串命令行的提示信息,留意提示信息,如果沒(méi)有提示錯(cuò)誤就算安裝完成
?
安裝后,先別急著怎么使用,首先要配置好文檔,解縮包中有測(cè)試文件這里測(cè)試也略,教程盡量簡(jiǎn)單點(diǎn)(其實(shí)是我懶。。)
配置文件的位置可以放在任何地方,不過(guò)建議就放在d:\coreseek\bin\的目錄好了,d:\coreseek\etc\目錄下提供了好多配置的參考,我們把csft_mysql.conf復(fù)制至d:\coreseek\bin\下,命名為sphinx.conf(可任意名稱(chēng)),打開(kāi)它看到的內(nèi)容大概是這樣:
?
| 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需為整數(shù) ??????????????????????????????????????????????????????????????#title、content作為字符串/文本字段,被全文索引 ????sql_attr_uint??????????? = group_id?????????? #從SQL讀取到的值必須為整數(shù) ????sql_attr_timestamp??????? = date_added #從SQL讀取到的值必須為整數(shù),作為時(shí)間屬性 ?? ????sql_query_info_pre????? = SET NAMES utf8??????????????????????????????????????? #命令行查詢時(shí),設(shè)置正確的字符集 ????sql_query_info??????????? = SELECT * FROM documents WHERE id=$id#命令行查詢時(shí),從數(shù)據(jù)庫(kù)讀取原始數(shù)據(jù)信息 } ?? #index定義 index mysql { ????source??????????? = mysql???????????? #對(duì)應(yīng)的source名稱(chēng) ????path??????????? = var/data/mysql #請(qǐng)修改為實(shí)際使用的絕對(duì)路徑,例如:/usr/local/coreseek/var/... ????docinfo??????????? = extern ????mlock??????????? = 0 ????morphology??????? = none ????min_word_len??????? = 1 ????html_strip??????????????? = 0 ?? ????#中文分詞配置,詳情請(qǐng)查看:http://www.coreseek.cn/products-install/coreseek_mmseg/ ????#charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux環(huán)境下設(shè)置,/符號(hào)結(jié)尾 ????charset_dictpath = etc/???????????????????????????? #Windows環(huán)境下設(shè)置,/符號(hào)結(jié)尾,最好給出絕對(duì)路徑,例如:C:/usr/local/coreseek/etc/... ????charset_type??????? = zh_cn.utf-8 } ?? #全局index定義 indexer { ????mem_limit??????????? = 128M } ?? #searchd服務(wù)定義 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? #請(qǐng)修改為實(shí)際使用的絕對(duì)路徑,例如:/usr/local/coreseek/var/... ????log = var/log/searchd_mysql.log??????? #請(qǐng)修改為實(shí)際使用的絕對(duì)路徑,例如:/usr/local/coreseek/var/... ????query_log = var/log/query_mysql.log #請(qǐng)修改為實(shí)際使用的絕對(duì)路徑,例如:/usr/local/coreseek/var/... ????binlog_path =??????????????????????????????? #關(guān)閉binlog日志 } |
這么多字段干嘛用的。。。
先別管這個(gè),看文件中的配置格式
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | source mysql { ????... } ?? index mysql { ????... } .... |
這些就是配置文件中的'類(lèi)',配置格式就是以類(lèi)為基礎(chǔ)的,類(lèi)的格式是?'關(guān)鍵字?[名稱(chēng)]?{}',每個(gè)關(guān)鍵字的作用:
source:定義數(shù)據(jù)索引源(就是被搜索的數(shù)據(jù)啦),如果以mysql為索引源,那么source里的信息包含數(shù)據(jù)庫(kù)賬號(hào)、密碼、端口、獲取數(shù)據(jù)索引的sql語(yǔ)句等
index:定義如何處理索引源,例如索引文件目錄、分詞單位、分詞配置文件、去除數(shù)據(jù)的html標(biāo)簽等
indexer:定義indexer服務(wù)設(shè)置,例如內(nèi)存使用大小限制、文件索引大小限制
searchd:定義searchd服務(wù)設(shè)置,用于搜索時(shí)的設(shè)置,例如服務(wù)端口、搜索最大數(shù)量限制、搜索超時(shí)時(shí)間等
?
其實(shí)配置文件中好多字段都有默認(rèn)值的,并不需要我們進(jìn)行配置(不用寫(xiě)出來(lái)),下面對(duì)一些常用的配置字段進(jìn)行解釋,以mysql數(shù)據(jù)庫(kù)為例
基本環(huán)境:
主機(jī)?localhost
賬號(hào)?root
密碼?root
端口?3306
數(shù)據(jù)庫(kù)?ibos
數(shù)據(jù)表:email
數(shù)據(jù)結(jié)構(gòu):
?
| 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 '發(fā)送人ID', toidint(10) unsigned NOTNULLdefault '0' COMMENT '收件人ID', content text unsigned NOTNULLCOMMENT '郵件內(nèi)容', subjectvarchar(100) unsigned NOTNULLCOMMENT? '郵件標(biāo)題', sendtimeint(10)NOTNULLCOMMENT '發(fā)送時(shí)間', attachmentvarchar(100)NOTNULLCOMMENT '附件ID,以逗號(hào)分割', PRIMARYKEY(emailid), ) ENGINE=MyISAM'; |
?
配置內(nèi)容:
?
| 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 | #定義數(shù)據(jù)源,取一個(gè)好聽(tīng)的名字,就叫email吧。。。 source attach { ????type??????????????????????? =???? mysql??? #定義數(shù)據(jù)源的類(lèi)型 ????sql_host????????????????? =???? localhost ????sql_user????????????????? =???? root ????sql_pass????????????????? =???? root ????sql_db???????????????????? =???? ibos ????sql_port?????????????????? =???? 3306 ?? ????#sql_query_pre是獲取數(shù)據(jù)源前執(zhí)行的操作,內(nèi)容是mysql可執(zhí)行的語(yǔ)句,你可以設(shè)置多個(gè)sql_query_pre,sphinx將會(huì)按順序執(zhí)行 ????sql_query_pre???????? =???? SET NAMES utf8??? #一般設(shè)置好編碼以保證數(shù)據(jù)格式正確 ????sql_query_pre???????? =???? xxx ????? ????#sql_query就是真正獲取數(shù)據(jù)源的語(yǔ)句,內(nèi)容是mysql可執(zhí)行的語(yǔ)句 ????#SELECT的第一個(gè)字段是非負(fù)整數(shù)并且值都不相同的,搜索結(jié)果返回的ID就是這個(gè),建議使用數(shù)據(jù)表的主鍵,這里是emailid ????#其它字段是用來(lái)設(shè)置搜索條件和希望被搜索的字段,如果那個(gè)字段你認(rèn)為對(duì)搜索沒(méi)有作用,那就不要選擇 ????sql_query??????????????? = SELECT emailid,fromid,toid,subject,content,sendtime,attachement FROM email ?? ????#sql_attr_??? 索引屬性,主要被用來(lái)設(shè)置搜索條件,并且搜索結(jié)果返回的信息也包含這些屬性的值 ????#設(shè)置某個(gè)屬性的前提是在sql_query中有返回這個(gè)字段的數(shù)據(jù) ????#sql_attr_uint,從SQL讀取到的值必須為整數(shù) ????sql_attr_uint??????????? = fromid ????sql_attr_uint??????????? = toid ????#sql_attr_timestamp,從SQL讀取到的值必須為整數(shù),作為時(shí)間屬性 ????sql_attr_timestamp? = sendtime ????? ????#程序運(yùn)行前執(zhí)行的查詢操作,這個(gè)沒(méi)有什么意義,可以不寫(xiě),僅僅用于調(diào)試目的 ????sql_query_info??? =??? SELECT * FROM email } ?? #接下來(lái)要配置如何處理索引源,名稱(chēng)建議和索引源一樣吧 index email { ????source???????????????? = email??? #對(duì)應(yīng)的source名稱(chēng) ????path??????????????????? = d:\coreseek\data\email??? #生成索引文件的路徑(包含文件名),可自定義 ????min_word_len???? = 1??? #最小分詞長(zhǎng)度 ????html_strip??????????? = 1??? #是否去除html標(biāo)簽,強(qiáng)烈建議開(kāi)啟此項(xiàng),像郵件這些富文本包含大量html標(biāo)簽,對(duì)搜索沒(méi)有任何幫助,而且增加搜索時(shí)間和索引文件大小(至少增大5倍以上) ????charset_dictpath = d:\coreseek\etc\??? #中文分詞配置文件目錄 ????charset_type??????? = zh_cn.utf-8 } ?? #還可以定義多個(gè)索引源 source diary { } index diary { ????source :diary } ?? #indexer服務(wù)定義,注意沒(méi)有名字!這個(gè)設(shè)置是全局的! indexer { ????mem_limit??????????? = 128M??? #內(nèi)存大小限制 } ?? #searchd服務(wù)定義,注意沒(méi)有名字!這個(gè)設(shè)置是全局的! searchd { ????listen???????????????????????? =? 9312??? #服務(wù)端口,默認(rèn)9312 ????read_timeout??????????? = 5????????? #最大搜索時(shí)間 ????max_matches??????????? = 1000??? #最大匹配數(shù) ????max_children??????????? = 30??????? #子進(jìn)程數(shù)目限制 ????#這幾項(xiàng)看文檔吧 ????pid_file????????????????????? = d:\coreseek\var\log\searchd_mysql.pid ????log???????????????????????????? = d:\coreseek\var\log\searchd_mysql.log??????? #全部searchd運(yùn)行時(shí)事件會(huì)被記錄在這個(gè)日志文件中。 ????query_log?????????????????? = d:\coreseek\var\log\query_mysql.log????????? #全部搜索查詢會(huì)被記錄在此文件中 } |
好了,配置就到這里,那如何進(jìn)行搜索,那就要用到cmd命令行,別嚇著了,其實(shí)我們記住三個(gè)命令就可以了
開(kāi)始?-?運(yùn)行?-?cmd????打開(kāi)命令行模式
建立索引
d:\coreseek\bin\indexer?-c?d:\coreseek\bin\sphinx.conf?--all???#sphinx.conf就是剛剛我們的配置文件
按回車(chē),如無(wú)意外會(huì)看到正在建立索引的信息,稍等一會(huì)就可以了
?
開(kāi)始搜索,注意命令行模式并不支持中文搜索(用其它方式,例如PHP沒(méi)問(wèn)題),coreseek官方有解決辦法,但是我們一般不用命令行進(jìn)行搜索,這里只是測(cè)試
d:\coreseek\bin\search?-c?d:\coreseek\bin\sphinx.conf?搜索字符串
例:搜索banana
d:\coreseek\bin\search?-c?d:\coreseek\bin\sphinx.conf?banana
如無(wú)意外就會(huì)有搜索結(jié)果信息了。。。
?
打開(kāi)控制臺(tái),這條和搜索那條命令不一樣,是searchd不是search,這個(gè)命令下一篇講PHP的時(shí)候會(huì)用到
d:\coreseek\bin\searchd?-c?d:\coreseek\bin\sphinx.conf????#Ctrl?+?c?可關(guān)閉控制臺(tái)
打開(kāi)控制臺(tái)的作用就是讓讓sphinx監(jiān)聽(tīng)端口,接收搜索命令,例如用PHP代碼執(zhí)行sphinx搜索就要打開(kāi)控制臺(tái)
?
?
?
更多知識(shí)
?
繼承
因?yàn)槭穷?lèi),所以可以繼承。。
定義父類(lèi)email
?
| 1 2 3 4 5 | source email { ????.... } |
定義子類(lèi)subemail繼承email類(lèi)的所有設(shè)置:
?
| 1 2 3 4 5 | source subemail : email { #除了source,index也可以使用繼承 ????.... } |
子類(lèi)中可以重載email中的設(shè)置
?
| 1 2 3 4 5 6 7 | source subemail : email { ????sql_host????? = www.ibos.com.cn??? #重載主機(jī) ????sql_query??? = SELECT * FROM subemail??? #重載sql_query語(yǔ)句 } |
其實(shí)繼承很少被使用到,但有一個(gè)很實(shí)用的例子就是有很多數(shù)據(jù)源使用同一數(shù)據(jù)庫(kù)的時(shí)候,繼承就派上用場(chǎng)了
?
| 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類(lèi)只實(shí)現(xiàn)連接數(shù)據(jù)庫(kù) ????sql_host????????????????? =???? localhost ????sql_user????????????????? =???? root ????sql_pass????????????????? =???? root ????sql_db???????????????????? =???? ibos ????sql_port?????????????????? =???? 3306 } souce email : setdb{??? #繼承setdb類(lèi) ????sql_query = ...??????? #直接寫(xiě)查詢語(yǔ)句,而不用再寫(xiě)數(shù)據(jù)庫(kù)信息 } souce diary : setdb { ????sql_query = ...? } ?? souce article : setdb { ????sql_query = ...? } souce forum : setdb { ????sql_query = ...? } |
?
增量索引
以下是出自官方文檔,覺(jué)得官方解釋得比較清楚,更多例子參考文章中的附件?IBOS的配置文件中email的增量索引配置
有這么一種常見(jiàn)的情況:整個(gè)數(shù)據(jù)集非常大,以至于難于經(jīng)常性的重建索引,但是每次新增的記錄卻相當(dāng)?shù)厣佟R粋€(gè)典型的例子是:一個(gè)論壇有1000000個(gè)已經(jīng)歸檔的帖子,但每天只有1000個(gè)新帖子。
在這種情況下可以用所謂的“主索引+增量索引”(main+delta)模式來(lái)實(shí)現(xiàn)“近實(shí)時(shí)”的索引更新。
這種方法的基本思路是設(shè)置兩個(gè)數(shù)據(jù)源和兩個(gè)索引,對(duì)很少更新或根本不更新的數(shù)據(jù)建立主索引,而對(duì)新增文檔建立增量索引。在上述例子中,那1000000個(gè)已經(jīng)歸檔的帖子放在主索引中,而每天新增的1000個(gè)帖子則放在增量索引中。增量索引更新的頻率可以非常快,而文檔可以在出現(xiàn)幾分種內(nèi)就可以被檢索到。
確定具體某一文檔的分屬那個(gè)索引的分類(lèi)工作可以自動(dòng)完成。一個(gè)可選的方案是,建立一個(gè)計(jì)數(shù)表,記錄將文檔集分成兩部分的那個(gè)文檔ID,而每次重新構(gòu)建主索引時(shí),這個(gè)表都會(huì)被更新。
?
| 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 } |
請(qǐng)注意,上例中我們顯示設(shè)置了數(shù)據(jù)源delta的sql_query_pre選項(xiàng),覆蓋了全局設(shè)置。必須顯示地覆蓋這個(gè)選項(xiàng),否則對(duì)delta做索引的時(shí)候也會(huì)運(yùn)行那條REPLACE查詢,那樣會(huì)導(dǎo)致delta源中選出的數(shù)據(jù)為空。可是簡(jiǎn)單地將delta的sql_query_pre設(shè)置成空也不行,因?yàn)樵诶^承來(lái)的數(shù)據(jù)源上第一次運(yùn)行這個(gè)指令的時(shí)候,繼承來(lái)的所有值都會(huì)被清空,這樣編碼設(shè)置的部分也會(huì)丟失。因此需要再次顯式調(diào)用編碼設(shè)置查詢。
原文地址:http://my.oschina.net/melonol/blog/127438
總結(jié)
以上是生活随笔為你收集整理的coreseek使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第一百三十期:14种常见编程语言的优缺点
- 下一篇: 第四十七期:漫画:什么是公有云、私有云和