Autor Zpráva
RASik
Profil *
Ahoj,
spíše taková teoretická otázka, lze-li, případně jakým postupem :
řekněme, že mám v MySQL - tedy v binárně - vloženy obyčejné textové soubory (txt, csv)
Jak vyhledávat řetězce uvnitř jejich obsahu (aniž bych je nějak otevíral)?
Děkuji.


Pardon,

jsem blbej, samozřejmě to jde bežným SQL dotazem např. SELECT nazev_souboru FROM motosoubory WHERE data LIKE '%motor%',
jen jsem měl překlep ve skriptu a domníval se, že nemám výsledek...
juriad
Profil
Řetězce pomocí operátoru LIKE, ale bude to ukrutně pomalé; pak existuje REGEX, který je ještě pomalejší.
Slova můžeš vyhledávat pomocí FULLTEXTového indexu, to bude rychlejší, ale neumí to obecné řetězce.
Pokud se jedná o řetězce speciálních tvarů, šlo by i něco rychlejšího. CSV by šlo v obyčejné DB rozpadnout do tabulky; pokud bys věděl, ve kterém sloupci chceš hledat, můžeš dost ušetřit.


Pokud se přesunu z obyčejné MySQL pryč:
Můžeš si doprogramovat do databázového enginu vlastní typ indexu, který bude nějak fungovat na tvé data.
Na CSV by šlo indexovat pozice čárek a tedy pak efektivně při hledání poskakovat, za předpokladu, že hledáš od začátku hodnoty. Podobné indexy se používají na JSON a XML.

Co vlastně potřebuješ vyhledávat? Pokud jde skutečně o obecný řetězec, je v současné době v praxi asi nejvýhodnější (poměr cena/výkon) HADOOP nakonfigurovaný na nějakém clusteru. Stačí-li ti slova, je dobrou volbou Solr (ať už na clusteru nebo lokálně, pokud je málo dat).

Teoreticky(!) bys mohl z celého obsahu databáze postavit suffixový strom, a pak bys vyhledával v čase O(délka hledaného výrazu). Existují už i nějaké cache-oblivious algoritmy, které by mohly fungovat i pro velikosti, které se nevejdou do paměti (nezapomeň na to, že suffixové stromy mají velký paměťový overhead, konstanta je u těch nejlepsích asi tak 16). Tady se bavíme třeba o vyhledávání části řetězce DNA ve velkém množství vzorků (třeba při identifikaci mrtvol nebo stop z místa činu, nebo studium podobnosti druhů).
RASik
Profil *
Ne, opravdu to byla jen teoretická záležitost, nad kterou jsem v tu chvíli "zamyslel" a hned snažil vyzkoušet. Na nic to (zatím?) nepotřebuju, jen se mi v hlavě honilo vyhledání textového řetězce v binárních datech a netušil, že se to dělá "samo".
Pokud bych to v mých podmínkách řešil, tak by šlo asi o to uživateli jen nabídnout, ve kterém souboru se řetězec nachází...zřejmě by ale nešlo o nějaké obrdatabáze
ALE zatím ani nehodlám používat DB jako úložiště souborů, i když s tím trochu koketuju nebo spíše si jen "hraju" s možnostmi aneb "nikdy neříkej nikdy" a MOC DĚKUJU za kvalifikované zamyšlení, třebas to nakopne i někoho jiného...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: