sql >> Database teknologi >  >> RDS >> Mysql

Hvad er den bedste måde at implementere en understrengsøgning i SQL?

Se min præsentation Praktisk fuldtekstsøgning i MySQL .

Jeg sammenlignede:

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%';


  1. Inkrementelle statistikker bruges IKKE af Query Optimizer

  2. Sådan opretter du Snapshot-replikering

  3. Sådan opretter du en serverløs GraphQL API til MySQL, Postgres og Aurora

  4. Hvordan indsætter man billeder i blob i mysql-tabel kun ved hjælp af sql-syntaks (uden PHP)?