0

ユーザーが複数の列 (prod_name,prod_desc) を検索できるアプリケーションがあります。

そこで、以下のように全文検索を行いましたが、すべてのレコードを返すわけではありません。また、「o」文字にワイルドカードを使用しないと、%o% のような手段が含まれている間は何も見つかりません。全文検索について少し混乱しています。

何が問題なのか助けてください。

CREATE FULLTEXT CATALOG catalog_crashcourse3;

CREATE FULLTEXT INDEX ON products(prod_name,prod_desc)
KEY INDEX pk_products ON catalog_crashcourse3;

SELECT prod_name, prod_desc
FROM products
WHERE CONTAINS((prod_name,prod_desc), '"*o*"');
4

2 に答える 2

0

SQL Server FTS は単語ベースの検索プロセスです。列にフルテキスト インデックスを作成すると、インデックス エンジンはコンテンツをクロールし、トークン化と呼ばれるプロセスで個々の単語に分割します。インデックスは、単語、単語が見つかった行の主キー、およびコンテンツ内の単語の位置 (つまり、フィールドの最初の単語、57 番目の単語など) を格納します。

などの CONTAINS 述語を指定すると、

CONTAINS((prod_name,prod_desc), '"o"');

SQL Server FTS エンジンは、そのインデックスで "o" であるトークン (単語など) を探します。コンテンツに「o」という単語が含まれていない場合 (おそらく含まれていません)、一致するものは見つかりません。

ご指摘のとおり、ワイルドカード検索を実行して、索引付けされた単語のパターンを試して一致させることができます。たとえば、次のような述語を指定すると、

CONTAINS((prod_name,prod_desc), '"o*"');

検索は、文字「o」で始まる索引付けされたコンテンツ内のすべての単語を返します。

FTS は、索引付けされたコンテンツ内の単語のグループを検索する場合に最適です。高度な単語ステミング (「run」を指定した場合に「ran」や「running」を検索するなど) を行うことができます。また、検索結果コンテンツのランキングも表示されるため、最適なコンテンツを見つけることができます。コンテンツ内の特定の単語を検索するだけで、コンテンツが大きすぎない場合は、FTS は必要ないかもしれません。MikeSmithDev がコメントで指摘したように、LIKE 句を使用するだけで済む場合があります。

注が追加されました:あなたのコメントに応えて、FTS を使用して検索する 8 列のテーブルがある場合、これらの各列に全文インデックスを作成し、次のように検索します。

CONTAINS(*, '"Word"')

ここで、アスタリスクは、テーブル内の 8 つのインデックス付き列すべてを検索に含める必要があることを示します。

于 2012-11-14T15:26:46.823 に答える