Install-Package SoftCircuits.FullTextSearchQuery
FullTextSearchQueryは、ユーザーフレンドリーな検索用語を有効なMicrosoft SQL Server Full-Text-Searchクエリに変換する.NETクラスライブラリです。コードは、クエリがSQLサーバーにエラーを生成するすべてのケースを検出および処理しようとします。
Microsoft SQL Serverは、強力なフルテキスト検索機能を提供します。ただし、特に非プログラマーでは、構文はかなり不可解です。さらに、SQL Serverが正確に正しくない場合、SQL Serverにエラーをスローすることができる多くの条件があります。
FullTextSearchQueryは、ユーザーフレンドリーなGoogleのような検索用語を、対応するフルテキスト検索SQLクエリ条件に変換します。その目標は、ひどく形成された入力に例外を投げないことです。入力からできる最良の有効なクエリを構築するだけです。
次のリストは、さまざまな入力がどのように変換されるかを示しています。
| 入力 | 出力 | 説明 |
|---|---|---|
| ABC | FORMSOF(INFLECTIONAL, abc) | ABCの変曲形を見つけます。 |
| 〜ABC | FORMSOF(THESAURUS, abc) | ABCのシソーラスバリエーションを見つけます。 |
| 「ABC」 | "abc" | 正確な用語ABCを見つけます。 |
| +ABC | "abc" | 正確な用語ABCを見つけます。 |
| 「def」近くの「ABC」 | "abc" NEAR "def" | 正確な用語ABCを正確な用語defの近くで見つけます。 |
| ABC* | "abc*" | ABCで始まる単語を見つけます。 |
| -ABC def | FORMSOF(INFLECTIONAL, def) AND NOT FORMSOF(INFLECTIONAL, abc) | ABCの変曲形態ではなく、DEFの変曲形態を見つけます。 |
| ABC def | FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) | ABCとdefの両方の変曲形を見つけます。 |
| ABCまたはdef | FORMSOF(INFLECTIONAL, abc) OR FORMSOF(INFLECTIONAL, def) | ABCまたはdefのいずれかの変曲形を見つけます。 |
| < +abc +def> | "abc" NEAR "def" | 正確な用語ABCを正確な用語defの近くで見つけます。 |
| ABCおよび(defまたはghi) | FORMSOF(INFLECTIONAL, abc) AND (FORMSOF(INFLECTIONAL, def) OR FORMSOF(INFLECTIONAL, ghi)) | ABCとDEFまたはGHIの両方の変曲形を見つけます。 |
構文的に正しいクエリが生成された後でも、SQL Serverは一部のクエリのエラーを生成できます。たとえば、上の表では、 -abc defのouputが2つのサブエクスペリションを交換することがわかります。これはNOT FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def)ためです。 SQL Serverは、開始時のNOTが好きではありません。この例では、FullTextSearchQueryは2つのサブエクスペッションを交換します( ANDの側にも)。
クエリを作成した後、FullTextSearchQueryはこのおよび他のいくつかのエラー条件を確認し、必要に応じて修正を行います。次の表には、これらの条件について説明しています。
| 学期 | 実行されたアクション |
|---|---|
| Term1およびTerm2ではありません | サブ発現は交換されました。 |
| タームではありません | 廃棄された式。 |
| Term1ではなく、Term2ではありません | ノードがグループ化されている場合(括弧)、またはルートノードである場合、式が破棄されます。それ以外の場合、親ノードには、これを有効にする別のサブエクスペッションが含まれる場合があります。 |
| Term1かどうか項目2 | 廃棄された式。 |
| Term1 Not Not Term2 | 近くの接続詞が変更されました。 |
FullTextSearchQueryは、いずれかのサブエクスポンションがフォームThermforms.LITERALを持つ内部ノードに近いすべての接続詞を変換します。
Transform()メソッドを使用して、検索式を有効なSQL Serverフルテキスト検索条件に変換します。この方法では、ユーザーフレンドリーな検索クエリを使用して、SQL ServerのCONTAINS CONTAINSTABLEに渡すことができる正しく形成されたフルテキスト検索条件に変換します。クエリに無効な用語が含まれている場合、コードは有効な検索条件を返すためにできることを行います。有効な用語が見つからなかった場合、この方法は空の文字列を返します。
// Pass true to add the standard stop words
FtsQuery ftsQuery = new FtsQuery ( true ) ;
string searchTerm = ftsQuery . Transform ( text ) ;次のSQLクエリの例では、 @SearchTerm Transform()から返された文字列への参照です。
SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, @SearchTerm) AS KEY_TBL
ON FT_TBL . unique_key_column = KEY_TBL.[KEY];注意すべきことの1つは、SQL Serverの停止単語の処理です。停止単語は、 a 、および、などの単語です。これらの単語は、フルテキストインデックスに含まれていません。 SQL Serverは、これらの単語が非常に一般的であり、検索の品質を追加しないため、これらの単語をインデックス化しません。これらの単語はインデックス化されていないため、SQL Serverはこれらの単語に一致することはありません。その結果、ストップワードの検索では、そのストップワードが記事に表示される場合がありますが、結果は返されません。
これを処理する最良の方法は、これらの単語をSQLクエリから除外することです。簡単な全文検索では、 StopWords CollectionプロパティにStop Wordsを追加することでこれを行うことができます。停止単語は、引用されていない限り、結果のクエリには含まれません。これにより、クエリ内の停止ワードがすべての結果をブロックするのを防ぎます。
StopWordsコレクションにストップワードの標準リストを追加する最も簡単な方法は、 FtsQueryコンストラクターにtrue渡すことです。 (どの単語が追加されたかを確認するには、 StopWordsコレクションを単純に検査することができます。)必要に応じて、いつでもStopWordsコレクションを変更できます。
または、SQL Serverは、上記の問題を防ぐためのオプションを提供します。 Transform Noise Wordsオプションを使用して、クエリにストップワード(ノイズワード)が含まれている場合でも、SQL Serverが一致を返すことができます。このオプションを1に設定して、ノイズワード変換を有効にします。詳細については、Transform Noise Words Server構成オプションを参照してください。
次のクエリを使用して、SQL Serverデータベースからシステムを停止するワードを取得できます。
SELECT ssw . stopword , slg . name
FROM sys . fulltext_system_stopwords ssw
JOIN sys . fulltext_languages slg
ON slg . lcid = ssw . language_id
WHERE slg . lcid = 1033詳細とコードの説明については、私の記事で簡単なフルテキスト検索クエリをご覧ください。