Kolla in min presentation Praktisk fulltextsökning i MySQL .
Jag jämförde:
LIKE
predikat- Reguljärt uttryck
predikat (inte bättre än
LIKE
) - MyISAM FULLTEXT indexering
- Sphinx Search
- Apache Lucene
- Inverterad indexering
- Google Anpassad sökmotor
Idag skulle jag använda Apache Solr , vilket sätter Lucene i en tjänst med en massa extra funktioner och verktyg.
Angående din kommentar:Aha, okej, nej. Ingen av de fulltextsökningsmöjligheter jag nämnde kommer att hjälpa, eftersom de alla antar någon form av ordgränser
Det andra sättet att effektivt hitta godtyckliga delsträngar är N-gram närma sig. Skapa i princip ett index över alla möjliga sekvenser av N bokstäver och peka på strängarna där respektive sekvens förekommer. Vanligtvis görs detta med N=3, eller ett trigram , eftersom det är en kompromisspunkt mellan att matcha längre delsträngar och att hålla indexet i en hanterbar storlek.
Jag känner inte till någon SQL-databas som har stöd för N-gram-indexering på ett transparent sätt, men du kan ställa in den själv med ett inverterat index :
create table trigrams (
trigram char(3) primary key
);
create table trigram_matches (
trigram char(3),
document_id int,
primary key (trigram, document_id),
foreign key (trigram) references trigrams(trigram),
foreign key (document_id) references mytable(document_id)
);
Fyll det nu på den hårda vägen:
insert into trigram_matches
select t.trigram, d.document_id
from trigrams t join mytable d
on d.textcolumn like concat('%', t.trigram, '%');
Självklart kommer detta att ta ett tag! Men när det är klart kan du söka mycket snabbare:
select d.*
from mytable d join trigram_matches t
on t.document_id = d.document_id
where t.trigram = 'abc'
Naturligtvis kan du söka efter mönster som är längre än tre tecken, men det inverterade indexet hjälper fortfarande till att begränsa din sökning mycket:
select d.*
from mytable d join trigram_matches t
on t.document_id = d.document_id
where t.trigram = 'abc'
and d.textcolumn like '%abcdef%';