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

SQL Server全文検索(FTS)でストップリストの使用をマスターする

    ストップリストの作成と管理は、インデックスのサイズを縮小するとともに、全文検索のパフォーマンスを向上させる主要なコンポーネントの1つとして機能します。この記事は、仕事を深くマスターし、シンプルで興味深い例のストップリストを作成するための複数の戦略を実装するのに役立つことを目的としています。

    また、ストップリストを生成するためのさまざまな方法の重要性を強調し、最適な方法を選択する方法を明確にします。

    ストップリストをマスターする理由

    全文検索に関するストップリストの使用について話すとき、最初の質問は、なぜこれらのストップリストについて多くを学ぶのかということです。答えは、全文検索でストップリストを使用することの明白な利点と隠された利点の両方にあります。実装が成功すると、長期的なメリットも得られる可能性があります。

    ストップリストの重要性

    ストップリストは、ユーザー定義またはシステム提供のストップワードを含む全文検索の言語固有のコンポーネントです。そのような単語を全文検索の一部になることから除外する必要があります。

    ストップリストのない全文検索の設計は、全文検索の効率と応答時間を改善する言語固有のコンポーネントの最適な使用法ではありません。

    前提条件

    1. T-SQLスクリプトを記述して実行できます。
    2. 全文検索をSQLServerインスタンスにインストールする必要があります。
    3. あなたは基本的な全文検索の概念と実装に精通しています。
    4. ストップワードとストップリストの基本的な知識があります。

    上記の要件を確実にするための情報が不足している場合は、以下の記事を参照してください。

    • 初心者向けのSQLServer2016での全文検索の実装
    • 上級ユーザー向けのSQLServer2016での全文検索の実装
    • ストップワードとストップリストを使用してSQLServer全文検索(FTS)を改善する方法

    ストップリスト作成の複数の戦略

    多くの異なる方法や戦略がありますが、それらのいくつかは他のものよりはるかに優れています。全文検索の実装スキルを持つデータベース開発者は、必要に応じて最適な方法を選択するためのすべての方法に精通している必要があります。

    これらのさまざまな戦略を理解するための最も効果的な方法は、サンプルデータベースに対してそれらを適用することです。

    サンプルデータベースのセットアップ

    最初のステップは、フルテキストクエリを実行するようにデータベースを設定することです。 WatchReviewsMasterStoplistというサンプルデータベースを作成します :

    -- Create WatchReviewsMasterStoplist database
    CREATE DATABASE WatchReviewsMasterStoplist;
    GO
    
    -- Connect to the sample database
    USE WatchReviewsMasterStoplist
    
    -- (2) Create WatchReview table
    CREATE TABLE [dbo].[WatchReview]
    (
    	[ReviewId] INT NOT NULL IDENTITY , 
        [Date] DATETIME2 NULL, 
        [Person] VARCHAR(50) NULL, 
        [Details] VARCHAR(1000) NULL, 
        CONSTRAINT [PK_WatchReview] PRIMARY KEY (ReviewId)
    )
    
    -- (3) Populate WatchReview table
    SET IDENTITY_INSERT [dbo].[WatchReview] ON
    INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (1, N'2020-06-01 00:00:00', N'Asif', N'Hi, I have just bought this Casio black digital watch which is excellent and has date, alarm, stopwatch and timer as well.')
    INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (2, N'2020-07-02 00:00:00', N'Asim', N'Hi, I have just bought this Casio black analog watch which is average and slightly discomforting and just got date and time.')
    INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (3, N'2020-08-03 00:00:00', N'Martin', N'Hi, I have just purchased this Casio black digital watch which is excellent and has features like an alarm, stopwatch, date, and timer. ')
    INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (4, N'2020-09-10 00:00:00', N'Brian ', N'Hi, I have just ordered this Seiko black digital watch which is excellent and has date, alarm and timer.')
    INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (5, N'2020-10-11 00:00:00', N'Peter', N'Hi, I have just ordered this Seiko white analog watch which is average and has alarm, date and timer.')
    SET IDENTITY_INSERT [dbo].[WatchReview] OFF

    複数のストップリスト戦略の概要

    次の3つの方法/戦略を使用して、ストップリストを作成し、ノイズのある単語が全文検索クエリの一部になるのを防ぐことができます。

    1. カスタムストップリストを作成する
    2. システムストップリストを作成する
    3. カスタム(またはシステム)ストップリストからストップリストを作成する

    ストップリストの前提条件

    ストップリストを作成する前に、次のことを行う必要があることに注意してください。

    1. 使用可能なキー列(主キー)がない場合は、テーブル列の1つに一意のインデックスを作成します。
    2. フルテキストカタログを作成します。
    3. フルテキストインデックスを作成します。

    カスタムストップリストを作成する

    (サンプルデータベースのように)一意のインデックスまたは主キー列が使用可能であると想定します。次のようにカスタムストップリストを作成します:

    1. フルテキストカタログを作成します。
    2. 空のカスタムストップリストを作成します。
    3. 手順2で作成したカスタムストップリストを使用してフルテキストインデックスを作成します。

    詳細については、「ストップワードとストップリストを使用してSQL Server全文検索(FTS)を改善する方法」の記事を参照してください。

    カスタムストップリストの長所と短所

    カスタムストップリストを作成する最大の利点は、ノイズワードと思われる単語を追加および削除することで、ストップリストを完全に制御し、追跡できることです。

    ただし、このアプローチを使用することには欠点があります。ストップリストは非常に限られており、フルテキストクエリのパフォーマンスをさらに向上させるためにシステムが推奨するストップワードは含まれていません。

    システムストップリストの作成

    次のようにシステムストップリストを作成します(主キー列または一意のインデックスが提供されている場合)。

    1. フルテキストカタログを作成します。
    2. システムストップリストを使用してフルテキストインデックスを作成します。

    最初にフルテキストカタログを作成して、システムストップリストを使用する準備をします:

    -- Create Full-Text catalog
    CREATE FULLTEXT CATALOG [WatchReviewCatalog] AS DEFAULT;
    GO

    テーブルWatchReviewのレビュー列(詳細)にフルテキストインデックスを作成します システムストップリストを使用します。次のT-SQLスクリプトを使用します。

    -- Create Full-Text index with System Stoplist
    CREATE FULLTEXT INDEX ON dbo.WatchReview(Details LANGUAGE [British English]) 
       KEY INDEX PK_WatchReview  
       WITH STOPLIST = System;  
    GO  

    英語システムのストップリストを表示する

    イギリス英語のシステムストップリストに含まれるストップワードのリストを表示できます。次のSQLクエリを実行します:

    -- View system stoplist of English language
    SELECT name,stopword FROM sys.fulltext_system_stopwords sw
    INNER JOIN sys.fulltext_languages fl
    on sw.language_id=fl.lcid
    where name='British English'

    出力は次のとおりです。

    最新のレビュートップ3を表示

    新しく作成されたサンプルデータベースに対してクイックチェックを実行します。 WatchReviewから最新の時計レビュートップ3を取得してください テーブル:

    -- Top 3 most recent watch reviews 
    SELECT TOP 3 wr.Person,FORMAT(wr.Date,'dd-MMM-yyyy') as ReviewDate,wr.Details FROM dbo.WatchReview wr
    ORDER BY wr.Date DESC

    出力は次のとおりです。

    フルテキストクエリを実行してストップワードを確認する

    指定されたテーブルに対してフルテキストクエリを実行できます。フルテキストクエリに多くのノイズワード(パフォーマンスを向上させるためにシステムストップリストに含まれている)が表示されなくても驚かないでください。これは、システムストップリストが正しく機能していることを意味します。

    ご覧のとおり、「これ」という単語 上位3件のレビューに含まれています。ただし、それ自体がシステムストップリストによって認識されるノイズワードです。

    全文検索でノイズワード「this」が返されるかどうかを確認しましょう システムストップリストに含まれるもの:

    --Run Full-Text query to Search for Noise word 'this' 
    SELECT * FROM dbo.WatchReview
    WHERE CONTAINS(Details,'this')

    結果セットは以下のとおりです。

    これで、フルテキストクエリを実行して、「is」という単語を検索できます。 これは別のノイズワードです:

    --Run Full-Text query to Search for Noise word 'is' 
    SELECT * FROM dbo.WatchReview
    WHERE CONTAINS(Details,'is')

    クエリの出力は次のとおりです。

    は」という言葉がわかります また、貴重なリソースを節約することで、フルテキストクエリの結果の一部になることを防ぐことができました。

    「こんにちは」という単語を検索するためのフルテキストクエリ

    フルテキストクエリを実行して、「こんにちは」という単語を検索します。 これは、システムのストップリストの一部ではありません。したがって、クエリはそれを返す必要があります。

    --Search Noise word 'Hi' 
    SELECT * FROM dbo.WatchReview
    WHERE CONTAINS(Details,'Hi')

    出力は次のとおりです。

    「こんにちは」という単語を含むすべてのレコードを取得しました ただし、ノイズワードであるため除外したいと思います。テキスト分析で全文検索を使用する場合、この単語は目的から私たちをそらす可能性があります。

    これにより、3番目の方法であるカスタムまたはシステムのストップリストからストップリストを作成できます。

    システムストップリストからのカスタムストップリストの作成

    WatchMasterStoplistというカスタムストップリストを作成します 次のT-SQLスクリプトを使用してシステムストップリストから:

    --Creating a custom stoplist WatchMasterStoplist from system stoplist 
    CREATE FULLTEXT STOPLIST [WatchMasterStoplist] FROM SYSTEM STOPLIST;
    GO

    新しいカスタムストップリストとフルテキストインデックスの関連付け

    次のように、新しく作成したカスタムストップリストをフルテキストインデックスに関連付けます。

    USE [WatchReviewsMasterStoplist]
    GO
    -- Associating new custom stoplist with Full-Text index
    ALTER FULLTEXT INDEX ON [dbo].[WatchReview] SET STOPLIST = [WatchMasterStoplist]

    単語「this」を検索してカスタムストップリストを確認する

    カスタムストップリストにシステムストップリストのすべてのノイズワードが含まれているかどうかをすばやく確認できます。以前に使用したのと同じコードを実行して、「this。」という単語を検索します。

    --Run Full-Text query to Search for Noise word 'this' 
    SELECT * FROM dbo.WatchReview
    WHERE CONTAINS(Details,'this')

    この出力は空白である必要があります。

    カスタムストップリストに新しいノイズワード「Hi」を追加する

    ノイズワードを追加する必要があります「こんにちは」 新しく作成されたカスタムストップリストに。次のスクリプトを実行します:

    --Alter customer stoplist to add Hi noise word
    ALTER FULLTEXT STOPLIST WatchMasterStoplist
    ADD 'Hi' LANGUAGE 'British English';  

    結果セットは以下のとおりです。

    最終チェック

    次に、いくつかのノイズワードに対して最終的なフルテキストクエリチェックを実行します。これを、それらのノイズワードを含む元の結果セットと比較します。

    たとえば、4番目のレビュー( ReviewId で並べ替え)に焦点を当てる場合 )、これにはいくつかのノイズワードが含まれており、その結果をフルテキストクエリの結果と比較すると、ノイズワードは表示されないはずです。

    次のスクリプトを実行して、サンプルデータベースに対して最終チェックを実行します。

    USE WatchReviewsMasterStoplist
    
    -- View the record which contains fourth review 
    SELECT ReviewId
          ,[Date]
          ,Person
          ,Details
      FROM dbo.WatchReview
      where ReviewId=4
    
    --Run Full-Text	query to Search for Noise words in the fourth review
    SELECT * FROM dbo.WatchReview
    WHERE CONTAINS(Details,'"Hi" OR "this" OR "I" OR "is" OR "and"')
    and ReviewId=4

    出力は次のとおりです。

    デジタル時計のレビューを検索するためのフルテキストクエリ

    これで、ストップリストを配置して全文検索クエリを実行できます。次のT-SQLスクリプトは、デジタル時計のレビュー(サンプル)について通知します。

    USE WatchReviewsMasterStoplist
    
    --Run Full-Text query to Search for digital watch reviews sample
    SELECT * FROM dbo.WatchReview WHERE CONTAINS(Details,'digital')

    結果は以下のとおりです。

    おめでとう!ストップリストを作成および関連付ける3つの方法すべてを正常に実装しました。また、ストップリストに新しい単語を追加し、パフォーマンスを確認することも検討しました。

    それでも、3番目の方法を強くお勧めします。システムストップリストからカスタムストップリストを作成し、ノイズワードを追加して、全文検索を改善します。

    やるべきこと

    ストップリストを作成する3つの方法を十分に理解したので、次のようなテキスト分析スキルを向上させるための演習を行うことができます。

    1. この記事のように、サンプルデータベースに対してシステムストップリストからカスタムストップリストを追加します。
    2. この記事のように、サンプルデータベースに対してシステムストップリストからカスタムストップリストを作成します。
    3. この記事に慣れたら、T-SQLクエリを実行して、追加されたストップワードを確認します。

    1. UPDATEを使用したexecSQL()は更新されません

    2. SQL Server AlwaysOn(可用性グループ)のアーキテクチャとステップバイステップのインストール-4データベースの追加と削除の手順

    3. SQLServerでセッションのANSI_NULLS設定を確認する方法

    4. SQL Serverで行をランク付けするメソッド:ROW_NUMBER()、RANK()、DENSE_RANK()、およびNTILE()