sql >> Databasteknik >  >> RDS >> Mysql

Vad är det bästa sättet att implementera en delsträngsökning i SQL?

Kolla in min presentation Praktisk fulltextsökning i MySQL .

Jag jämförde:

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


  1. Har Oracle en motsvarighet till SQL Servers tabellvariabler?

  2. SQLite fällor och fallgropar

  3. Hitta sista raden i grupp efter query-SQL Server

  4. MySQL:ERROR 1022 (23000):Kan inte skriva; dubblettnyckel i tabellen '#sql-2b8_2'