Mysql
 sql >> база данни >  >> RDS >> Mysql

Какъв е най-добрият начин за реализиране на търсене на подниз в SQL?

Вижте моята презентация Практическо пълнотекстово търсене в MySQL .

Сравних:

Днес това, което бих използвал, е Apache Solr , което поставя Lucene в услуга с куп допълнителни функции и инструменти.

Относно вашия коментар:Аха, добре, не. Нито една от възможностите за пълнотекстово търсене, които споменах, няма да помогне, тъй като всички те предполагат някакви граници на думи

Другият начин за ефективно намиране на произволни поднизове е N-gram Приближаване. По принцип създайте индекс на всички възможни поредици от N букви и посочете низовете, където се появява всяка съответна последователност. Обикновено това се прави с N=3 или триграма , защото това е компромисна точка между съвпадението на по-дълги поднизове и запазването на индекса до управляем размер.

Не знам за SQL база данни, която поддържа прозрачно индексиране на N-gram, но бихте могли да я настроите сами с помощта на обърнат индекс :

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

Сега го попълнете по трудния начин:

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

Разбира се, това ще отнеме доста време! Но след като приключите, можете да търсите много по-бързо:

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

Разбира се, може да търсите модели, по-дълги от три знака, но обърнатият индекс все още помага да стесните търсенето си много:

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. Използвайки MySQL, как да избера ранг на резултата от заявката на един конкретен ред?

  2. Как да накарате вашето булево търсене в пълен текст да вземе термина C++?

  3. CONV() функция в снежинка

  4. Използване на индекса за търсене на Solr като база данни - това грешно ли е?

  5. Как мога правилно да използвам PDO обект за параметризирана SELECT заявка