sql >> データベース >  >> RDS >> Sqlserver

上級ユーザー向けのSQLServer2016での全文検索の実装

    この記事では、データ専門家向けの全文検索の高度な使用方法について説明します。日々のデータベース分析でより良い検索体験を可能にします。

    さらに、読者は全文検索とその実装の基本的な知識を超えて取得します。迅速で信頼性の高い結果を得るには、全文検索を使用した高度な検索方法の重要性がわかります。

    前提条件

    まず、この記事は全文検索の高度な使用法に焦点を当てているため、前提条件を確認しましょう。

    T-SQLのノウハウ

    この記事では、ウォークスルーを実装するために、読者がSQLServerの基本的な知識を備えたデータベースに対するT-SQLスクリプトの記述と実行に精通していることを前提としています。

    全文検索の基本

    この記事では、読者が全文検索の基本を理解していることも求められます。

    初心者向けSQLServer2016での全文検索の実装を参照してください。 ウォークスルーによる全文検索の基本的な概念と実装に精通したい場合は、記事をご覧ください。

    全文検索のインストール

    全文検索がすでにSQLインスタンスに追加されていると仮定しましょう。

    まだ行っていない場合は、初心者向けSQLServer2016での全文検索の実装の手順に従ってください。 SQLインスタンスに全文検索をインストールするのに役立つ記事。

    次のスクリプトを実行すると、全文検索のステータスを確認できます。

    -全文検索がインストールされている場合は、1または0SELECT fulltextserviceproperty('IsFulltextInstalled')as [Full-Text Search] 

    サンプルデータベースSQLDevBlogV7

    次に、 SQLDevBlogV7というサンプルデータベースを作成してデータを入力します。 メモがある VARCHAR(MAX)の列 タイプ。これを行うには、マスターデータベースに対して次のT-SQLスクリプトを実行します。

    -サンプルデータベースの作成(SQLDevBlogV7)CREATE DATABASE SQLDevBlogV7; GOUSE SQLDevBlogV7;-(1)サンプルデータベースにArticleテーブルを作成CREATE TABLE [dbo]。[Article]([ArticleId] INT IDENTITY(1、1)NOT NULL、[Category] ​​VARCHAR(50)NULL、[Author] VARCHAR(50)NULL、[Title] VARCHAR(150)NULL、[Published] DATETIME2(7)NULL、[Notes] VARCHAR(MAX)NULL、CONSTRAINT [PK_Article ] PRIMARY KEY(ArticleId));GO--表形式のデータをリセットTRUNCATETABLEdbo.ArticleGO--テーブルにデータを追加SETIDENTITY_INSERT[dbo]。[Article]ONINSERT INTO [dbo]。[Article]([ArticleId]、[Category] 、[作成者]、[タイトル]、[公開済み]、[メモ])VALUES(1、N'開発'、N'Atif'、N'T-SQLプログラミング入門'、N' 2017-01-01 00: 00:00'、N'この記事は、SELECTを含む最も一般的に使用されるステートメントをカバーするT-SQLプログラミングに関するものです。')INSERTINTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title] 、[公開済み]、[メモ])VALUES(2、N'Testing'、N'Peter'、N'Database Unit Testing Fundamentals'、N' 2017-01-10 00:00:00'、 N'これは、例とウォークスルーを使用してユニットテストに慣れるためのデータベースユニットテストの記事です。')INSERTINTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title] 、[公開]、[メモ])VALUES(3、N'データ分析'、N'ハロン'、N'SQLウィンドウ関数を使用した基本的なデータ分析の学習'、N'2019-06-12 00:00:00'、 N'この記事は、T-SQL(Transact-SQL)ウィンドウ関数と日常のデータ分析タスクでの基本的な使用法についてです。')INSERTINTO [dbo]。[Article]([ArticleId]、[Category]、 [作成者]、[タイトル]、[公開済み]、[メモ])VALUES(4、N'開発'、N'ピーター'、N'共通テーブル式(CTE)'、N' 2017-02-10 00:00 :00'、N'これは、T-SQLでCTEを使用して複雑なクエリを作成する方法を説明する記事です。')INSERTINTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[ Title]、[Published]、[Notes])VALUES(5、N'Testing'、N'Sadaf'、N'Manual Testing vs. Automated Testing'、N' 2017-03-20 00:00:00'、N 'この記事は、手動テスト間の比較分析に基づいていますと自動テスト。この記事では、tSQLtを使用して、自動テストの例を示します。')INSERT INTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title]、[Published]、[Notes])VALUES(6 、N'Testing'、N'Atif'、N'Beyond Database Unit Testing'、N'2017-11-10 00:00:00'、N'データベースユニットテストに関しては、やるべきことがたくさんあります。この記事では、tSQLtを使用してSQL単体テストを記述および実行するための高度なレベルのメソッドについて詳しく説明します。')INSERTINTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title]、[Published ]、[注])VALUES(7、N'Testing'、N'Sadaf'、N'Cross Database Unit Testing'、N'2017-12-20 00:00:00'、N'この記事は複雑なシナリオをカバーしていますサードパーティのテストツールを使用したクロスデータベース単体テストの例。')INSERTINTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title]、[Published]、[Notes])VALUES(8 、N'Development'、N'Haroon'、N'T-SQL IsNumeric関数を適切に使用する方法'、N'2018-01-10 00:00:00'、N'これは、IsNumeric関数についてです。式はbすることができますeは数値として評価されます。ここで、式は、SQLServerデータベースエンジンによって単一のデータ値として評価されるシンボルと演算子で構成できます。')INSERTINTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title ]、[公開済み]、[メモ])VALUES(9、N'Testing'、N'Sadaf'、N'初心者向けのスクリプトおよびテストデータベース'、N' 2018-02-15 00:00:00'、N'この記事は、最新のツールとテクノロジーを使用したSQLデータベースのスクリプト作成とテストに基づいています。')INSERTINTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title]、[Published]、 [注])VALUES(10、N'開発'、N'Atif'、N'高度なデータベース開発方法'、N'2018-07-10 00:00:00'、N'この記事では、最新のデータベース開発ツールについて説明します。 SSDT、SSMSなどを含む')INSERT INTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title]、[Published]、[Notes])VALUES(11、N'Testing ' 、N'Sadaf'、N'データベースのユニットテストの記述方法'、N'2018-11-10 00:00:00'、N'この記事は、MSTを使用したデータベースのユニットテストの記述に関するものです。 est。')INSERT INTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title]、[Published]、[Notes])VALUES(12、N'Development'、N'Peter '、N'最新のツールを使用したデータベース開発'、N'2018-12-10 00:00:00'、N'この記事では、SQLServerデータツールとSQLServerManagementStudioを使用してデータベース開発シナリオについて説明します。 ')INSERT INTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title]、[Published]、[Notes])VALUES(13、N'DLM'、N'Atif'、 N'データベースの設計、開発、およびデプロイ'、N'2019-01-01 00:00:00'、N' Azure DevOpsとその実装に関する概念が、この記事の主な焦点です。')INSERTINTO[dbo]。 [Article]([ArticleId]、[Category]、[Author]、[Title]、[Published]、[Notes])VALUES(14、N'DLM'、N'Peter'、N'データベースライフサイクル管理の適用方法'、N' 2019-02-10 00:00:00'、N'この記事はDLMに関するものです。')INSERTINTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title ]、[公開済み]、[メモ])VALUES(15、N'Testing'、N'Saqib'、N'SQL Unit Testing Stored Procedures'、N' 2019-03-10 00:00:00'、N' This記事では、プロシージャの単体テストの記述方法について説明しています。')INSERT INTO [dbo]。[Article]([ArticleId]、[Category]、[Author]、[Title]、[Published]、[Notes])VALUES( 16、N'Reporting'、N'Haroon'、N'SSRS Reports Development in SimpleTerms'、N'2019-07-10 22:26:42'、N'記事はSQL Server Reporting Services(SSRS)開発の基礎に専念し、データベース開発に関心のある初心者や専門家を対象としています。')SETIDENTITY_INSERT[dbo]。[Article]OFF

    フルテキストカタログの作成

    以下のスクリプトまたはセットアップウィザードを使用して、フルテキストカタログを作成します。

    -フルテキストカタログを作成するCREATEFULLTEXTCATALOG ArticleCatalog AS DEFAULT; GO 

    メモのフルテキストインデックスを定義する

    カタログが正常に作成されたら、メモに基づいてフルテキストインデックスを定義します 次のように列を作成します(またはセットアップウィザードを使用して):

    -フルテキストインデックスを定義するdbo.Article(Notes)KEY INDEX PK_ArticleWITH STOPLIST =SYSTEM; GO
    でフルテキストインデックスを作成する

    フルテキストカタログとフルテキストインデックスチェック

    関連するノードを展開して、作成したフルテキストインデックスとフルテキストカタログを表示します。

    これで、対象のテーブルに対してフルテキストクエリを実行する準備が整いました。この場合は記事です。 。

    簡単な用語

    単語やフレーズの検索は他の形式の検索よりも簡単なので、単純な用語とも呼ばれます。

    初心者向けSQLServer2016での全文検索の実装を参照してください。 単語やフレーズを検索するためのフルテキストクエリの基本的な形式を実装するための記事。

    それでは、全文検索を使用して行われる可能性のある高度な検索のいくつかについて説明しましょう。

    プレフィックス用語を使用した高度な全文検索

    接頭辞用語は、いくつかの文字で始まる接頭辞付きの単語を指します。その場合、そのパターンに一致するものであれば何でもかまいません。 LIKEの全文検索バージョンと考えることができます 接頭辞付きの単語*。

    フレーズ内の1つまたは複数の単語に接頭辞を付けることもできます。

    たとえば、 data *という単語を検索します データ、データベース、データベースなど、その列のデータから始まるものなら何でも取得できます。

    プレフィックス用語を使用した開発関連記事の検索

    想像してみてください。あなたは、開発関連の記事を検索して、それらを別の開発グループに編成し、Webサイトの表示エクスペリエンスを向上させる必要があります。

    解決策は、次のようにフルテキストクエリを使用する「プレフィックス用語検索」です。

    --開発関連の記事を検索するためのプレフィックス用語フルテキストSeachの実装SELECTTitle、Notes FROM dbo.Article WHERE CONTAINS(NOTES、'"dev *"')

    結果には、 DevOpsに関する記事も示されました。 –開発関連ではないため、別のスクリプトを実行します。次のようにDevOpsを除いて、フルテキストクエリを使用するとすべての開発関連記事がより迅速に検索されます。

    --DevOpsSELECT Title、Notes FROM dbo.Article WHERE CONTAINS(NOTES、'"dev *"')AND NOT CONTAINS(Notes、'DevOps')<ではなく、dev関連の記事を検索するためのプレフィックス用語フルテキストSeachの実装/ pre> 

    出力は次のとおりです。

    また、上記のスクリプトに示されているように、検索語を二重引用符で囲むことが不可欠です。これにより、プレフィックス用語検索を適切に実装します。

    語形変化を使用した高度な全文検索

    単語の語形変化を検索する必要がある場合があります。これは、単語がとり得る形を意味します。

    簡単な例は、次の語形変化を持つことができる「展開」という単語です。

    1. デプロイ
    2. デプロイ済み
    3. 展開
    4. 展開
    5. 展開

    屈折形の書き込み検索

    フルテキストクエリを実行して、 write:という単語のすべての語形変化のメモを検索するとどうなるか見てみましょう。

    -フルテキストSearchSELECTTitle、Notes FROM dbo.Article WHERE CONTAINS(NOTES、'FORMSOF(INFLECTIONAL、write)')
    を使用して語形変化の単語書き込みを検索する

    両方の書き込みを含む行を含む[メモ]列 および書き込み 書き込みの場所に表示されます 書き込みの語形変化です 。

    語形変化のテクノロジー検索

    さまざまな形式のテクノロジー単語を含むすべての記事を検索する必要がある場合は、次のT-SQLスクリプトを使用して語形変化形式の単語検索を実装します。

    -フルテキストSearchSELECTTitle、Notes FROM dbo.Article WHERE CONTAINS(NOTES、'FORMSOF(INFLECTIONAL、technology)')を使用して語形変化のある単語テクノロジーを検索する

    出力は次のとおりです。

    プレフィックス用語単位検索なし

    次に、より複雑なフルテキストクエリを作成しましょう。すべての記事を検索して、 testという単語の語形変化を見つけます。 ただし、接頭辞なしユニット (単体テストを除く)単体テストではなく、テストに関する記事を探しているので:

    -フルテキストSearchSELECTTitle、Notes FROM dbo.Article WHERE CONTAINS(NOTES、'FORMSOF(INFLECTIONAL、test)')AND NOT CONTAINS(NOTES、'" unitを使用して、単位接頭辞用語を除く語形変化形の単語テストを検索* "')

    その結果、手動のレコードのみが表示されます。 、自動化 または単にテスト ユニットテストを除いて単語が言及されています 記事。

    近接検索を使用した高度な全文検索

    フルテキストクエリを実行して、近接検索を使用する実践的な経験を活用しましょう。

    近接検索/用語

    この形式の全文検索では、互いに近い単語やフレーズを検索できます。一部の単語やフレーズが非常に狭い場所にある場合は、レコードを見つけるのに非常に便利です。

    近接検索の良い例は、サッカーという単語が含まれるレコードを検索することです。 地面という単語の近くにあります サッカー場に関する情報のみを取得するため。

    近接用語を使用して「高度なニアテスト」を検索

    特定の順序に従わずに高度なテストが言及されているすべての記事を検索する場合は、目的の列に対して全文検索が設定されているため、近接検索を使用するのが最善のオプションです。

    次のスクリプトを記述して、 Advancedという単語を検索します。 テストという単語の近く [メモ]列​​の任意の順序:

    -近接検索(全文検索)を使用して、高度な単語の近くの単語を検索します。dbo.ArticleWHERE CONTAINS(NOTES、'NEAR(advanced、testing)')からメモを選択します。

    結果は次のとおりです。

    結果は、テストが高度なレベルの方法で言及されているメモを示しており、これが私たちが探していたものです。 2つの単語間の距離を指定することもできます。

    2語以内の間隔で検索

    最後に、近接用語を使用してフルテキストクエリを実行し、データベースという単語が含まれるすべてのデータベースシナリオを見つけます。 シナリオという言葉の近くにあります ただし、2語以内の間隔で使用してください。

    -近接検索(全文検索)を使用して、2単語以内の単語シナリオに近い単語データベースを検索します。dbo.ArticleWHERECONTAINS(NOTES、'NEAR((database、scenario)、2、TRUE )')

    出力は次のとおりです。

    その結果、データベース開発シナリオが掲載された記事 言及されていますが、正常に表示されています。

    これにより、任意の列に対して高度なフルテキストクエリを作成する方法を習得できました。これは、該当する場合はいつでも、プロのライフシナリオで全文検索を実行する準備をするための高度な検索要件を満たすのに役立ちます。

    やるべきこと

    高度なフルテキストクエリを作成できるようになったので、スキルを向上させるために次のことを試してください。

    1. 接頭辞が autoであるすべての記事を検索してみてください 使用されます。
    2. この記事を念頭に置いて、近接検索を実行し、モダンという単語が含まれるすべての行を検索するスクリプトを作成してみてください。 ツールという言葉の近くにあります 。
    3. 書いたという単語のすべての語形変化を見つけてみてください 。

    1. パッケージのマルチレベルの依存関係を見つけるためのスクリプト

    2. OracleからPostgreSQLへの移行-知っておくべきこと

    3. JSONBフィールドから集約されたキー/値のペアをフラット化しますか?

    4. 例外の取得ORA-00942:表またはビューが存在しません-既存の表に挿入する場合