Sto sviluppando un'applicazione Android che deve eseguire la ricerca di sottostringa in una tabella di grandi dimensioni (circa 500'000 voci con nomi di strade e località, quindi solo poche parole per voce).SQLite: ricerca della sottostringa efficiente in una tabella di grandi dimensioni
CREATE TABLE Elements (elementID INTEGER, type INTEGER, name TEXT, data BLOB)
Si noti che solo il 20% di tutte le voci contiene stringhe nella colonna "nome".
Esecuzione seguente query richiede quasi 2 minuti:
SELECT elementID, name FROM Elements WHERE name LIKE %foo%
ora cercato di utilizzare FTS3 al fine di accelerare la query. Ciò ha avuto un discreto successo, il tempo di interrogazione è sceso a 1 minuto (sorprendentemente le dimensioni del file del database sono aumentate solo del 5%, che è anche abbastanza buono per il mio scopo).
Il problema è, FTS3 apparentemente non supporta la ricerca sottostringa, vale a dire se voglio trovare "bar" in "foo bar" e "foobar", ho solo "foo bar", anche se ho bisogno di entrambi i risultati.
Quindi, in realtà ho due domande:
è possibile accelerare ulteriormente la query? Il mio obiettivo è di 30 secondi per la query, ma non so se sia realistico ...
Come posso ottenere una ricerca di sottostringa reale utilizzando FTS3?
Ci vuole * un sacco * di triturazione per ottenere la ricerca indicizzata sotto parola ... –
Forse SQLite/FST non è l'approccio migliore in questo caso specifico .. sembra un [sola lettura] [Suffix Tree ] (http://en.wikipedia.org/wiki/Suffix_tree) potrebbe essere più adatto. Sebbene il trucco sia quello di trovarne uno in una libreria/tooling già esistente ;-) –
@pst, Suffix Trees sembra piuttosto interessante, ma sfortunatamente l'approccio SQLite è cruciale per le funzionalità principali della mia applicazione. Tuttavia, la ricerca rapida delle stringhe sarebbe stata "piacevole da avere". ;) – Aletheios