Вижте моята презентация Практическо пълнотекстово търсене в MySQL .
Сравних:
LIKE
предикати- Регулярен израз
предикати (не по-добро от
LIKE
) - MyISAM ПЪЛЕН ТЕКСТ индексиране
- Sphinx Search
- Apache Lucene
- Обърнато индексиране
- Google Персонализирана търсачка
Днес това, което бих използвал, е 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%';