Как вы получаете ведущие групповые полнотекстовые поиски для работы в SQL Server?
Примечание. Я использую возможности полнотекстового поиска SQL, предложения CONTAINS и все - * - это подстановочный знак в полнотекстовом выражении,% - только для предложений LIKE.
Я читал в нескольких местах, что "поиск подстановочных знаков" (например, использование "переполнения" для соответствия "stackoverflow" ) не поддерживается в MS SQL. Я рассматриваю возможность использования функция CLR, чтобы добавить соответствие regex, но мне любопытно посмотреть, какие другие решения люди возможно.
Дополнительная информация: Вы можете добавить звездочку только в конце слова или фразы. - вместе с моим эмпирическим опытом: при совпадении "myvalue", "my *" работает, но "(звездочка) значение" не возвращает совпадения при выполнении запроса так же просто, как:
SELECT * FROM TABLENAME WHERE CONTAINS(TextColumn, '"*searchterm"');
Таким образом, моя потребность в обходном пути. Я использую только поиск на своем сайте на реальной странице поиска, поэтому он должен работать в основном так же, как работает Google (в глазах пользователя типа Joe Sixpack). Не так сложно, но этот сорт действительно не должен терпеть неудачу.
Ответы
Ответ 1
Обходной путь только для командной строки:
- сохранить текст, измененный в другом поле (или в материализованном виде)
- создать полный текстовый индекс в этом столбце
-
найдите обратный текст с помощью *
SELECT *
FROM TABLENAME
WHERE CONTAINS(TextColumnREV, '"mrethcraes*"');
Конечно, есть много недостатков, просто для быстрого обхода...
Не говоря о CONTAINSTABLE...
Ответ 2
Проблема с ведущими подстановочными знаками: они не могут быть проиндексированы, поэтому вы выполняете полное сканирование таблицы.
Ответ 3
Чтобы добавить ясность в этот поток, из моего тестирования в 2008 R2, Franjo правильно выше. При работе с полнотекстовым поиском, по крайней мере при использовании фразы CONTAINS, вы не можете использовать ведущий, только трейлинг функционально. * является подстановочным знаком, а не% в полном тексте.
Некоторые предположили, что * игнорируется. Это, похоже, не так, мои результаты, похоже, показывают, что конечная * функциональность действительно работает. Я думаю, что ведущие * игнорируются движком.
Однако моя добавленная проблема заключается в том, что тот же запрос с конечным *, который использует полный текст с подстановочными знаками, работал относительно быстро в 2005 году (20 секунд) и замедлился до 12 минут после переноса db на 2008 R2. Кажется, что по крайней мере у одного другого пользователя были подобные результаты, и он начал сообщение в форуме, которое я добавил... FREETEXT работает быстро, но что-то "похоже" изменилось с тем, как процессы 2008 завершаются * в CONTAINS. Они дают всевозможные предупреждения в Upgrade Advisor о том, что они "улучшили" FULL TEXT, поэтому ваш код может сломаться, но, к сожалению, они не дают вам никаких конкретных предупреждений об определенном устаревшем коде и т.д.... просто отказ в том, что они изменили его, Используйте на свой риск.
http://social.msdn.microsoft.com/Forums/ar-SA/sqlsearch/thread/7e45b7e4-2061-4c89-af68-febd668f346c
Возможно, это самый близкий MS-удар, связанный с этими проблемами... http://msdn.microsoft.com/en-us/library/ms143709.aspx
Ответ 4
Одна вещь, о которой стоит помнить, заключается в том, что ведущие подстановочные запросы приходят со значительной премией за производительность, по сравнению с другими обычными привычками.
Ответ 5
Можно использовать подстановочный знак "*" в конце слова или фразы (префиксный поиск).
Например, этот запрос найдет все "базы данных", "базу данных", "базы данных"...
SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"datab*"')
Но, ненавязчиво, невозможно выполнить поиск с помощью командной строки.
Например, этот запрос не найдет "базу данных"
SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"')
Ответ 6
Символом подстановки в SQL Server является знак %
, и он работает просто отлично, ведет, завершает или иным образом.
Тем не менее, если вы собираетесь делать серьезный полный текстовый поиск, я бы подумал об использовании возможностей Full Text Index. Использование %
и _
wild cards приведет к серьезному поражению вашей базы данных.
Ответ 7
Из электронной документации по SQL Server:
Чтобы написать полнотекстовые запросы в Microsoft SQL Server 2005, вы должны узнать, как использовать КОНТЕЙНЕРЫ и Предикаты Transact-SQL FREETEXT и СОДЕРЖАЩИЕСЯ И СВОБОДНЫЕ функции с множеством значений.
Это означает, что все запросы, написанные выше с помощью% и _, являются недопустимыми полными текстовыми запросами.
Вот пример того, как выглядит запрос при вызове функции CONTAINSTABLE.
SELECT RANK, * FROM TableName, CONTAINSTABLE (TableName, *, ' "* WildCard" ') searchTable ГДЕ [KEY] = TableName.pk ORDER BY searchTable.RANK DESC
Чтобы функция CONTAINSTABLE узнала, что я использую поиск подстановочных знаков, я должен обернуть ее в двойные кавычки. Я могу использовать символ подстановки * в начале или в конце. Есть много других вещей, которые вы можете сделать, когда строите строку поиска для функции CONTAINSTABLE. Вы можете искать слово рядом с другим словом, искать флективные слова (диск = диски, управлять, управлять и управлять) и искать синоним другого слова (металл может иметь синонимы, такие как алюминий и сталь).
Я только что создал таблицу, поместил полный текстовый индекс в таблицу и выполнил пару тестовых поисков и не имел проблемы, поэтому поиск по шаблону работает по назначению.
[Обновление]
Я вижу, что вы обновили свой вопрос и знаете, что вам нужно использовать одну из функций.
Вы все равно можете искать с подстановочным знаком в начале, но если слово не является полным словом после шаблона, вам нужно добавить еще один подстановочный знак в конце.
Example: "*ildcar" will look for a single word as long as it ends with "ildcar".
Example: "*ildcar*" will look for a single word with "ildcar" in the middle, which means it will match "wildcard". [Just noticed that Markdown removed the wildcard characters from the beginning and ending of my quoted string here.]
[Обновить # 2]
Дейв Уорд - использование подстановочного знака с одной из функций не должно быть огромным перфомансом. Если я создал строку поиска только с "*", она не вернет все строки, в моем тестовом примере она вернет 0 записей.
Ответ 8
Просто FYI, Google не выполняет поиск подстроки или усечение, справа или слева. У них есть подстановочный знак *, чтобы найти неизвестные слова во фразе, но не слова.
Google, наряду с большинством полнотекстовых поисковых систем, создает инвертированный индекс, основанный на алфавитном порядке слов, со ссылками на их исходные документы. Двоичный поиск злобный, даже для огромных индексов. Но в этом случае действительно очень сложно сделать левое усечение, потому что оно теряет преимущество индекса.
Ответ 9
В качестве параметра в хранимой процедуре вы можете использовать его как:
ALTER procedure [dbo].[uspLkp_DrugProductSelectAllByName]
(
@PROPRIETARY_NAME varchar(10)
)
as
set nocount on
declare @PROPRIETARY_NAME2 varchar(10) = '"' + @PROPRIETARY_NAME + '*"'
select ldp.*, lkp.DRUG_PKG_ID
from Lkp_DrugProduct ldp
left outer join Lkp_DrugPackage lkp on ldp.DRUG_PROD_ID = lkp.DRUG_PROD_ID
where contains(ldp.PROPRIETARY_NAME, @PROPRIETARY_NAME2)
Ответ 10
% Соответствует любому количеству символов _ Соответствует одному символу
Я никогда не использовал полнотекстовую индексацию, но вы можете выполнить довольно сложные и быстрые поисковые запросы, просто используя строковые функции T-SQL.
Ответ 11
Когда дело доходит до полнотекстового поиска, за мои деньги ничего не бьет Lucene. Существует . Доступен доступный порт, который совместим с индексами, созданными с версией Java.
Там немного работы, связанной с тем, что вам нужно создавать/поддерживать индексы, но скорость поиска фантастическая, и вы можете создавать всевозможные интересные запросы. Даже скорость индексирования довольно хорошая - мы просто полностью перестраиваем наши индексы один раз в день и не беспокоимся об их обновлении.
В качестве примера эта функция поиска работает от Lucene.Net.
Ответ 12
Возможно, следующая ссылка предоставит окончательный ответ на это использование подстановочных знаков: Выполнение поиска подстановок FTS.
Обратите внимание на отрывок, в котором говорится: "Однако если вы укажете" Цепь "или" Цепь ", вы не получите ожидаемого результата. Звездочка будет считаться нормальным значком пунктуации, а не символом подстановки."
Ответ 13
Используя символ "%", я искал нашу базу данных, используя что-то вроде следующего:
SELECT name FROM TblNames WHERE name LIKE '%overflow'
Использование этой формы или запроса может быть медленным, но мы используем его только для случайного ручного поиска.