sphinx的配置項有一項是:
sql_query_killlist
問題
假設我們有一個主索引main和一個增量索引delta,在主索引建立好後,每隔幾分鐘就重新建立增量索引(當然增量索引詩基於上一次的main索引建立的節點)。
我們假設在建立main索引的時候以上的文件(2,3,5,7, 11)中都包含”test”,在過了一段時間後,增量索引中有一些文件,2,3,5文件被刪除了, 7, 11文件被修改了,但11中已經不包含”test” 了。在這種情況下,我們在main中索引”test”的時候,會得到2,3,5,7,11, 在delta中索引”test”只能得到7了,而如果同時請求兩個索引:
$sphinx->Query(“test”, “main delta”);
這種情況下,我們的結果中應該不會出現2,3,5,11文件結果集,因為2,3,5文件已經被刪除,11文件中也沒有test
了。但實際上,結果中會包含11這個文件。
解析
這個文件是從main中得到的。即 假如主索引和增量索引同時包含兩個相同id的文件,但內容不一致,如果增量索引中找不到結果,sphinx就會嘗試從主索引獲取結果。
在這裡,我們可以使用 sql_query_killlist來阻止這種問題.
sql_query_killlist會建立一個文件id列表,與某個索引項繫結在一起,用於隱藏從另一個索引中出現的結果,比如上面的2,3,5 和11,這個配置的實際意義也就在於處理已有的索引的刪除和更新問題。
另外說明一下, 這個選項會依賴於請求中使用索引的順序(比如delta在main之後是上面的結果,而delta如果在main之前就會有問題)。(後面的索引項(delta)的killlist會隱藏與之衝突的前面的索引(main)的文件)
解決
sql_query_killlist =
SELECT id FROM documents WHERE updated_ts>=@last_reindex UNION
SELECT id FROM documents_deleted WHERE deleted_ts>=@last_reindex
把這個寫在delta的索引source下,就可以解決上面出現的問題了,即隱藏了在main中衝突的文件