1

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?人の姓と名の両方を含む文字列に一致しますか?

4

2 に答える 2