天天看點

sphinx實時索引

原文位址:sphinx實時索

一.sphinx實時索引介紹

sphinx實時索引在版本1.10-bita被引入的。

實時像其他所有的索引類型,需要在sphinx.conf檔案中聲明。不需要并忽略資料來源,需要明确地列舉所有文本域,不隻是屬性。

實時索引内部組織

實時索引内部是分塊組織的,它使用記憶體塊存儲最新的更新。記憶體塊的大小使用rt-mem-limit參數指定。一旦記憶體塊中資料增長超過了這個指數的限定,一個新的硬碟塊将被創造出來存儲目前記憶體塊中的資料,而記憶體塊将被重置。是以,對于實時索引大多數的更新會隻發生在記憶體塊中并會在幾毫秒内立即完成,而在建立硬碟塊的幾秒鐘當中産生的溢出記憶體塊的更新将被拖延,直到硬碟塊建立完成,記憶體中現有的資料被複制到硬碟塊中并将記憶體塊清空。

硬碟塊實際上就相當于正常的基于硬碟的索引。但是它們隻是實時索引的一部分,由實時索引自動管理,是以你不需要手動配置和管理它們。因為每當實時索引記憶體塊資料超出限制,新的硬碟塊會被建立,并且記憶體塊的格式近似于硬碟塊的格式,是以每次建立的硬碟塊的大小與rt_mem_limit規定的記憶體塊大小接近。

一般來說,rt_mem_limit設定的數值越大越好,能夠将重新整理頻率和索引殘片(硬碟塊的數量)減到最小。例如一個處理大型實時索引的專用搜尋伺服器,建議将rt_mem_limit設為1-3G。目前計劃設定一個對于所有索引的全局限制參數,但是在1.10beta版本中尚未實作。

硬碟塊上的全文檢索資料不能被修改,是以在全文字段的修改(如整行删除或更新)使用了一個kill-list表單從硬碟塊上廢止了老的行,但并非實體的清除了這些資料。是以大量的全文字段更新會導緻索引被這些老的行污染,搜尋表現下降。實體清除資料能夠改善表現,但是在1.10beta版本中尚未實作。

記憶體塊中的資料在平滑關閉程序時會存入硬碟,并在啟動時載入記憶體。但是當程序或伺服器崩潰,記憶體塊中的更新可能會丢失。為防止丢失,可以使用事務二進制日志。

實時索引中的全文更改是事務性的。他們存儲在一個預線程存儲器中,直到commit再一起實施。一個單一commit包含的批處理越多,索引速度越快。

二進制日志

二進制日志是一個必要的恢複機制。啟用二進制日志,searchd會将每個事務寫入二進制日志中,并且在非正常關機後從二進制日志中恢複。在正常關機時,記憶體塊中的資料将被存入硬碟,然後所有的二進制日志會被斷開。

正常操作中,每當目前的二進制日志檔案達到binlog_max_log_size(預設為128M)的限制,一個新的二進制日志檔案會被建立并打開。老的二進制檔案會儲存直到所有儲存在其中的事務被存入硬碟塊中。将binlog_max_log_size設定為0将會保持二進制檔案在searchd運作時始終被打開,但是正常關機後它仍然會被斷開關閉。

存在三種不同的二進制重新整理政策。使用binlog_flush 0,1或2指令控制。0意味着每秒鐘重新整理日志到作業系統并同步到磁盤,1意味着每事務重新整理并同步,2(預設模式)意味着每事務進行重新整理,但每秒進行同步。同步相對較慢因為它需要進行實體硬碟讀寫,是以模式1是最安全但是也是最慢的(每個送出的事務都保證會寫入磁盤)。重新整理日志到作業系統會在searchd程序崩潰時防止資料丢失,但系統崩潰時無法防止。模式2是預設模式。

從一次非正常關機後恢複,二進制日志被回放,從最後一個完好的事務之後的所記錄的事務都會被恢複。事務會被核對總和,是以一些無用資料不會被恢複。一旦損壞的事務被檢查到,會停止回放。事務會有一個自動記号和時間戳,假如二進制檔案中部損壞,技術上來說是可以跳過損壞的事務并從下一條完好的事務繼續回放,同時也可以持續回放事務直到一個給定的時間戳(時間點恢複)。但是在1.10beta版本中這些都尚未實作。

二.sphinx實時索引安裝

$ sudo apt-get install subversion 

$ svn checkout http://sphinxsearch.googlecode.com/svn/trunk sphinx-bita    

