A Sphinx egy full-text keresőmotor, bővebb leírás itt található róla: http://weblabor.hu/cikkek/sphinx-keresomotor-bevezetes

Ami problémát okozhat, hogy nagy mennyiségű adat feldolgozásakor a szerver erőforrásait rendesen lefoglalja az indexelés, viszont szükséges lehet, mert sűrűn változnak az adatok.

Ennek kiküszöbölésére van a delta index, ami annyit tesz, hogy csak azokat az adatokat olvassa be, amik a legutóbbi indexelés óta változtak és ezt kell összefésülni a nagy halmazzal.

Először is 2 táblára van szükség. A név szabadon módosítható, de most az egyik tábla neve legyen sphinx_update. Ez rögzíti, hogy mikor volt utoljára indexelve a rendszer.

A táblában az alábbi mezők kellenek:

  • update_id: elsődleges kulcs int
  • datetime: a legutolsó frissítés dátum-ideje

A másik tábla pedig sphinx_deleted, ami a törölt rekordokat rögzíti.

  • id: az indexelt tábla elsődleges kulcsa, amit töröltünk
  • last_updated: a törlés időpontja

Az indexelt táblába kell egy időbélyegző, ami rögzíti az utolsó módosítás idejét, pl.: last_updated. (ez nem azonos a törlő táblában lévővel)

Az alábbi config definiál egy nagy indexelést és egy hozzá tartozó delta indexet:

source main_source{<br /> type = mysql<br /> sql_query_pre = SET NAMES utf8<br /> sql_host = 127.0.0.1<br /> sql_user =<br /> sql_pass =<br /> sql_db =<br /> sql_port = 3306<br /> sql_query_pre = REPLACE INTO sphinx_update(update_id,datetime) VALUE(1,now())<br /> sql_query = SELECT id,stb,stb from main<br /> }</p> <p>source delta : main_source{<br /> sql_query_pre = SET NAMES utf8<br /> sql_query = SELECT id,stb,stb FROM main WHERE last_updated > ( SELECT datetime FROM sphinx_update limit 1 )<br /> sql_query_killlist = SELECT id FROM sphinx_deleted WHERE last_updated > ( SELECT DATE_SUB(NOW(), INTERVAL 180 MINUTE) FROM sphinx_update limit 1)<br /> sql_query_post = REPLACE INTO sphinx_update(update_id,datetime) VALUE(1,now())</p> <p>}</p> <p>index main_index{<br /> source = main_source<br /> path = /var/lib/sphinxsearch/data/main_index<br /> docinfo = extern<br /> charset_type = utf-8<br /> charset_table = 0..9, A..Z->a..z, a..z, -, U+00C1->U+00E1, U+00C9->U+00E9, U+00CD->U+00ED,U+00D3->U+00F3, U+00D6->U+00F6, U+0150->U+0151,U+00DA->U+00FA, U+00DC->U+00FC, U+0170->U+0171, U+00E1, U+00E9, U+00ED, U+00F3, U+00F6, U+0151,U+00FA, U+00FC, U+0171<br /> enable_star = 1<br /> min_stemming_len = 1<br /> index_exact_words = 1<br /> min_infix_len = 1<br /> }</p> <p>index delta : main_index{<br /> source = delta<br /> path = /var/lib/sphinxsearch/data/main_index_delta<br /> docinfo = extern<br /> charset_type = utf-8<br /> charset_table = 0..9, A..Z->a..z, a..z, -, U+00C1->U+00E1, U+00C9->U+00E9, U+00CD->U+00ED,U+00D3->U+00F3, U+00D6->U+00F6, U+0150->U+0151,U+00DA->U+00FA, U+00DC->U+00FC, U+0170->U+0171, U+00E1, U+00E9, U+00ED, U+00F3, U+00F6, U+0151,U+00FA, U+00FC, U+0171<br /> enable_star = 1<br /> min_stemming_len = 1<br /> index_exact_words = 1<br /> min_infix_len = 1<br /> }</p> <p>indexer{<br /> mem_limit = 512M<br /> }</p> <p>searchd{<br /> listen = 9312<br /> max_matches = 2000<br /> log = /var/log/sphinxsearch/searchd.log<br /> pid_file = /var/run/sphinxsearch/searchd.pid<br /> }<br />

Első futásnál az alábbi parancsot kell kiadni:

indexer –rotate –all

Cron-ban pedig az alábbi parancsokat kell futtatni:

indexer –rotate delta<br /> indexer –merge main_index delta –rotate

A configban az sql_query_killlist lekérdezést a cron időzítéséhez kell állítani, mivel az sql_query_post-ban definiált utolsó frissítés hamarabb fut le, mint a killist lekérés. Jelenleg 3 órás futáshoz van beállítva a törlés.