web-dev-qa-db-ja.com

複数のテーブルに対してfreetexttableを使用するにはどうすればよいですか?

(とりわけ)サポートチケットのテーブルを含むデータベースがあります。各チケットには、短い要約と説明があります。各チケットには複数のメモを含めることができ、各メモには詳細を含むアクションが関連付けられています。これと同様に、チケットにはオプションでProblemAndSolutionを含めることができます。これは標準の問題とソリューションです。

このための(切り捨てられた)スキーマは次のようになります...

create table ProblemAndSolutions (
ID int not null identity(1,1) primary key,
Problem varchar(max) not null default '',
Solution varchar(max) not null default '',
)
go

create table Actions (
ID int not null identity(1,1) primary key,
Details varchar(max) not null default '',
)
go

create table SupportTickets (
ID int not null identity(1,1) primary key,
ShortSummary varchar(max) not null default '',
Description varchar(max) not null default '',
ProblemAndSolutionID int foreign key references ProblemAndSolutions(ID),
)
go

create table SupportTicketNotes (
ID int not null identity(1,1) primary key,
SupportTicketID int not null foreign key references SupportTickets(ID),
ActionID int not null foreign key references Actions(ID),
)
go

ユーザーがキーワードを入力できる機能を提供するように求められ、関連するチケットが表示され、上の表のすべてのvarcharフィールドが検索されます。言い換えれば、彼らは、キーワードがチケットの短い要約または説明に、および/または問題および/または解決策に、および/またはノートのAction.Detailsフィールドに表示されるチケットを見たいと思っています。明らかに、出現回数が多いほどランクは高くなります。

これはfreetexttableにとって理想的な仕事であるように思われ、確かに1つのテーブルでこれはうまく機能しました。ただし、すべてのテーブルを検索する方法を確認するのに苦労しています。結合の作成に関する多くの回答を見てきましたが、キーワードが複数のProblemAndSolutionsおよびnote/actionsに表示された場合、チケットごとに複数の結果が得られるため、これがどのように役立つかわかりません。

私が欲しいのは、各チケットが一度だけ表示される一連の結果で終わり、そのランクは上記のvarcharフィールドのいずれかで見つかったキーワードに基づいています。

私がこれをどのように行うかを説明できる人はいますか?

編集より明確にするために、いくつかの(オンザフライで作成されたため、ばかげている)サンプルデータを次に示します...

チケット#1

ShortSummary = "壊れたコンピュータ"

説明=「コンピュータが壊れています」

P&S#1にリンク(下記参照)

Action.Detailsに「computer」という単語が1回含まれているメモがあります

チケット#2

ShortSummary = "壊れたシステム"

説明=「コンピュータシステムが壊れています」

P&Sにリンクされていません

Action.Detailsに「computer」という単語が2回含まれているメモがあります

P&S#1

問題=「コンピュータが機能しない」

解決策=「コンピューターが壊れており、交換が必要です」

現在、チケット#1は「コンピュータ」という単語を5回使用しています。1回は要約と説明で、1回はメモで、2回はリンクされたP&Sで使用しています。チケット#2は「コンピュータ」という言葉を3回使用します。1回は説明文で、2回はメモで使用されます。

キーワードがより多く出現するため、「コンピュータ」という単語で検索すると、チケット#1が#2の上にランク付けされると思います。

編集#2

これを試しやすくするために、サンプルデータを生成するSQLを次に示します。これは、上で示したサンプルとまったく同じではありませんが、原理は同じです...

insert ProblemAndSolutions (Problem, Solution) values ('computer not working', 'computer broken')
insert ProblemAndSolutions (Problem, Solution) values ('unclear error report', 'stupid customer, tell them to buy a new computer')
insert ProblemAndSolutions (Problem, Solution) values ('crashed computer', 'the computer is a broken computer')

insert Actions (Details) values ('we checked it and id did not work when we tried to start it')
insert Actions (Details) values ('the computer is completely broken and needs replacing')
insert Actions (Details) values ('we called, but the customer was out. will call back again')
insert Actions (Details) values ('brand new computer, so probably not a fault. more likely a stupid customer')
insert Actions (Details) values ('customer reported something going wrong, but we couldn''t find anything')

insert SupportTickets (ShortSummary, Description, ProblemAndSolutionID) values ('computer broken', 'the computer is completely broken and is not working', 1)
insert SupportTickets (ShortSummary, Description, ProblemAndSolutionID) values ('broken computer', 'we have broken the pc today', NULL)
insert SupportTickets (ShortSummary, Description, ProblemAndSolutionID) values ('computer crash', 'the machine crashed when we tried to start it', 2)
insert SupportTickets (ShortSummary, Description, ProblemAndSolutionID) values ('computer crash computer', 'the compter crashed when we tried to start the computer', 3)

insert SupportTicketNotes (SupportTicketID, ActionID) values (1, 1)
insert SupportTicketNotes (SupportTicketID, ActionID) values (1, 2)
insert SupportTicketNotes (SupportTicketID, ActionID) values (2, 3)
insert SupportTicketNotes (SupportTicketID, ActionID) values (2, 4)
insert SupportTicketNotes (SupportTicketID, ActionID) values (3, 5)
2
Avrohom Yisroel

次の2つのオプションがあります。

  1. 各テーブルに個別のフルテキストインデックスを作成し、個別のクエリ結果をUNIONします。異なるフルテキストインデックス間のランキングは比較できないため、独自のメタランキング基準を使用する必要があります。これにより、かなり複雑でネストされたクエリが発生し、目的の結果が得られます。

  2. チケットのすべての検索可能なフィールドを含む別のテーブルを作成し、そのテーブルに単一のフルテキストインデックスを作成します。検索オプションとランキングの方法に応じて、すべてのテキストを1つの列に統合するか、テーブルごとに異なる列を作成できます。これにより、すべての関連データにわたってFreeTextTableの固有のランキング機能を使用できます。このオプションでは、各チケットの検索可能なテキストを維持するために多くの労力が必要ですが、クエリがはるかに簡単になり、ランク付け基準によっては、より一貫性があり信頼性の高いランク付けが可能になります。

特定のキーワードを探している場合、FREETEXTTABLEではなくCONTAINSTABLEを使用して調べる必要があります。後者は、前者の意味と正確な単語を照合するためのものです。

1
Duffy