# フルテキスト検索

注意

このガイドは、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形式で利用できます。このデータセットは、ローカルのダウンロードを必要とせずに、S3から直接MyScaleにインポートされます。

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

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 テキストにトークナイズを行わず、テキスト全体を1つのトークンとして扱います
simple テキストを非アルファベット文字で分割します
stem ステミングトークナイザで、複数の言語をサポートし、単語をステム形式に変換し、単語の時制を無視することができます
whitespace スペース、タブ、改行などのホワイトスペース文字でテキストを分割します
ngram 指定されたn-gramの長さに基づいてテキストを分割します
chinese 中国語のテキストをトークナイズし、内部的にはjiebaトークナイゼーションライブラリを使用します

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

rawstemトークナイザは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ライブラリを使用しており、複雑な自然言語クエリをサポートしています。詳細については、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"(大文字小文字を区別しない)に関連しており、同時に"African"または"Paris"のいずれかを含んでいることがわかります。

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

# TextSearchパラメータの説明

注意

パラメータは、DBバージョンv1.6.3以降でのみ利用可能です。

以下は、TextSearch()のパラメータの詳細な説明です。

パラメータ デフォルト値 候補の値 説明
enable_nlq true true, false このパラメータは、自然言語クエリの解析を有効にするかどうかを決定します。trueに設定すると、FTSはユーザーの入力を自然言語クエリとして解釈します。falseに設定すると、FTSは標準のtermsクエリを使用してユーザーの入力を解析します。
operator OR OR, AND このパラメータは、各クエリの条件(トークナイズされたトークンごと)を組み合わせるための論理演算子を指定します。ORを選択すると、いずれかの条件に一致する結果が返されます。ANDを選択すると、すべての条件に一致する結果が返されます。

# 使用例

SELECT
    id,
    title,
    body,
    TextSearch('enable_nlq=true', 'operator=OR')(body, 'mammoth AND Europe') AS score
FROM default.wiki_abstract_text
ORDER BY score DESC
LIMIT 5

結果に基づいて、各行には"mammoth"と"Europe"の両方が含まれており、自然言語クエリを有効にするロジックに一致していることがわかります。

注意:検索結果は2つだけです。SQLクエリで制限を5に設定していますが、テーブル内のエントリのうち条件を満たすのは2つだけです。

id title body score
3171491 Leymus racemosus Leymus racemosus is a species of perennial wild rye known by the common name mammoth wild rye. It is native to southeastern and eastern Europe, Middle Asia, Caucasus, Siberia, China, Mongolia, New Zealand, and parts of North America. 10.067189
2719784 Venus of Hohle Fels The Venus of Hohle Fels (also known as the Venus of Schelklingen; in German variously ) is an Upper Paleolithic Venus figurine made of mammoth ivory that was unearthed in 2008 in Hohle Fels, a cave near Schelklingen, Germany. It is dated to between 35,000 and 40,000 years ago, belonging to the early Aurignacian, at the very beginning of the Upper Paleolithic, which is associated with the earliest presence of Cro-Magnon in Europe. 6.9371195
SELECT
    id,
    title,
    body,
    TextSearch('enable_nlq=false', 'operator=OR')(body, 'Atlantic AND Europe') AS score
FROM default.wiki_abstract_text
ORDER BY score DESC
LIMIT 5

自然言語クエリを無効にした場合、結果はもはや"Atlantic"と"Europe"の両方が同時に表示されることを保証しません。オペレータのデフォルト値がORであるため、"Atlantic"、"AND"、または"Europe"のいずれかを含む行が検索結果に含まれます。

id title body score
3046233 And And or AND may refer to: 13.748591
5050203 A N D (Tricot album) And}} 13.047318
357499 Andromeda I And 1}} 12.335348
678064 Omicron Andromedae And 1}} 12.335348
3716928 Platycheirus ramsaerensis Platycheirus ramsaerensis is a species of hoverfly. It is found along the parts of northern Europe that face the Atlantic. 11.937536

# 文字列検索のための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: Sun Jun 30 2024 09:15:57 GMT+0000