Sphinx delta index
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.