Se min præsentation Praktisk fuldtekstsøgning i MySQL .
Jeg sammenlignede:
LIKE
prædikater- Regulært udtryk
prædikater (ikke bedre end
LIKE
) - MyISAM FULDTEXT indeksering
- Sphinx Search
- Apache Lucene
- Inverteret indeksering
- Google Tilpasset søgemaskine
I dag ville jeg bruge Apache Solr , som sætter Lucene ind i en tjeneste med en masse ekstra funktioner og værktøjer.
Til din kommentar:Aha, okay, nej. Ingen af de fuldtekstsøgningsmuligheder, jeg nævnte, vil hjælpe, da de alle antager en slags ordgrænser
Den anden måde til effektivt at finde vilkårlige understrenge er N-gram nærme sig. Grundlæggende skal du oprette et indeks over alle mulige sekvenser af N bogstaver og pege på de strenge, hvor hver respektive sekvens forekommer. Dette gøres typisk med N=3 eller et trigram , fordi det er et kompromis mellem at matche længere understrenge og holde indekset i en håndterbar størrelse.
Jeg kender ikke nogen SQL-database, der understøtter N-gram indeksering gennemsigtigt, men du kan selv konfigurere den ved hjælp af et inverteret indeks :
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)
);
Udfyld det nu på den hårde måde:
insert into trigram_matches
select t.trigram, d.document_id
from trigrams t join mytable d
on d.textcolumn like concat('%', t.trigram, '%');
Det vil selvfølgelig tage lang tid! Men når det er gjort, kan du søge meget hurtigere:
select d.*
from mytable d join trigram_matches t
on t.document_id = d.document_id
where t.trigram = 'abc'
Selvfølgelig kan du søge efter mønstre længere end tre tegn, men det omvendte indeks hjælper stadig med at indsnævre din søgning meget:
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%';