Полнотекстовый поиск по документам и сопутствующим данным mssql - PullRequest
0 голосов
/ 28 сентября 2010

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

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

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

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

This is my regular document text. <FTCategory: Automotive Repair> <FTCategory: Transmissions>
0 голосов
/ 28 сентября 2010

Я предполагаю, что вы хотите И два поиска вместе.Например, найдите все документы, содержащие текст «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
...