2

次の表を検討してください。

人々

  • 名 nvarchar(50)
  • 姓 nvarchar(50)

ここでは、このテーブルに両方の列のフルテキスト インデックスがあるとします。

このテーブルで「John Smith」という名前の人をすべて検索したいとします。次のクエリは、これを達成するための完全に合理的な方法のようです。

SELECT * from People p
INNER JOIN CONTAINSTABLE(People,*,'"John*" AND "Smith*"')

残念ながら、 Peopleテーブルに "John" と "Smith" の両方を FirstName 列または LastName 列に含むレコードがないと仮定すると、結果は返されません。FirstName 列が「John」で、LastName 列が「Smith」のレコード、またはその逆のレコードには一致しません。

私の質問はこれです:私が上でやろうとしていることをどのように達成しますか? 上記の例は単純化されていることを考慮してください。私が扱っている実際のテーブルには 10 列あり、受け取った入力は標準のワード ブレーカー (スペース、ダッシュなど) に基づいて分割された単一の文字列です。

4

2 に答える 2

0

これが私がやったことです:

上で示した例は、少し単純化しすぎている可能性があります。実際のアプリケーションでは、フルテキストインデックスは、実際には2つのテーブルの結合を表すビュー上にあります。これの利点の1つは、ビューのスキーマが、それが構築されたテーブルから独立している可能性があることです。

上記の(簡略化した)例を使用するために、次のようなテーブルがあります。

人々

  • FirstName nvarchar(50)
  • LastName nvarchar(50)

インデックスが実際に作成されたビューは、次のようになりました。

PeopleView

  • FirstName nvarchar(50)
  • LastName nvarchar(50)

この問題を回避するために、ビューのスキーマを変更して、ビューで表されるテーブル全体の内容を含む単一の(およびキーの)列ができるようにしました。

PeopleView

  • 名前(FirstName +'' + LastName)

もちろん、ビューの新しいスキーマを考慮してフルテキストカタログを再構築する必要がありましたが、すべての変更はデータベースレベルで行われたため、アプリケーションコードは変更されませんでした。NULLはanything=NULLと連結されているため、null値を持つ可能性のある列を処理するために、ビューにいくつかの調整を加える必要がありました。

于 2010-05-06T21:50:11.927 に答える
0

http://www.developmentnow.com/g/104_2003_8_0_0_399144/Fulltext-across-multiple-columns.htm ?

于 2010-03-12T14:36:25.647 に答える