SQL Server データベースで全文検索を使用して、複数のテーブルから結果を返しています。最も単純な状況は、人の名前フィールドと説明フィールドを検索することです。これを行うために使用するコードは次のようになります。
select t.ProjectID as ProjectID, sum(t.rnk) as weightRank
from
(
select KEY_TBL.RANK * 1.0 as rnk, FT_TBL.ProjectID as ProjectID
FROM Projects as FT_TBL
INNER JOIN FREETEXTTABLE(Projects, Description, @SearchText) AS KEY_TBL
ON FT_TBL.ProjectID=KEY_TBL.[KEY]
union all
select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID
FROM Projects as FT_TBL
... <-- complex unimportant join
INNER JOIN People as p on pp.PersonID = p.PersonID
INNER JOIN FREETEXTTABLE(People, (FirstName, LastName), @SearchText) AS KEY_TBL
ON p.PersonID=KEY_TBL.[KEY]
)
group by ProjectID
上で (できれば) 明らかなように、私はプロジェクトの説明フィールドでの一致よりも、人の名前の一致を重視しようとしています。「john」などで検索すると、john という名前の人が参加しているすべてのプロジェクトが (予想どおり) 大きく重み付けされます。私が抱えている問題は、誰かが「john smith」のようなフルネームを提供する検索です。この場合、名前の一致はそれほど強力ではありません (私は推測します) firstname
/の各lastname
列で検索用語の半分しか一致していないためです。多くの場合、これは、入力した名前と完全に一致する人が検索結果の上位に表示されるとは限らないことを意味します。
firstname
各/lastname
フィールドを個別に検索し、それらのスコアを合計することでこれを修正できたので、新しいクエリは次のようになります。
select t.ProjectID as ProjectID, sum(t.rnk) as weightRank
from
(
select KEY_TBL.RANK * 1.0 as rnk, FT_TBL.ProjectID as ProjectID
FROM Projects as FT_TBL
INNER JOIN FREETEXTTABLE(Projects, Description, @SearchText) AS KEY_TBL
ON FT_TBL.ProjectID=KEY_TBL.[KEY]
union all
select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID
FROM Projects as FT_TBL
... <-- complex unimportant join
INNER JOIN People as p on pp.PersonID = p.PersonID
INNER JOIN FREETEXTTABLE(People, (FirstName), @SearchText) AS KEY_TBL
ON p.PersonID=KEY_TBL.[KEY]
union all
select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID
FROM Projects as FT_TBL
... <-- complex unimportant join
INNER JOIN People as p on pp.PersonID = p.PersonID
INNER JOIN FREETEXTTABLE(People, (LastName), @SearchText) AS KEY_TBL
ON p.PersonID=KEY_TBL.[KEY]
)
group by ProjectID
私の質問:
firstname
これは私が取るべきアプローチですか、それともテキストの塊であるかのようにlastname
列のリストで全文検索を行う方法はありますかname
?人の姓と名の両方を含む文字列に一致しますか?