2015-05-09 5 views
4

У меня есть таблица под названием hotel со следующей информацией:SQL Server CONTAINSTABLE не возвращает результат с термином "двор"

  • Hotel_Id: 2950
  • Hotel_Name: Inn на Park
  • Hotel_Number:
  • Hotel_TypeId: 1

Мне нужно иметь возможность искать записи, в которых столбец имен содержит определенные термины.

Поиск является:

select * 
from ContainsTable(hotel, Hotel_Name, '"Inn on Park"') 

я не получаю никаких результатов, но если я ищу:

select * 
from ContainsTable(hotel, Hotel_Name, '"In on Park"') 

я

Key: 2950 
Rank: 176 

Я полагал, что был какой-то вопрос с термином " inn "Но если я искал:

select * 
from ContainsTable(hotel, Hotel_Name, '"Inn"') 

Я возвращаю тот же ключ: 2950, ​​Рейтинг: 176 результат.

Является ли "inn" ключевым словом, вызывающим эту проблему?

+0

Это ошибка в Live DB с множеством строк, но я создал таблицу tmp и имею только одну строку в ней, которая является «Inn on the Park». – GPW

+0

Что возвращает следующий запрос: 'select display_term from sys.dm_fts_parser ('" Inn on Park ", your_lcid, 0, 0)' (вы можете попробовать * your_lcid * как с 0, так и с вашим фактическим идентификатором локали)? – Mackan

+0

Для обоих 0 и 2057 (британский английский) lcid, я возвращаю те же результаты ... display_term: inn, on, park – GPW

ответ

3

Это моя теория ..

Ваше имя отеля, Inn on the Park, будет индекс, как это:

pos word 
1  Inn 
2  (noise) 
3  (noise) 
4  Park 

на и являются остановка/шум слов, а не хранятся в индекс (но заметьте, что позиция все еще сохраняется).

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

Query 1: "Inn on Park" -> "Inn (noise) Park" 
Query 2: "In on Park" -> "(noise) (noise) Park" 

Ваших индексируются строки (название гостиницы) является Inn (noise) (noise) Park, так что это было бы частичное совпадение на втором запросе, но не матч на первом.

Это может быть проверено, например, для поиска Inn 1 1 Park. Это вернет результат. Но Inn 1 Park или 1 Inn 1 Park не будет (позиции не соответствуют).

Чтобы «исправить» это можно использовать различные операторы, такие как AND, OR или NEAR:

"Inn" AND "Park" 
"Inn*" 
"Inn" NEAR "Park" 

Вот две картинки, показывающие результаты ваших основных запросов.Обратите внимание, как второй будет искать только «Park», или «шум шума Парк» (любой из тех, кто будет возвращать результаты):

enter image description here

enter image description here

+0

Хорошо, это имеет смысл. Я не знал, что положение шумового слова было важно. В сценарии реальной жизни, там, и они удалены, прежде чем он войдет в запрос, чтобы это объяснило это. Есть ли все-таки, что это можно преодолеть или мне не нужно будет вырезать шумовые слова в запросе? – GPW

+1

@GPW Я думаю, было бы лучше либо разделить каждое слово между «И», как мой пример выше, либо отправить всю строку поиска в SQL и позволить ей обрабатывать _noises_. Если вы уже определили их в своем интерфейсе, вы можете просто отправить любое шумовое слово ('a') в поисковый запрос. – Mackan

+1

Большое спасибо @Mackan. Это стало лучше меня. Я просто перестану вынимать шумовые слова. – GPW