Полнотекстовый поиск по документам и сопутствующим данным 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>