# フルテキスト検索

注意

このガイドは、DBバージョン1.5.0以降にのみ適用されます。

従来のデータベースのテキスト検索機能であるLIKEILIKEのような演算子は、長年にわたって基本的なものでした。しかし、これらの方法はいくつかの制限により、現代の情報検索システムのニーズに対応できません。

  • 言語サポートの不足: 伝統的な方法では、言語の微妙なニュアンスに対応するのが難しく、単語の派生(例:「satisfies」と「satisfy」)を認識できず、検索結果が不完全または不正確になることがあります。ORを使用して手動でバリエーションを検索することは可能ですが、この方法は手間がかかりエラーが発生しやすいです。
  • 結果のランキングの欠如: 検索結果のランキングを行わないと、数千件の一致するデータを処理するのが非効率になります。
  • パフォーマンスの問題: インデックスのサポートがないため、検索ごとにすべてのドキュメントを処理する必要があり、パフォーマンスが低下します。

これらの課題に対処するために、MyScaleはTantivy (opens new window)ライブラリによって駆動される新しいインデックスタイプであるFTSインデックス(フルテキスト検索インデックス)を導入しました。FTSインデックスはBM25インデックスアルゴリズムをサポートしており、効率的かつ関連性の高い検索結果を可能にします。この統合により、MyScaleのフルテキスト検索機能が強化され、全体的なパフォーマンスが向上します。

# チュートリアルの概要

このチュートリアルでは、FTSインデックスを使用した3つのタイプの検索実験を実施する方法について説明します。

MyScaleのFTSインデックスのイラスト

開始する前に、MyScaleクラスターが設定されていることを確認してください。セットアップ手順については、クイックスタートガイド (opens new window)を参照してください。

# データセットの概要

ウィキペディアの要約データセット (opens new window)を使用します。このデータセットには560万以上のレコードが含まれており、Parquet形式で利用できます。このデータセットは、ローカルのダウンロードを必要とせずに、直接MyScaleにS3からインポートされます。

以下の表は、このデータセットの内容を簡単に説明しています。

id body title url
... ... ... ...
77 Jake Rodkin is an American .... and Puzzle Agent. Jake Rodkin https://en.wikipedia.org/wiki/Jake_Rodkin (opens new window)
78 Friedlandpreis der Heimkehrer is ... of Germany. Friedlandpreis der Heimkehrer https://en.wikipedia.org/wiki/Friedlandpreis_der_Heimkehrer (opens new window)
... ... ... ...

# テーブルの作成とデータの挿入

次のSQLコマンドを使用して、en_wiki_abstractテーブルをMyScaleに作成します。

CREATE TABLE default.en_wiki_abstract(
    `id` UInt64,
    `body` String,
    `title` String,
    `url` String,
)
ENGINE = MergeTree
ORDER BY id;

次に、S3からデータセットをインポートします。データのインポートが完了するまでお待ちください。

INSERT INTO default.en_wiki_abstract SELECT * FROM s3('https://myscale-datasets.s3.ap-southeast-1.amazonaws.com/wiki_abstract_5m.parquet','Parquet');

テーブルに5,648,453行のデータが含まれていることを確認します。

SELECT count(*) FROM default.en_wiki_abstract;

出力:

count()
5648453

検索パフォーマンスを向上させるために、テーブルを最適化して単一のデータパートに統合することができます。このステップはオプションです。

OPTIMIZE TABLE default.en_wiki_abstract FINAL;

次のSQLステートメントを実行して、このテーブルのデータが1つのパートに圧縮されたかどうかを確認します。

SELECT COUNT(*) FROM system.parts
WHERE table = 'en_wiki_abstract' AND active = 1;

データが1つに圧縮されている場合、このSQLステートメントは次の結果セットを返します。

count()
1

# FTSインデックスのパラメータの理解

MyScaleはさまざまなトークナイザをサポートしており、それぞれ異なるシナリオに適しています。FTSインデックスを作成する際には、トークナイザのJSON構成を使用してカスタマイズすることができます。

TIP

FTSインデックスのパラメータには、有効なJSON文字列を指定してください。

-- 例1: パラメータを指定せずにインデックスを作成する(デフォルトの構成を使用)
ALTER TABLE [table_name] ADD INDEX [index_name] [column_name]
TYPE fts;
-- 例2: デフォルトのトークナイザを使用してインデックスを作成する
ALTER TABLE [table_name] ADD INDEX [index_name] [column_name]
TYPE fts('{"[column_name]":{"tokenizer":{"type":"default"}}}');
-- 例3: ステムトークナイザを使用し、ストップワードを適用する
ALTER TABLE [table_name] ADD INDEX [index_name] [column_name]
TYPE fts('{"[column_name]":{"tokenizer":{"type":"stem", "stop_word_filters":["english"]}}}');

