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

голоса
33

Примечание: Я имею используя возможности поиска полнотекстовой SQL для , СОДЕРЖИТ положение и все - * является подстановочным в полном тексте,% только для статей LIKE.

Я читал в нескольких местах , в настоящее время , что «ведущие подстановочные» поиск (например , с помощью «* переполнение» , чтобы соответствовать «StackOverflow») не поддерживается в MS SQL. Я рассматриваю с помощью функции CLR , чтобы добавить регулярные выражения , но мне очень интересно посмотреть , что другие решения люди могли бы иметь.

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

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

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

Задан 06/08/2008 в 14:52
источник пользователем
На других языках...                            


14 ответов

голоса
19

Обходной путь только для ведущего шаблона:

  • хранить текст обращенный в другом поле (или материализованное представление)
  • создать полнотекстовый индекс по этому колонке
  • найти обращенный текст с *

    SELECT * 
    FROM TABLENAME 
    WHERE CONTAINS(TextColumnREV, '"mrethcraes*"');
    

Конечно, есть много недостатков, как раз для быстрого решения проблемы ...

Не говоря уже о CONTAINSTABLE ...

Ответил 24/09/2008 в 00:11
источник пользователем

голоса
15

Проблема с ведущими Wildcards: Они не могут быть проиндексированы, следовательно, вы делаете полный просмотр таблицы.

Ответил 06/08/2008 в 15:07
источник пользователем

голоса
4

Для того, чтобы , возможно , добавить ясность в эту тему, от моего тестирования на 2008 R2, Франьо правильно выше. При работе с полнотекстовым поиском, по крайней мере при использовании СОДЕРЖИТ фразы, вы не можете использовать ведущий , только завершающее функционально. * Является подстановочной, а не% в полном тексте.

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

Моя проблема, добавленная, однако, что тот же запрос, с завершающим *, который использует полный текст со специальными символами работал сравнительно быстро на 2005 (20 секундах), и замедляется до 12 минут после миграции БД с 2008 R2. Кажется, по крайней мере, один другой пользователь имел аналогичные результаты, и он начал форум пост, который я добавил к ... FREETEXT быстро работает до сих пор, но что-то «кажется», что изменилось с 2008 года, как процессы Продольный * в СОДЕРЖИТ. Они дают все виды предупреждений в 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

Ответил 06/10/2011 в 19:17
источник пользователем

голоса
4

Можно использовать подстановочные знаки «*» в конце слова или фразы (поиск префикс).

Например, этот запрос будет найти все «datab», «базу данных», «базы данных» ...

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"datab*"')

Но, unforutnately, это не представляется возможным поиск с ведущими подстановочные.

Например, этот запрос не будет найти «базу данных»

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"')
Ответил 26/11/2008 в 10:22
источник пользователем

голоса
4

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

Ответил 06/08/2008 в 15:03
источник пользователем

голоса
2

Символ подстановки в SQL Server является %знаком , и она работает просто отлично, что ведет, волоча или иным образом .

Тем не менее, если вы собираетесь делать какие - либо серьезного полнотекстового поиска , то я бы рассмотреть вопрос об использовании в полной мере возможности полнотекстового индекса. Использование %и _джокеры заставят вашу базу данных , чтобы сделать серьезный удар по производительности.

Ответил 06/08/2008 в 14:57
источник пользователем

голоса
1

В качестве параметра хранимой процедуры вы можете использовать его как:

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)
Ответил 04/01/2016 в 23:59
источник пользователем

голоса
1

Просто FYI, Google не делает никаких поисков подстроки или усечение, вправо или влево. Они имеют символ подстановки *, чтобы найти неизвестные слова в фразе, но не слово.

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

Ответил 16/09/2008 в 01:22
источник пользователем

голоса
1

С SQL Server Books Online:

Для записи полнотекстовых запросов в Microsoft SQL Server 2005, вы должны научиться использовать СОДЕРЖИТ и FREETEXT Transact-SQL предикаты, а CONTAINSTABLE и FREETEXTTABLE наборов строк-функции.

Это означает, что все запросы, написанные выше, с% и _ не являются действительными полнотекстовые запросы.

Вот пример того, что запрос выглядит как при вызове функции CONTAINSTABLE.

ВЫБОР RANK, * ОТ TableName, CONTAINSTABLE (TableName, * ' "* WildCard"') searchTable ГДЕ [КЛЮЧ] = TableName.pk ORDER BY searchTable.RANK по убыванию

Для того, чтобы 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]

Dave Ward - Использование группового символа с одной из функций не должен быть огромным перфорация хитом. Если я создал поисковую строку только с «*», он не будет возвращать все строки, в моем тестовом случае, он вернулся 0 записей.

Ответил 06/08/2008 в 16:08
источник пользователем

голоса
0

Если у вас есть доступ к списку слов полнотекстового поиска, вы могли бы сделать «как» поиск по этому списку и сопоставить базу данных со словами найти, например, за столом «слова» со следующими словами:

    pie
    applepie
    spies
    cherrypie
    dog
    cat

Для того, чтобы все слова, содержащие «пирог» в этой базе данных по FTS таблицы «full_text» с поля «текст»:

    to-match <- SELECT word FROM words WHERE word LIKE '%pie%'
    matcher = ""
    a = ""
    foreach(m, to-match) {
      matcher += a
      matcher += m
      a = " OR "
    }
    SELECT text FROM full_text WHERE text MATCH matcher
Ответил 02/07/2018 в 14:20
источник пользователем

голоса
0

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

Обратите внимание на проход , который гласит: «Тем не менее, если вы укажете„ цепь“или„Ch - Айн“, вы не получите ожидаемый результат Звездочки будет рассматриваться как обычный знак препинания не подстановочные символами..»

Ответил 18/10/2016 в 17:34
источник пользователем

голоса
0

Когда дело доходит до полнотекстового поиска, для моих денег ничто не сравнится Lucene . Существует порт .Net доступен , который совместим с индексами , созданных с версией Java.

Там немного работы, связанная с тем, что вы должны создать / сохранить индексы, но скорость поиска является фантастической, и вы можете создать все виды интересных запросов. Даже скорость индексации довольно хорошо - мы просто полностью восстановить наши индексы один раз в день и не беспокоиться об их обновлении.

В качестве примера, эта функция поиска питается от Lucene.Net.

Ответил 08/08/2008 в 16:34
источник пользователем

голоса
0

% Соответствует любому количеству символов _ Соответствует одному символу

Я никогда не использовал полнотекстового индексирования, но вы можете выполнить достаточно сложные и быстрые поисковые запросы с просто используя встроенный в строковых функций T-SQL.

Ответил 06/08/2008 в 15:00
источник пользователем

голоса
-1

Использование символа «%» Я искал нашу базу данных, используя что-то вроде следующего:

SELECT name FROM TblNames WHERE name LIKE '%overflow'

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

Ответил 06/08/2008 в 15:24
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more