Я не знаю, какую базу данных вы используете, но знаю, что если это Oracle, вы должны иметь доступ к функциональности Oracle Text (или вы можете попросить своего администратора базы данных включить ее). С помощью дополнительных функций, таких как CONTAINS
и правильного использования индексов Oracle Text, вы можете достичь именно того, что вам нужно, даже ища слова с ошибками. Это достигается путем объединения CONTAINS
с функцией, которая вычисляет расстояние Левенштейна между двумя строками. В Oracle Text эта функция FUZZY
.
Прекрасный пример для вас в этой документации Oracle .
Я не знаю достаточно других типов баз данных, но я был почти уверен, что у крупных поставщиков есть что-то для поиска текста. Просто быстро погуглив, есть полнотекстовый поиск в:
В любом случае, гораздо быстрее использовать встроенные функции / процедуры СУБД, чем создавать свои собственные пользовательские функции или даже осуществлять поиск по вашему языку программирования (хотя тысячи ключевых слов не так уж и много)
Редактировать: После прочтения вашего вопроса снова и ответа Дина Хардинга я почувствовал, что не отвечаю на вопрос должным образом. Используя Oracle Text, вместо использования функции CONTAINS
вы можете использовать функцию MATCHES
(см. Пункт 4.1.3 ), которая делает именно это: запрашивает список ключевых слов, хранящихся в таблице, по некоторым текст и возвращая идентификаторы ключевых слов, которые были найдены. Ниже я скопирую пример, найденный в документации (с добавлением моих собственных комментариев):
create table queries (
query_id number,
query_string varchar2(80)
);
// Here we populate the table with the keywords
insert into queries values (1, 'oracle');
insert into queries values (2, 'larry or ellison');
insert into queries values (3, 'oracle and text');
insert into queries values (4, 'market share');
create index queryx on queries(query_string)
indextype is ctxsys.ctxrule;
// This query will return the ids of the matched keywords
select query_id from queries
where matches(query_string,
'Oracle announced that its market share in databases
increased over the last year.')>0
Я надеюсь, что это поможет немного больше, чем моя первая попытка.
Edit2: просто добавьте, что вы не выполняете полное сканирование таблицы этим методом, так как используете индекс домена.