Подтвердить что ты не робот

Как вы получаете ведущие групповые полнотекстовые поиски для работы в SQL Server?

Примечание. Я использую возможности полнотекстового поиска SQL, предложения CONTAINS и все - * - это подстановочный знак в полнотекстовом выражении,% - только для предложений LIKE.

Я читал в нескольких местах, что "поиск подстановочных знаков" (например, использование "переполнения" для соответствия "stackoverflow" ) не поддерживается в MS SQL. Я рассматриваю возможность использования функция CLR, чтобы добавить соответствие regex, но мне любопытно посмотреть, какие другие решения люди возможно.

Дополнительная информация: Вы можете добавить звездочку только в конце слова или фразы. - вместе с моим эмпирическим опытом: при совпадении "myvalue", "my *" работает, но "(звездочка) значение" не возвращает совпадения при выполнении запроса так же просто, как:

SELECT * FROM TABLENAME WHERE CONTAINS(TextColumn, '"*searchterm"');

Таким образом, моя потребность в обходном пути. Я использую только поиск на своем сайте на реальной странице поиска, поэтому он должен работать в основном так же, как работает Google (в глазах пользователя типа Joe Sixpack). Не так сложно, но этот сорт действительно не должен терпеть неудачу.

4b9b3361

Ответ 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'

Использование этой формы или запроса может быть медленным, но мы используем его только для случайного ручного поиска.