Полнотекстовый поиск по документам и сопутствующим данным mssql

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

Пользователь загружает документ и при этом выбирает ряд опций из выпадающих списков (таких как категория, тема, область..., обратите внимание, что они не являются обязательными), он также вводит некоторые ключевые слова и описание документа. На данный момент выбранная категория (и другие) сохраняется как внешний ключ в таблице документов с использованием идентификатора из таблицы категорий. То, что мы хотим сделать, это сделать FREETEXTTABLE или CONTAINSTABLE не только для информации в столбце varchar(max), где находится документ, но также для имени категории, названия темы и названия области и т. Д.

Я посмотрел на вариант создания индексированного представления, но это было невозможно из-за левого соединения со столбцом категории. Так что я не уверен, как это сделать, и любые идеи будут наиболее цениться.

2 ответа

Я предполагаю, что вы хотите И два поиска вместе. Например, найдите все документы, содержащие текст "foo" И в категории "Ремонт автомобилей".

Возможно, вам не нужен полный текст дополнительных данных, и вы можете просто использовать = или как? Если дополнительные данные достаточно малы, это может не оправдать усложнение полного текста.

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

Это грубая отправная точка.

-- a staging table variable for the document results
declare @documentResults table (
    Id int,       
    Rank int
)

insert into @documentResults
select d.Id, results.[rank]
from containstable (documents, (text), '"foo*"') results
inner join documents d on results.[key] = d.Id

-- now you have all of the primary keys that match the search criteria
-- whittle this list down to only include keys that are in the correct categories

-- a staging table variable for each the metadata results
declare @categories table (
    Id int        
)

insert into @categories
select results.[KEY]
from containstable (Categories, (Category), '"Automotive Repair*"') results

declare @topics table (
    Id int        
)

insert into @topics
select results.[KEY]
from containstable (Topics, (Topic), '"Automotive Repair*"') results

declare @areas table (
    Id int        
)

insert into @areas
select results.[KEY]
from containstable (Areas, (Area), '"Automotive Repair*"') results


select d.text, c.category, t.topic, a.area
from @results r
inner join documents d on d.Id = r.Id
inner join @categories c on c.Id = d.CategoryId
inner join @topics t on t.Id = d.TopicId
inner join @areas a on a.Id = d.AreaId

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

This is my regular document text. <FTCategory: Automotive Repair> <FTCategory: Transmissions>
Другие вопросы по тегам