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

ストップワードとストップリストを使用してSQLServer全文検索(FTS)を改善する方法

    現在の記事はストップワードとストップリストの使用法についてです。目的は、ストレージとパフォーマンスの観点から全文検索をより効率的にすることです。さらに、この記事の読者は、ストップワードとストップリストを使用した全文検索の実装のウォークスルーを取得します。

    この記事では、全文検索を正確に保ち、​​ノイズワードを回避するためのストップワードとストップリストの重要性も強調しています。

    ストップワードとストップリストを理解する

    まず、ストップワードとストップリストの本質を明確にしましょう。次に、それらを使用して全文検索を改善します。

    ストップリスト

    ストップリストは、その名前が示すように、ストップワードのリストです。全文検索に関連付けられている場合、ストップリストは意味のない単語や用語を除外できるため、検索結果が向上します。

    ストップワード

    ストップワードは、文法的に重要であるにもかかわらず、全文検索でマイナーな役割を持つ単語です。したがって、ストップワードは全文検索の観点からは必須ではありません。

    Microsoftのドキュメントによると、ストップワードは特定の言語で何らかの意味を持つ単語である場合もあれば、言語的価値のないトークンである場合もあります。どちらの場合も、全文検索には役に立ちません。

    ストップワードの例

    以下は、(イギリス/アメリカ)英語のストップワードです:

    • as
    • at
    • be
    • なぜなら
    • しました

    上記の単語は全文検索に寄与しないため、完全な文を理解する上で重要であるにもかかわらず、ストップワードです。

    システムストップリスト

    イギリス英語を含むサポートされている各言語には、特定の要件に応じて変更できるデフォルトまたはシステムのストップリストがあります。

    カスタムストップリスト

    ユーザーは、システムストップリストを使用して、または最初から、独自の/カスタムストップリストを作成できます。ノイズのある単語が全文検索結果の一部になるのを防ぐのに役立ちます。

    言語とストップリスト

    全文検索は多くの異なる言語をサポートしています。サポートされている各言語には、デフォルトで少なくとも1つのシステムストップリストがあります。ただし、システムとカスタムの両方のストップリストを含め、どの言語にも複数のストップリストが存在する可能性があります。

    サポートされている言語のリスト

    全文検索で使用されるサポートされているすべての言語のリストをすばやく確認できます。このために、次のT-SQLスクリプトを実行します。

    -- List of Full-Text Search supported languages
    SELECT ftl.lcid,ftl.name FROM sys.fulltext_languages ftl

    結果は次のとおりです。

    SQL Server 2016インスタンスでのクエリは、合計53の言語を返します。

    全文検索でのストップワードとストップリストの使用

    次に、ユーザーが定義したストップワードのストップリストを作成する実践的な体験をします。次に、ウォークスルーとして全文検索に使用します。リアルタイムのシナリオのようになります。

    前提条件

    まず、ウォークスルーを正しく実装するには、次の要件を確認する必要があります。

    • 全文検索の基本を理解している
    • SQLServerで全文検索を実装する機能
    • 使用する予定のSQLインスタンスで有効/インストールされている全文検索オプションの存在

    これらの前提条件を確認するには、T-SQLスクリプトに既に精通している場合は、以下の記事を参照してください。

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

    全文検索のステータスを確認する

    次のクエリを実行して、SQLインスタンスに全文検索がインストールされているかどうかを確認します。

    -- Is Full-Text Search installed then 1 or 0
    SELECT fulltextserviceproperty('IsFulltextInstalled') as [Full-Text Search]

    上記のスクリプトの結果は、次のように1を返すはずです。

    1以外の番号を取得している場合は、上記の記事をもう一度参照してください。

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

    まず、 WatchReviewsStoplistという名前のサンプルデータベースを設定する必要があります 。以下のスクリプトを使用してください:

    -- Create WatchReviewsStoplist database
    CREATE DATABASE WatchReviewsStoplist;
    GO
    
    -- Connect to the sample database
    USE WatchReviewsStoplist
    
    -- (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-01-01 00:00:00', N'Atif', 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-01-02 00:00:00', N'Qasim', 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-01-03 00:00:00', N'Martin', N'Hi, I have just purchased this Casio black digital watch which is excellent and has features like alarm, stopwatch, date and timer. ')
    INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (4, N'2020-01-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-01-11 00:00:00', N'Sarah', 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

    サンプルデータベースを確認する

    次のT-SQLスクリプトを実行して、サンプルデータベースのテーブルの内容を表示します。

    -- Check sample database
    SELECT wr.ReviewId,wr.Person,wr.Details FROM dbo.WatchReview wr

    出力は次のとおりです。

    ストップリストシナリオ

    開発チームに、顧客のレビューの全文検索を改善するように依頼したと仮定します。彼らはノイズワードを除外することによってそれを行うべきです。このように、全文検索は効率的であり、焦点も絞られています。

    これらの要件を満たすには、最初に全文検索を設定する必要があります。これは、次のアクションを実行することを意味します。

    • フルテキストカタログを作成する
    • 空のカスタムまたはユーザー定義のストップリストを作成する
    • フルテキストインデックスを作成する

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

    次のスクリプトを使用してフルテキストカタログを作成します。

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

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

    次のスクリプトを使用して、空のカスタムストップリストを作成します。

    -- Create empty custom stoplist
    CREATE FULLTEXT STOPLIST [WatchReviewStoplist];
    GO  

    カスタムストップリストが作成されました。

    フルテキストインデックスの作成

    最後に、英国英語の[詳細]列にフルテキストインデックスを作成します。以前に作成したカスタムストップリストを指します。このアクションには、次のT-SQLスクリプトを使用します。

    -- Create Full-Text index pointing to the previously created Stoplist
    CREATE FULLTEXT INDEX ON dbo.WatchReview(Details LANGUAGE [British English]) 
       KEY INDEX PK_WatchReview  
       WITH STOPLIST = WatchReviewStoplist;  
    GO  

    顧客に優れた時計を評価させるためのフルテキストクエリ

    次のフルテキストクエリを実行して、どの製品(時計)が顧客から優れた評価を得たかを調べます。

    --Search customer reviews where the product was rated excellent
    SELECT * FROM dbo.WatchReview
    WHERE CONTAINS(Details,'excellent') 

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

    黒のデジタル時計にお客様から高い評価をいただいていることがわかります。したがって、レビューに基づいて最高の製品を知っており、全文検索が正常に機能することを理解しています。

    それでも、5行のテーブルで無視する可能性のある懸念はほとんどありませんが、迅速に対処すれば、比較的大きな結果セットでパフォーマンスとストレージのメリットを得ることができます。

    フルテキストクエリでノイズワード「Hi」を検索

    フルテキストインデックスには多くのノイズワードが添付されています。すぐに、彼らは負担になる可能性があります。さらに、検索には使用できません。

    ノイズワードがこんにちはかどうかを確認しましょう 除外する方がよいため、全文検索結果に表示されます。

    次のようにフルテキストクエリを実行します。

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

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

    返された結果は、「Hi」という単語が全文検索結果の一部であることを示しています。したがって、それを除外する必要があります。これは検索には無意味であり、分析には役立ちません。

    ストップリストを変更してストップワードこんにちはを追加

    ストップワードを追加しますこんにちは カスタムストップリストを変更して、全文検索でインデックスを作成できず、全文クエリで返されないようにして、スペースを節約し、検索を改善します。

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

    ストップワードとして追加した後、ノイズワード「Hi」を再度検索します

    ストップリストに追加した後、ノイズワードHiを検索します:

    --Search Noise word 'Hi' after it has been added as a stopword
    SELECT * FROM dbo.WatchReview
    WHERE CONTAINS(Details,'Hi')

    出力は次のとおりです。

    追加されたストップワードを確認する

    いつでも、ストップリストに追加されたストップワードを確認できます。このために次のスクリプトを実行します:

    -- Check added stopwords 
    SELECT * FROM sys.fulltext_stopwords

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

    おめでとう!ストップリストが正常に作成され、ストップワードが追加されました。このようにして、パフォーマンスとストレージの両方で全文検索をより効率的にします。

    やるべきこと

    ストップリストを作成してストップワードを追加できるようになったので、次のことを試してスキルをさらに向上させてください。

    • このウォークスルーで作成したカスタムストップリストに、ノイズワードとして「I」、「this」、「just」、「just」という単語を追加します。
    • ウォークスルーの最後に指定したスクリプトを実行して、追加されたストップワードを確認します。

    1. SQLite Node.js

    2. AzureDataStudioを使用してSQLServerデータベースを作成する

    3. PostgreSQLでクエリを実行するために二重引用符を省略します

    4. MAX()–MySQLの列の最大値を見つける