全文檢索之sphinx源碼分析--配置文件和輪轉操作

    從索引的數據來源、實時可見性的角度來看,我們可以認爲conf配置文件是Sphinx組件的中心。所有有關數據來源、索引文件包含的數據量、數據屬性、檢索程序searchd監聽的端口、響應時間等等一系列配置參數都來自conf文件。

    下面以一些典型的配置文件配置項來進行解釋:

    source xxx:基本數據來源,每次創建索引文件時都是都執行該段的sql_qurey語句,從中獲取基本數據提供給indexer。

    sql_query:索引數據來源,必須有id列。我們可以通過關鍵字從searchd中取得id值,然後通過id值反查數據庫。

    Index XXXXXX:這些字段就是用來定義每一個索引文件的具體屬性的。需要注意如果我們沒有設置docinfo因此會採取默認值none,也就是說不存儲任何doc裏的信息;而hitless_words=all則表示我們忽略了所有的的hitPos信息。這兩個字段的設置可以使我們的索引文件所佔空間大大減小(spa和spp分別負責這兩部分信息的存儲,可以看到如果按照這樣的設置則每個索引中這兩個文件基本都是空的)。sphinx支持分佈式的索引(distributed),該類型索引中的local字段包含了分佈式可查的所有索引文件,如果配置了agent則可以指向遠程searchd服務端口。當分佈式索引接收到請求時會向local下的所有索引文件進行查詢,同時將接收到的語句傳給agent。而當遠程監聽的searchd接收到該語句後就對自己名下的索引文件進行檢索,再返回給searchd_present,最終由searchd_present進行彙總返回。下圖是一個典型的分佈式索引

    Indexer和searchd:分別對建索引的indexer和查索引的searchd進行了設置。需要注意不同配置文件針對不同的searchd,因此監聽的端口和pid文件路徑會有所不同,其中pid文件很關鍵,在rotate屬性被激活時,indexer會通過該文件中記錄的searchd的id號發送sighup信號。

    關於indexer和searchd各自的設置項目在官方文檔裏都有明確的解釋,即使只看名稱也可以猜個大概,這裏就不多說了,需要重點說明的幾個參數是:

    preopen_indexes:索引預開啓,是否在啓動是強制重新打開所有索引文件。可選選項,默認爲1(全部打開)。設置爲 1 時,會對所有提供服務的索引打開 preopen 選項,在代碼層面會在prealloc函數中直接打開spd、spp、spi等文件(默認只打開spi的checkpoint列表,在查詢時纔會打開需要檢索的索引文件spd和spp)Preopen_indexes可以防止rotatequery交插進行時引起的查詢失敗,所以sphinx建議打開。

    max_matches:最大返回匹配數,守護進程在內存中爲每個索引所保持並返回給客戶端的匹配數目的最大值。可選選項,默認值爲1000。我們在進行查詢到的時候會有cutoff和max_matches兩個參數可配,conf文件的max_matches是查詢時的max_matches的最大值,代表一次查詢返回的結果行數,而cutoff則很奇怪,意思是對每個索引文件進行查詢返回的最大結果行數,通常設置這兩個值相同即可

    ROTATE輪轉

    當rotate選項被激活時,indexer在完成創建或merge的操作後indexer需要將.tmp文件重命名爲.new文件,然後indexer會向searchd發送sighup命令。

    Searchd可以採取多種模式,主要是針對每個查詢可以採取串行模式(每次只有一個查詢,新的查詢在隊列裏排着)、PRE_FORK模式(預分配一定的槽位等查詢來)、MPM_THREADS模式(也就是對每一個查詢都新起一個線程應對)。Rotate的具體操作是由g_tRotateThread線程調用RotationThreadFunc函數進行定時檢查的,具體的各個線程配合方式可見下圖: