Вопросы по полнотекстовому поиску в SQL Server 2008 - PullRequest
3 голосов
/ 22 марта 2010

У меня есть несколько вопросов по поводу интегрированного полнотекстового поиска SQL 2K8.

Скажем, у меня есть следующие таблицы:

  1. Автомобиль с колонками: id (int - pk), makeid (fk), описание (nvarchar), год (int), функции (int - побитовое значение - только 32 функции)
  2. CarMake со столбцами: id (int - pk), mfgname (nvarchar)
  3. CarFeatures со столбцами: id (int - 1, 2, 4, 8 и т. Д.), Имя элемента (nvarchar)

Если кто-то ищет "red honda civic 2002 4 doors", как мне разобрать входную строку, чтобы я мог также искать в таблицах "CarMake" и "CarFeatures"?

1 Ответ

2 голосов
/ 22 марта 2010

Попытка разобрать критерии поиска, такие как это будет боль. Возможным альтернативным решением было бы создание представления, которое создает длинное описание автомобиля и создание полнотекстового индекса по нему. Так что это представление может выглядеть так:

Create View dbo.CarData
WITH SCHEMABINDING
As

Select dbo.Cars.Id
    , dbo.CarMake.Manufactuer
        + ' ' + dbo.Cars.[Year]
        + Coalesce(' ' + dbo.Cars.Description,'')
        + ' ' + Case When Features & 1 <> 0 Then (Select Name From dbo.CarFeature Where Id = 1) Else '' End
        + ' ' + Case When Features & 2 <> 0 Then (Select Name From dbo.CarFeature Where Id = 2)  Else '' End
        + ' ' + Case When Features & 4 <> 0 Then (Select Name From dbo.CarFeature Where Id = 4)  Else '' End
        + ' ' + Case When Features & 8 <> 0 Then (Select Name From dbo.CarFeature Where Id = 8)  Else '' End
        + ' ' + Case When Features & 16 <> 0 Then (Select Name From dbo.CarFeature Where Id = 16)  Else '' End As Description
From dbo.Cars
    Join dbo.CarMake
        On CarMake.Id = Cars.MakeId

С полнотекстовым индексом в этом представлении вы можете взять критерии поиска и выполнить:

Select ...
From CarData
Where Contains(Description, Replace('red honda civic 2002 4 doors', ' ', ' AND '))

Так вот, это далеко не идеально. Например, это приведет к «... 4 И двери» и, таким образом, в 2004 году будут найдены модели автомобилей с 2 ​​дверями или 4WD и 2 дверями. Кроме того, я не видел цвета в вашей схеме, поэтому я не уверен, как это попадет в микс.

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

Кстати, столбец функций, являющийся побитовым значением, делает поиск более трудным, поскольку вам нужно будет выполнить побитовую операцию И для каждого значения, чтобы определить, имеет ли оно рассматриваемый объект. Было бы лучше разбить отображение «Характеристика на автомобиль» в отдельную таблицу.

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