Etikettarkiv: sphinx search

Fritextsökningar i stora datamängder

Jag stötte på ett problem för några veckor sedan då jag försökte att indexera ~100 miljoner dokument (eller snarare textsträngar) för att göra dessa sökbara med godtycklig fritext (exempelvis: *blahonga*). Sphinx som brukar lösa alla mina problem spottade ur sig ett felmeddelande något i stil med:

(out of size_t; 4 GB limit on 32-bit machine hit?)

Vilket låter troligt eftersom det är en 32-bitars maskin. Efter lite sökningar så hittade jag att någon beskrev att Sphinx måste ladda in de filer som har filändelsen .SPI i RAM-minne och i mitt fall så rörde det sig om ca 35 GB vilket jag ej har i RAM-minne på någon av mina servrar.

Men efter lite mer Googlande så hittade jag den relativt nya konfigurationsparametern ondisk_dict som betyder att dessa filer inte behöver laddas in i minnet så jag testade att starta searchd igen men fick samma felmeddelande.

Till sist så testade jag även att dela upp den databas från MySQL som jag indexerade i tre olika Sphinx-index och då fungerade det galant och fritextsökningar i mina 100 miljoner dokument går nu på under en sekund. Taaada!

Så här beskrivs ondisk_dict i manualen:

Whether to keep the dictionary file (.spi) for this index on disk, or precache it in RAM. Optional, default is 0 (precache in RAM). Introduced in version 0.9.9-rc1.

The dictionary (.spi) can be either kept on RAM or on disk. The default is to fully cache it in RAM. That improves performance, but might cause too much RAM pressure, especially if prefixes or infixes were used. Enabling ondisk_dict results in 1 additional disk IO per keyword per query, but reduces memory footprint.

This directive does not affect indexer in any way, it only affects searchd.