#在Sphinx配置文件中,主要包括五個部分:source部分、index部分、searchd部分、indexer部分和common部分(前四部分比較重要);
#source是數據源,index負責定義索引,searchd負責定義searchd守護進程的相關選項,indexer負責定義生成索引的過程中索引的功能性限制;
#在數據源source中,type指定數據庫的類型,目前Sphinx只支持兩種類型的數據庫,一種是MySQL;
#sql_host指定主機,sql_user和sql_pass對應數據庫的賬號密碼,sql_db指定數據表,sql_port指定通信的端口;
#sql_query_pre指定在所有的數據庫操作之前需要進行的環境設置,例如指定utf-8和緩存屬性;
#sql_query指定數據庫查詢語句,這個地方一般不指定where和order by、group by等選項,這些事情一般交給Sphinx去過濾,不過對於分布式查詢可能會有所區別;
#關於sql_field_string、sql_ranged_throttle會在后面介紹;
#sql_attr_uint用來設置數據項為無符號整型,如有其它類似屬性可做類比理解;
#sql_query_info是sql_query的調試版本,因為設計的問題在運行的狀態中經常有問題,注釋掉不使用;
#在索引index中,source指定數據源,path指定數據源的絕對地址,docinfo定義文檔信息的存儲模式,extern表示文檔信息和文檔id分開存放,mlock設置已緩存數據的內存鎖定,為0的時候不鎖定;
#morphology用於設置詞形處理器,這個在后面會有詳細介紹;
#min_word_len字面意思就能理解,對於中文來說,設置成1比較合適;
#charset_type用來設置數據編碼(指定為utf-8);
#chinese_dictionary用來指定中文詞典的絕對地址;
#min_prefix_len和min_index_len用來指定最小前綴和最小后綴,這個在后面有詳細介紹;
#html_strip用來指定是否自動去掉所有html標簽;
#enable_star
#preopen指定預先打開索引還是每次使用索引的時候打開,由於Sphinx的索引是滾動實現的,所以一定意義上這兩者會產生沖突;
#disc=keywords
#在配置分布式索引的時候,需要指定type=distributed,同時在多個local中指定索引源;
#在indexer中,主要設置mem_limit,這個指定索引過程中的內存使用限制,默認為32M;
#其他的可設置項有max_iops,這個指定每秒最大的I/O次數,默認為0,無限制;
# max_iosize指定最大I/O大小,指定I/O流最大字節大小,默認為0,無限制;
此外還有write_buffer、max_xmlpipe2_field、max_file_field_buffer等設置;
#在searchd中,listen用來定義searchd守護進程監聽的端口和IP;
#log指定searchd進程的運行日志地址;
#query_log指定搜索日志的位置;
#read_timeout指定讀操作請求超時時間;
#clien_timeout指定單次會話中,兩次查詢之間最長等待時間;
#max_childrent指定子進程的最大數量;
#persistent_connections_limit指定持續連接限制;
#pid_file指定是進程ID文件的路徑;
#max_matches指定查詢的最大結果返回數,類似於SQL語句查詢里面的limit;
#seamless_rotate指定是否需要無縫切換,是的話指定為1,做增量索引需要這種模式;
#preopen_indexs指定后台運行是是否預先打開所有的索引,是的話指定1;
#unlink_old指定是否釋放舊索引,默認為1;
#mva_updates_pool 指定MVA更新池的大小,默認1M;
#max_packet_size 指定最大允許網絡包大小,默認8M;
# max_filters指定每個查詢允許最多的過濾器個數;
#max_batch_queries指定每個組最大的查詢數;
#此外還包括一些關於線程的設置;
#關於common;
#配置項morphology:
#詞形處理器,舉個栗子,在英文中,cats是cat的復數,所以兩個單詞實際上指向同一個事物,所以詞形處理器會把兩個單詞當做一個單詞來處理;
#可能存在的問題,舉個栗子,如果把gps當做gp來處理,自然是荒謬的;
#配置項:sql_query_pre=SET SESSION query_cache_type=OFF:
#這個配置項主要為了設置緩存類型;
#query cache_type包括三個選項,0、1、2;
#0對應於上面的OFF;
#1對應於上面的ON;
#2對應於上面的DEMAND;
#MySQL默認的為1,也就是默認開啟緩存,除非在查詢語句中指定sql_no_cache。但這個時候即使指定了sql_no_cache也會在緩存中查詢,因為sql_no_cache只是不更新緩存,不代表不會使用過去的緩存;
#當指定為2的時候,只有當通過query_cache指定緩存項時才會緩存;
#當指定為0的時候,會關閉緩存;
#配置項sql_field_string:
#這個項目一般指定一個在sql_query中的SQL指定的語句中select的一個數據屬性;
#這個數據屬性增加了索引;
#所以配置項決定了這個數據屬性可以全文搜索,並且返回詳細信息,非常關鍵;
#配置項sql_attr_string:
#這個配置項和sql_field_string的差別是這個數據屬性不具備索引;
#配置項sql_ranged_throttle:
#這個配置項可以和配置項sql_range_step放在一起去理解(注意,沒有d);
#這兩個數據項實際上是決定分時搜索的;
#在大數據搜索的時候,我們傾向於把一個很長的表分為多個部分去進行查詢;
#舉個例子,假如說有八十萬條數據,我們每次查找十萬條,然后把所有的查詢結構取並集,就會得到最終的結果集;
#這個里面,每次查詢十萬條,由sql_range_step指定,而上個例子中八次查詢的兩次查詢之間的時間間隔,就是由sql_ranged_throttle確定的;
#為什么要進行分區查詢呢?這是因為數據庫可能會進行更新,這個時候可能需要鎖表等操作;
#問題:數據庫更新的時候需要暫停查找嗎?和分布式查詢相比,這種解決方案是不是效果不好?
#配置項charset_table:
#這個配置項是sphinx支持東亞語言搜索的關鍵配置項之一;
#東亞語言指的是漢語、日語、朝鮮語,這些語言的特點是詞匯之間沒有語法標志(對比與英文的空格),所以分詞系統也是這些語言查詢的特殊之處和關鍵技術;
#在配置這個屬性的時候應該添加http://sphinxsearch.com/wiki/doku.php?id=charset_tables這個頁面里面對應的全部字段;
#這個配置項是轉換字符表,在上面鏈接里復制東亞語言專用的字符轉換表的時候記得修改一些字符,比如箭頭要改成->,這個網上介紹比較多;
#因為這個配置項的內容過多,為了保障頁面簡潔推薦寫成多行;
#使用中文詞典這一項不應該添加;
#配置項min_prefix_len:
#這個項目對應MySQL一個叫作索引前綴的功能,當然還有索引中綴和索引后綴的概念,原理相同,這里只介紹索引前綴;
#所謂索引前綴,我個人認為在英文中用處更大,在漢語中意義不大;
#前綴索引,大概是只對數據的前幾個字符進行索引;
#在英文中,一個單詞通過查詢前幾個字母就能區分開,在我們使用電子詞典的時候,輸入三四個字母一般都能匹配到含義相同的詞匯(差別可能只是詞性);
#在漢語中,一個詞匯最少只有一個字,兩個字居多,最長四個字就差不多,而這種情況下使用索引前綴就沒有太大意義;
#同時,對於地址項,使用索引前綴也沒有意義,因為很多地址的區分是后面的內容,想對而言,郵箱地址可能適合索引前綴;
#究竟是否要使用索引前綴,這個要具體問題具體分析;
#言歸正傳,關於min_prefix_len,指定的是一種原理類似的索引方案;
#例如這個配置項指定為3的時候,lovely就會生成lov、love、lovel、lovely對應的索引項;
#配置項ngram_len:
#在啟動中文分詞的前提下,這個配置項的意義不大;
#這個數據項目前只支持0和1;
#在建立索引的時候,如果這個配置項被設置為為1,那么每個會在字與字之間間隔開,以此為基礎創建索引;
#另外,這個配置項只會對ngram_chars中包含的字符進行這樣的分割,其他的沒有限制;
#加粗指的是可能需要驗證或者修改;