質問

プロジェクトでは SQL Server 2005 を使用しています。システムのユーザーは、「キーワード」を使用して一部のオブジェクトを検索できます。これを実装する方法は、これらの「キーワード」を含む可能性のある各テーブルの重要な列のフルテキスト カタログを作成し、CONTAINS を使用してそのインデックスの検索ボックスにユーザーが入力したキーワードを検索することです。

たとえば、Movie オブジェクトがあり、ユーザーが記事のタイトルと本文でキーワードを検索できるようにしたいとします。その後、Title 列と Plot 列の両方にインデックスを付けて、次のようなことを行います。

SELECT * FROM Movies WHERE CONTAINS(Title, keywords) OR CONTAINS(Plot, keywords)

(実際にはそれよりも少し高度ですが、それほど複雑なことはありません)

一部のユーザーは検索に番号を追加しているため、たとえば「ターミネーター 2」を検索したいと考えています。ここでの問題は、私の知る限り、デフォルトでは SQL Server が短い単語のインデックスを作成しないため、次のような検索が行われることです。

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator 2"')

実際にはこれを行うのと同じです:

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator"') <-- notice the missing '2'

そして、大量の偽の結果が得られています。

SQL Server に短い単語のインデックスを強制的に作成する方法はありますか?できればインデックスのみを作成したいと思います 数字 1、2、21などインデックス作成基準をどこで定義すればよいのか、あるいはそこまで具体的に定義できるかどうかもわかりません。


そうですね、リストから「ノイズワード」を削除しました。動作は少し変わりましたが、それでも期待どおりではありません。

検索では「ターミネーター 2」は検索されません (私がこれを作っているだけです。私たちが何をしているかを明らかにしたら、私の雇用主はあまり満足しないかもしれません...とにかく、用語は少し異なりますが、原則は同じです)、わかりません 何でも, しかし、その 2 つの単語を含むオブジェクトがあることはわかっています。

もしかしたら私は何か間違ったことをしているでしょうか?数字の1をすべて削除しました...ENG、ENU、NEU (ニュートラル) のノイズ構成から 9 を選択し、インデックスを再生成し、検索を試しました。

役に立ちましたか?

解決

これらの「短い単語」は、全文インデックスによって「ノイズ ワード」とみなされます。ノイズワードのリストをカスタマイズできます。これ ブログ投稿 より詳細な情報を提供します。ノイズ ワード ファイルを変更する場合は、全文インデックスを再設定する必要があります。

他のヒント

ノイズ ワード ファイルのことは知っていましたが、なぜ「ターミネーター 2」の例で依然として問題が発生するのかわかりません。でこれを尋ねてみてはいかがでしょうか MSDN データベース エンジン フォーラム この種のことを専門とする人々が集まる場所。

CONTAINS (または CONTAINSTABLE) と単純な where 条件を組み合わせることができます。

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator 2"') および Title like '%Terminator 2%'

CONTAINS ではすべてのターミネーターが検索されますが、where では「ターミネーター 1」が削除されます。

もちろん、エンジンは、「CONTAINS not like」状態でも始動できるほど賢いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top