SQL Server ищет миллионы строк в таблице

Можно ли без использования полнотекстовой индексации искать в огромной таблице по ключевым словам?

Я хочу выполнить поиск по запросу Country man working, и он вернет следующие результаты:

  1. Сельский человек начал работать
  2. Страна на грани провала
  3. Человек начал свою работу

person Dashy Khan    schedule 18.04.2012    source источник
comment
Почему нельзя использовать полнотекстовую индексацию? Без него использование оператора LIKE или CHARINDEX будет ужасно медленным для такой большой таблицы.   -  person Luke Merrett    schedule 18.04.2012


Ответы (2)


Создайте таблицу, в которой будут содержаться все слова в словаре, за вычетом шумных слов.

Создайте таблицу, чтобы связать таблицу ключевых слов словаря с таблицей данных

Напишите код для создания записей в таблице ссылок, где слова из словаря появляются в текстовом столбце таблицы, в которой нужно выполнить поиск.

Тогда вы можете искать примерно так:

SELECT T.TextStuff
FROM KeywordTable AS K
JOIN LinkTable AS L ON L.KeywordID = K.KeywordID
JOIN TableToSearch AS T ON T.KeyWordID = L.KeywordID
WHERE K.Keyword = 'Country'
OR K.Keyword = 'man'
OR K.Keyword = 'working'

Это всего лишь псевдокод, но, надеюсь, он продемонстрирует идею. На настройку уходит много времени, но она должна быть более эффективной, чем выполнение нескольких LIKE.

Подводя итог, вы хотите посмотреть в таблице, где у вас есть одно слово в строке, те, которые соответствуют вам, вы хотите найти в таблице ссылок, и оттуда вы можете перейти к записи в исходной таблице.

person Treborbob    schedule 18.04.2012

Это должно вернуть требуемые результаты:

SELECT *
FROM TABLE
WHERE Field LIKE '%country%'
OR Field LIKE '%man%'
OR Field LIKE '%working%'

Но никаких гарантий по скорости ...


Примечания из комментариев - это действительно не способ сделать это. Полнотекстовая индексация - это подход к использованию, но вы не объяснили, почему это не вариант.

person Paddy    schedule 18.04.2012
comment
Поиск не так уж прост, этот запрос игнорирует все индексы. Нам нужна лучшая производительность. - person Dashy Khan; 18.04.2012
comment
Вы просили сделать это без полнотекстового указателя. Итак, вот оно. Другой способ - создать полнотекстовый индекс, что было бы намного лучше. - person Paddy; 18.04.2012
comment
Но с LIKE '%man%' поисковым выражением вы в основном выполняете полное сканирование таблицы, что будет возмутительно медленным для таблицы с миллионами строк, поскольку никакие индексы не могут использоваться когда-либо .... - person marc_s; 18.04.2012
comment
@marc_s - посмотрите мой предыдущий комментарий. Это ответ на поставленный вопрос, но я бы не рекомендовал это делать. - person Paddy; 18.04.2012
comment
Я понимаю, Пэдди. Я просто хотел добавить, что этот подход будет оооочень медленным с миллионами строк, что в конечном итоге почти бесполезно. Использование полнотекстовой индексации было бы единственным жизнеспособным и действительно, возможно, полезным подходом. - person marc_s; 18.04.2012