Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jaki jest najlepszy sposób na zaimplementowanie wyszukiwania podciągów w SQL?

Sprawdź moją prezentację Praktyczne wyszukiwanie pełnotekstowe w MySQL .

Porównałem:

Dzisiaj użyłbym Apache Solr , który wprowadza Lucene do usługi z wieloma dodatkowymi funkcjami i narzędziami.

Odpowiedz na swój komentarz:Aha, dobrze, nie. Żadna z funkcji wyszukiwania pełnotekstowego, o których wspomniałem, nie pomoże, ponieważ wszystkie zakładają pewne granice słów

Innym sposobem skutecznego znajdowania dowolnych podciągów jest N-gram zbliżać się. Zasadniczo utwórz indeks wszystkich możliwych sekwencji N liter i wskaż ciągi, w których występuje każda odpowiednia sekwencja. Zwykle odbywa się to z N=3 lub trygramem , ponieważ jest to punkt kompromisu między dopasowywaniem dłuższych podciągów i utrzymywaniem indeksu w rozsądnym rozmiarze.

Nie znam żadnej bazy danych SQL, która obsługuje przezroczyste indeksowanie N-gramów, ale możesz ustawić ją samodzielnie, używając indeksu odwróconego :

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)
);

Teraz wypełnij to w trudny sposób:

insert into trigram_matches
  select t.trigram, d.document_id
  from trigrams t join mytable d
    on d.textcolumn like concat('%', t.trigram, '%');

Oczywiście zajmie to trochę czasu! Ale kiedy już to zrobisz, możesz wyszukiwać znacznie szybciej:

select d.*
from mytable d join trigram_matches t
  on t.document_id = d.document_id
where t.trigram = 'abc'

Oczywiście możesz szukać wzorców dłuższych niż trzy znaki, ale odwrócony indeks nadal bardzo pomaga zawęzić wyszukiwanie:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wprowadzanie zmian w wielu rekordach na podstawie zmiany pojedynczego rekordu za pomocą SQL

  2. MySQL przy aktualizacji zduplikowanych kluczy

  3. Jak podłączyć zdalną bazę danych MySQL w PHP

  4. Wdróż MySQL Server + DB z aplikacją .Net

  5. Jak uzyskać listę widoków MySQL?