EgyProgramozo

PHP/NodeJS programozó, Linux Desktop/Server fan

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{ type = mysql sql_query_pre = SET NAMES utf8 sql_host = 127.0.0.1 sql_user = sql_pass = sql_db = sql_port = 3306 sql_query_pre = REPLACE INTO sphinx_update(update_id,datetime) VALUE(1,now()) sql_query = SELECT id,stb,stb from main } source delta : main_source{ sql_query_pre = SET NAMES utf8 sql_query = SELECT id,stb,stb FROM main WHERE last_updated > ( SELECT datetime FROM sphinx_update limit 1 ) sql_query_killlist = SELECT id FROM sphinx_deleted WHERE last_updated > ( SELECT DATE_SUB(NOW(), INTERVAL 180 MINUTE) FROM sphinx_update limit 1) sql_query_post = REPLACE INTO sphinx_update(update_id,datetime) VALUE(1,now()) } index main_index{ source = main_source path = /var/lib/sphinxsearch/data/main_index docinfo = extern charset_type = utf-8 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 enable_star = 1 min_stemming_len = 1 index_exact_words = 1 min_infix_len = 1 } index delta : main_index{ source = delta path = /var/lib/sphinxsearch/data/main_index_delta docinfo = extern charset_type = utf-8 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 enable_star = 1 min_stemming_len = 1 index_exact_words = 1 min_infix_len = 1 } indexer{ mem_limit = 512M } searchd{ listen = 9312 max_matches = 2000 log = /var/log/sphinxsearch/searchd.log pid_file = /var/run/sphinxsearch/searchd.pid } 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 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.
2013.12.24.