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 mainsource{<br /> type = mysql<br /> sqlquerypre = SET NAMES utf8<br /> sqlhost = 127.0.0.1<br /> sqluser =<br /> sqlpass =<br /> sqldb =<br /> sqlport = 3306<br /> sqlquerypre = REPLACE INTO sphinxupdate(updateid,datetime) VALUE(1,now())<br /> sqlquery = SELECT id,stb,stb from main<br /> }</p> <p>source delta : mainsource{<br /> sqlquerypre = SET NAMES utf8<br /> sqlquery = SELECT id,stb,stb FROM main WHERE lastupdated > ( SELECT datetime FROM sphinxupdate limit 1 )<br /> sqlquerykilllist = SELECT id FROM sphinxdeleted WHERE lastupdated > ( SELECT DATESUB(NOW(), INTERVAL 180 MINUTE) FROM sphinxupdate limit 1)<br /> sqlquerypost = REPLACE INTO sphinxupdate(updateid,datetime) VALUE(1,now())</p> <p>}</p> <p>index mainindex{<br /> source = mainsource<br /> path = /var/lib/sphinxsearch/data/mainindex<br /> docinfo = extern<br /> charsettype = utf-8<br /> charsettable = 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 /> enablestar = 1<br /> minstemminglen = 1<br /> indexexactwords = 1<br /> mininfixlen = 1<br /> }</p> <p>index delta : mainindex{<br /> source = delta<br /> path = /var/lib/sphinxsearch/data/mainindexdelta<br /> docinfo = extern<br /> charsettype = utf-8<br /> charsettable = 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 /> enablestar = 1<br /> minstemminglen = 1<br /> indexexactwords = 1<br /> mininfixlen = 1<br /> }</p> <p>indexer{<br /> memlimit = 512M<br /> }</p> <p>searchd{<br /> listen = 9312<br /> maxmatches = 2000<br /> log = /var/log/sphinxsearch/searchd.log<br /> pidfile = /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.

2013.12.24.

delta index sphinx

Szólj hozzá