полнотекстовый индекс + объединения + linq: как это сделать правильно? - PullRequest
1 голос
/ 03 сентября 2010

ТАК на самом деле есть две части вопроса:

1) как использовать CONTAINSTABLE() с кучей внутренних объединений?

Предположим, есть две таблицы:

Item (ItemID, CategoryID, Name)
Category (CategoryID, ParentCategoryID, Name)

используя "тупой" like поиск это выглядит так:

create view [db].[vItem]
as
select i.*, c1.Name as SubCategory, c2.Name as Category, c3.Name as Department
from Item i
inner join category c1 on(c1.CategoryID=i.CategoryID)
inner join category c2 on(c1.ParentCategoryID=c2.CategoryID)
inner join category c3 on(c2.ParentCategoryID=c3.CategoryID)

затем выполните:

select *
from vItem
where (Name like '%[word 1]%' or SubCategory like '%[word 1]%' or Category like '%[word 1]%' or Department like '%[word 1]%') [and ... word n]

Я мог бы отбросить представление и внутреннее объединение 4 раза на CONTAINSTABLE(), но это а) беспорядочно б) не одно и то же (каждая таблица ключей должна иметь все условия поиска, чтобы иметь какой-либо результат)

2) Как использовать все вышеперечисленное на языке запросов. Опять же, при условии, что я просто использую like подход - это очень просто.

from i in db.VItem
where i.Name.Contains("word 1") ...

Как это сделать с помощью полнотекстового поиска?

1 Ответ

1 голос
/ 03 сентября 2010

Для части 1): создайте свой вид как индексированный вид

create unique clustered index vItem_ItemID 
    on db.vItem(ItemID)

затем создайте полнотекстовый индекс для столбцов этого представления, а не для базовой таблицы.

create fulltext index on db.vItem
    (Name, SubCategory, Category, Department)
    key index vItem_ItemID 

Как только это будет создано, вы можете:

select v.*
    from containstable(db.vItem, *, '"word 1"') ct
        inner join db.vItem v
            on ct.[key] = v.ItemID

Мне придется оставить часть 2) для кого-то другого, так как у меня мало опыта работы с linq.

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