$ sudo ./configure --prefix=/usr/local/sphinx-bita

$ sudo make

$ sudo make install

三.sphinx實時索引配置

$ sudo cp sphinx.conf.dist sphinx.conf

$ sudo vim sphinx.conf

index bbs_post   //索引名稱bbs_post

{

        type                    = rt  //索引類型

        path                    = /usr/local/sphinx-bita/var/data/bbs_post  

        docinfo                 = extern

        mlock                   = 0

        morphology              = none

        min_word_len            = 1

        html_strip              = 0

        rt_field                = author    //全文索引字段

        rt_field                = subject

        rt_field                = message

        rt_attr_uint            = fid   //屬性字段

        rt_attr_uint            = tid

        rt_attr_uint            = first

        rt_attr_uint            = invisible

        rt_attr_uint            = authorid

        rt_attr_timestamp       = dateline

        rt_mem_limit            = 512M  //實時索引記憶體

}

searchd

        listen                  = localhost:9306:mysql41  //mysql協定支援sphinxql。sphinx模拟mysql接口,不需要真正的mysql服務,mysql41表示支援mysql4.1-mysql5.1協定

        log                     = /usr/local/sphinx-bita/var/log/searchd.log

        query_log               = /usr/local/sphinx-bita/var/log/query.log

        read_timeout            = 5

        client_timeout          = 300

        max_children            = 30

        pid_file                = /usr/local/sphinx-bita/var/log/searchd.pid

        max_matches             = 1000

        seamless_rotate         = 1

        preopen_indexes         = 1

        unlink_old              = 1

        mva_updates_pool        = 1M

        max_packet_size         = 8M

         crash_log_path         = /usr/local/sphinx-bita/var/log/crash

        max_filters             = 256

        max_filter_values       = 4096

        max_batch_queries       = 32

         binlog_flush           = 2

         binlog_max_log_size    = 256M

         thread_stack                   = 128K

         query_log_format               = sphinxql

         compat_sphinxql_magics = 1

四.啟動

$ sudo /usr/local/sphinx-bita/bin/searchd --config /usr/local/sphinx-bita/etc/sphinx.conf

Sphinx 2.0.2-dev (r2895)

Copyright (c) 2001-2011, Andrew Aksyonoff

Copyright (c) 2008-2011, Sphinx Technologies Inc (http://sphinxsearch.com)

using config file '/usr/local/sphinx-bita/etc/sphinx.conf'...

listening on 127.0.0.1:9306

precaching index 'bbs_post'

precached 1 indexes in 0.001 sec

五.測試

$ mysql -h127.0.0.1 -P9306

mysql> desc bbs_post;

+-----------+-----------+

| Field     | Type      |

| id        | integer   |

| author    | field     |

| subject   | field     |

| message   | field     |

| fid       | uint      |

| tid       | uint      |

| first     | uint      |

| invisible | uint      |

| authorid  | uint      |

| dateline  | timestamp |

mysql> insert into bbs_post values (1,'mobei','sphinx Real-time indexes','test sphinx Real-time indexes',1,1,1,0,1,1311895260);

mysql> insert into bbs_post values (2,'mobei-2','sphinx ','sphinx',1,1,1,0,1,1311895600);

mysql> insert into bbs_post values (3,'mobei-3','Real-time indexes','SPHINX Real-time indexes',1,1,1,0,1,1311896260);

mysql> select * from bbs_post where match('mobei');

+------+--------+------+------+-------+-----------+----------+------------+

| id   | weight | fid  | tid  | first | invisible | authorid | dateline   |

|    1 |   1319 |    1 |    1 |     1 |         0 |        1 | 1311895260 |

|    2 |   1319 |    1 |    1 |     1 |         0 |        1 | 1311895600 |

|    3 |   1319 |    1 |    1 |     1 |         0 |        1 | 1311896260 |

3 rows in set (0.00 sec)

mysql> select * from bbs_post where match('beibei');

Empty set (0.00 sec)

mysql> select * from bbs_post where match('test'); 

|    1 |   1680 |    1 |    1 |     1 |         0 |        1 | 1311895260 |

1 row in set (0.00 sec)

mysql> delete from bbs_post where id=1;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from bbs_post where match('test');

mysql> select * from bbs_post;

|    2 |      1 |    1 |    1 |     1 |         0 |        1 | 1311895600 |

|    3 |      1 |    1 |    1 |     1 |         0 |        1 | 1311896260 |

2 rows in set (0.00 sec)