CONTAINSTABLE подстановочный знак не соответствует фразе соответствия? - PullRequest
2 голосов
/ 09 августа 2011

У меня есть поисковый запрос, который берет фразу, набранную пользователем, и должен вернуть результат, вот пример:

SELECT rank,[KEY] FROM CONTAINSTABLE(tblproduct, (title,subtitle,publisher_name),  @search_text,15)

Где @search_text

Set @search_text = '"my favourite word*"'

Фраза в том виде, в каком она есть, представляет собой точное совпадение названия книги в базе данных. Тем не менее, подстановочный знак (*) делает его таким, чтобы он не возвращал никаких результатов.

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

Почему это? Что я могу проверить?

В настоящее время, если для группового символа не создается набор результатов, я запускаю запрос без подстановочного знака, чтобы посмотреть, возвращает ли он что-нибудь. Если и это не помогает, я запускаю нормальное выражение «like».

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

Любая помощь приветствуется!

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Используя предложение JStead, я посмотрел на вывод вашей строки. Я также нашел это в MSDN:

Когда есть фраза, каждое слово, содержащееся в фразе считается отдельным префиксом. Таким образом, запрос с указанием Префиксный термин «local wine *» соответствует любым строкам с текстом «local wine» винодельня "," местные вина и обедали "и т. д.

Таким образом, слово My по умолчанию считается "шумовым словом". Добавление * заставляет парсер искать любые слова, начинающиеся с My. Однако при поиске по индексу слово My, похоже, уже было удалено (помните, это слово является шумом), поэтому оно не находит соответствия.

Я подумываю о том, чтобы пропустить строку поиска через функцию sys.dm_fts_parser, удалить слова-шумы, прежде чем добавить *.

1 голос
/ 09 августа 2011

Существует функция sys, которая точно сообщает вам, как Microsoft будет искать введенные вами термины. Она сообщит вам все слова, которые она будет искать.Используйте следующее

SELECT * FROM sys.dm_fts_parser (' "my favourite word*" ', 1033, 0, 0) 

Для получения дополнительной информации об этой функции http://msdn.microsoft.com/en-us/library/cc280463.aspx

Вместо использования * вы захотите обновить свой тезаурус, чтобы получить все возможные изгибы моего любимого слова.,

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