以下の表は、FTSインデックスでサポートされているトークナイザの種類を示しています。

トークナイザの種類 説明
default デフォルトのトークナイザで、非アルファベット文字でテキストを分割し、大文字小文字を区別しません
raw テキストにトークナイズを行わず、テキスト全体を単一のトークンとして扱う生のトークナイザ
simple テキストを非アルファベット文字で分割するシンプルなトークナイザ
stem ステミングトークナイザで、複数の言語をサポートし、単語をそのステム形式に変換し、単語の時制を無視することができます
whitespace スペース、タブ、改行などのホワイトスペース文字でテキストを分割するホワイトスペーストークナイザ
ngram 指定されたn-gramの長さに基づいてテキストを分割するN-gramトークナイザ
chinese 中国語のテキストをトークナイズするためのトークナイザで、内部的にはjiebaトークナイゼーションライブラリを使用します

# 一般的なトークナイザのパラメータ

rawおよびstemトークナイザはstore_docパラメータのみをサポートしており、他のトークナイザは以下の一般的なパラメータに加えて、さらに多くのパラメータをサポートしています。

パラメータ名 デフォルト値 説明
store_doc boolean false 元のドキュメントを保存するかどうか。現在は有効にすることはお勧めしません
length_limit number 40 トークン化されたトークンの最大長
case_sensitive boolean false トークナイズが大文字と小文字を区別するかどうか

上記の一般的なパラメータに加えて、ほとんどのトークナイザはさらに追加のパラメータをサポートしています。

# simplestemwhitespaceトークナイザ

パラメータ名 デフォルト値 説明
stop_word_filters string[] [] ストップワードフィルターで、トークナイズ時にどの言語のストップワードを破棄するかを指定します。有効な言語は["danish", "dutch", "english", "finnish", "french", "german", "hungarian", "italian", "norwegian", "portuguese", "russian", "spanish", "swedish"]です

# stemトークナイザ

パラメータ名 デフォルト値 説明
stem_languages string[] [] ステミングに使用する言語。英語の場合、トークナイズ時に単語の時制を無視することができます。ステムトークナイザでサポートされている言語は["arabic", "danish", "dutch", "english", "finnish", "french", "german", "greek", "hungarian", "italian", "norwegian", "portuguese", "romanian", "russian", "spanish", "swedish", "tamil", "turkish"]です

# ngramトークナイザ

パラメータ名 デフォルト値 説明
min_gram number 2 グラムの最小数
max_gram number 3 グラムの最大数
prefix_only boolean false 単語の接頭辞からのn-gramのみを抽出するかどうか

# chineseトークナイザ

中国語のトークナイザでは、cang-jie (opens new window)が基礎となる実装として使用されます。

パラメータ名 デフォルト値 説明
jieba string "default" "default"はjieba辞書を使用することを意味し、"empty"はトークナイズのために組み込みのjieba辞書を使用しないことを意味します。有効な値は"default"または"empty"です
mode string "search" 中国語のトークナイズモード。有効な値は "all"、"default"、"search"、または "unicode" です。各モードの違いについては、cang-jie/options.rs (opens new window)を参照してください
hmm boolean false HMMを有効にするかどうか

上記は、MyScale FTSインデックスのトークナイザのパラメータについての詳細な説明です。FTSインデックスを作成する際には、最適なトークナイザタイプを選択し、そのパラメータを設定して検索パフォーマンスと結果を向上させることができます。

# FTSインデックスの作成

適切なトークナイザを使用してFTSインデックスをカスタマイズし、検索パフォーマンスを最適化します。たとえば、英語のストップワードを使用したstemトークナイザを使用することで、単語のルート形式に焦点を当てることで検索の精度を向上させることができます。

ALTER TABLE default.en_wiki_abstract
ADD INDEX body_idx (body)
TYPE fts('{"body":{"tokenizer":{"type":"stem", "stop_word_filters":["english"]}}}');

通常、FTSインデックス(ClickHouseのスキップインデックスに類似)は新しく挿入されたデータにのみ適用されるため、インデックスを追加するだけでは既存のデータには影響しません。既存のデータをインデックス化するには、次のステートメントを使用します。

ALTER TABLE default.en_wiki_abstract MATERIALIZE INDEX body_idx;

# ドキュメントのBM25ランキングを使用した検索

注意

TextSearch()の最初の実行は遅くなる場合があります。なぜなら、FTSインデックスをロードする必要があるからです。

以下の例では、TextSearch()関数の使用方法を示しています。この例では、"non-profit institute in Washington"に最も関連性の高いトップ10のドキュメントを返します。関連性を測定する指標は、TextSearch()関数が返すBM25スコアです。スコアが高いほど関連性が高いです。

