SQL Server - сопоставление подстрок с несколькими столбцами - PullRequest
2 голосов
/ 13 марта 2010

Один из моих клиентов подключен к сопоставлению подстрок с несколькими столбцами.

Я понимаю, что Содержит и FreeText поиск слов (и, по крайней мере, в случае Содержит, префиксы слов). Однако, исходя из моего понимания этой книги MSDN, ни эти, ни их варианты не способны искать подстроки.

Я использовал LIKE довольно широко (выберите * из A, где A.B Как '% substr%')

Пример таблицы A:

ID | Col1     | Col2     | Col3     |
-------------------------------------
1  | oklahoma | colorado | Utah     |
2  | arkansas | colorado | oklahoma |
3  | florida  | michigan | florida  |
-------------------------------------

Следующий код даст нам строку 1 и строку 2:

 select * from A where Col1 like '%klah%' or Col2 like '%klah%' or Col3 like '%klah%'

Это довольно уродливо, возможно, медленно, и мне просто не очень нравится. Возможно, потому что у реализаций, с которыми я имею дело, есть более 10 столбцов, которые нужно искать.

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

 select * from A where (Col1 + ' ' + Col2 + ' ' + Col3) like '%klah%'

Я думал о простом добавлении триггеров вставки, обновления и удаления, которые просто добавляют объединенную версию вышеприведенных столбцов в отдельную таблицу, которая затеняет эту таблицу.

Пример Shadow_Table:

ID | searchtext                 |
---------------------------------
1  | oklahoma colorado Utah     |
2  | arkansas colorado oklahoma |
3  | florida michigan florida   |
---------------------------------

Это позволит нам выполнить следующий запрос для поиска '% klah%'

select * from Shadow_Table where searchtext like '%klah%'

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

Мои интуитивные ощущения говорят мне, что в SQL Server 2008 есть встроенное решение. Однако я, похоже, не могу найти ничего, кроме исследовательских работ по этому вопросу.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 13 марта 2010

Из вашего описания звучит так, будто вы ищете способ улучшить точный поиск. LIKE - это правильный инструмент, который нужно использовать, когда вы пытаетесь найти строки символов, ТОЧНО совпадающие с вашей строкой. Если вы беспокоитесь о производительности, вам следует подумать об индексации или даже о пользовательском индексе, таком как вы описали.

Возможно, рассмотрим постоянный вычисляемый столбец вместо теневой таблицы. Затраты на вставки / обновления должны быть меньше, чем при использовании триггеров, и время запроса, вероятно, будет эквивалентным.

при полнотекстовом поиске

Полнотекстовый поиск выполнен как поиск на естественном языке.

Рассмотрим с точки зрения конечного пользователя. Если бы я искал «Оклахома», я бы, вероятно, начал с «Оклахома», «Ок» или «Оклахома». Я бы не стал искать "хома". Так думают наши человеческие умы. Отсюда и «естественный» язык поиска.

Поиск на естественном языке использует корневые основы и подобные слова для увеличения общего количества результатов. Однако это не оптимально, если вы хотите, чтобы все результаты точно соответствовали вашему поисковому запросу: например, Свободный текст будет сопоставлять «я поехал на урок» с «вождением и уроками», хотя ни одно из этих слов специально не появляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...