Sprawdź moją prezentację Praktyczne wyszukiwanie pełnotekstowe w MySQL .
Porównałem:
LIKE
predykaty- Wyrażenie regularne
predykaty (nie lepsze niż
LIKE
) - MyISAM PEŁNY TEKST indeksowanie
- Wyszukiwarka Sphinx
- Apache Lucene
- Indeksowanie odwrócone
- Google Niestandardowa wyszukiwarka
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%';