SELECT
    id,
    title,
    body,
    TextSearch(body, 'non-profit institute in Washington') AS score
FROM default.en_wiki_abstract
ORDER BY score DESC
LIMIT 5;

結果から、body列の各行のテキストが検索フレーズ"non-profit institute in Washington"に関連していることがわかります。

id title body score
3400768 Drug Strategies Drug Strategies is a non-profit research institute located in Washington D.C. 24.457561
872513 Earth Policy Institute Earth Policy Institute was an independent non-profit environmental organization based in Washington, D.C. 22.730673
895248 Arab American Institute Founded in 1985, the Arab American Institute is a non-profit membership organization based in Washington D.C. 21.955559
1950599 Environmental Law Institute The Environmental Law Institute (ELI) is a non-profit, non-partisan organization, headquartered in Washington, D.C. 21.231567
2351478 Public Knowledge Public Knowledge is a non-profit Washington, D.C. 20.742344

# 自然言語クエリの活用

MyScaleは、フルテキスト検索(FTS)インデックスのためにTantivyライブラリを使用しており、複雑な自然言語クエリをサポートしています。詳細については、公式ドキュメント (opens new window)を参照してください。

以下は、ANDORを使用した複数の条件の組み合わせクエリの例です。ニューヨーク、アフリカ、またはパリに関連する人類学のトピックを検索したい場合、SQLクエリは次のようになります。

SELECT
    id,
    title,
    body,
    TextSearch(body, 'Anthropological AND ("New York City" OR African OR Paris)') AS score
FROM default.en_wiki_abstract
ORDER BY score DESC
LIMIT 5;

検索結果から、各行のテキストには「Anthropological」という単語(大文字小文字を区別しない)が含まれており、ANDステートメントの左側の条件を満たしています。同時に、各結果には「New York City」、「African」または「Paris」のいずれかが少なくとも1つ含まれており、ANDステートメントの右側の条件に一致しています。

id title body score
2826913 African Anthropologist African Anthropologist is the journal of the Pan African Anthropological Association (PAAA). 20.131313
3905943 Tunnel People Tunnel People is an anthropological-journalistic account describing an underground homeless community in New York City. It is written by war photographer and anthropologist Teun Voeten and was published by PM Press in 2010. 13.759308
3790627 Les Accords de Bella Les Accords de Bella is a 2007 anthropological documentary film directed by David Constantin. It was selected by the African Film Festival of Cordoba - FCAT. 12.769518
4488199 Naparay Naparay, in African anthropological study, is a non-linear conception of human life held by some West African peoples such as the Yoruba. Similar to reincarnation, naparay holds that lives are cyclic and attributes of previous lives may carry over to a new life. 11.682068
1725559 Gradhiva Gradhiva is an anthropological and museological journal, founded in 1986 by the poet and social scientist Michel Leiris and by the anthropologist Jean Jamin. It is since 2005 published by the Musée du Quai Branly in Paris. 11.135916

# 文字列検索のためのSkipIndexの活用

以下のClickHouseの組み込み関数を使用して文字列検索を行う場合、すべての関数はFTSインデックスを介してフィルタリングされます: equalsnotEqualslikenotLikehasTokenhasTokenOrNullinnotInstartsWithendsWithhasmapContainsmultiSearchAny

例 - 1 キーワード検索を行います。単語「Tsinghua」を含む記事を検索します。

SELECT count(*)
FROM default.en_wiki_abstract
WHERE hasToken(body, 'Tsinghua');

出力:

count()
81

例 - 2 複数のキーワードを検索し、Eiffel Towerを含み、かつParisを含まない記事を見つけます。

SELECT count(*)
FROM default.en_wiki_abstract
WHERE (NOT hasToken(body, 'Paris')) AND multiSearchAny(body, ['Eiffel', 'Tower'])

出力:

count()
2828

例 - 3 複雑な条件の組み合わせクエリを実行し、異なる名前、場所、学問分野などを組み合わせます。

SELECT count(*)
FROM default.en_wiki_abstract
WHERE (NOT multiSearchAny(body, ['Montessori', 'postulated', 'Rooney'])) AND (hasToken(body, 'Patsy') OR hasToken(body, 'Anthropological'))

出力:

count()
204

# 結論

このガイドでは、MyScaleを使用して高度なテキスト検索機能を活用する方法について説明しました。FTSインデックスの設定から自然言語クエリの実行まで、構造化されていないテキストデータを効率的に管理および検索することができます。これにより、MyScaleの堅牢なテキスト処理機能が示されます。

Last Updated: Mon Apr 29 2024 08:06:28 GMT+0000