概要 :このチュートリアルでは、FTS5仮想テーブルモジュールを使用してSQLite全文検索機能を使用する方法を学習します。
SQLite全文検索の概要
仮想テーブルはSQLiteのカスタム拡張機能です。仮想テーブルは通常のテーブルに似ています。仮想テーブルと通常のテーブルの違いは、データの取得元です。つまり、通常のテーブルを処理するときに、SQLiteはデータベースファイルにアクセスしてデータを取得します。ただし、仮想テーブルにアクセスすると、SQLiteはカスタムコードを呼び出してデータを取得します。カスタムコードには、複数のデータソースからのデータの取得などの特定のタスクを処理するロジックを指定できます。
SQLiteで全文検索を使用するには、FTS5仮想テーブルモジュールを使用します。
次のCREATEVIRTUAL TABLE ステートメントは、2つの列を持つFTS5テーブルを作成します。
CREATE VIRTUAL TABLE table_name
USING FTS5(column1,column2...);
Code language: SQL (Structured Query Language) (sql)
タイプ、制約、または PRIMARY KEYを追加できないことに注意してください CREATE VIRTUAL TABLEでの宣言 FTS5テーブルを作成するためのステートメント。これを行うと、SQLiteはエラーを発行します。
主キー列を指定せずに通常のテーブルを作成するのと同様に、SQLiteは暗黙の rowidを追加します FTS5テーブルへの列。
次の例では、 postsという名前のFTS5テーブルを作成します 2列のtitle およびbody 。
CREATE VIRTUAL TABLE posts
USING FTS5(title, body);
Code language: SQL (Structured Query Language) (sql)
通常のテーブルと同様に、 postにデータを挿入できます 次のような表:
INSERT INTO posts(title,body)
VALUES('Learn SQlite FTS5','This tutorial teaches you how to perform full-text search in SQLite using FTS5'),
('Advanced SQlite Full-text Search','Show you some advanced techniques in SQLite full-text searching'),
('SQLite Tutorial','Help you learn SQLite quickly and effectively');
Code language: SQL (Structured Query Language) (sql) そして、それに対してデータをクエリします:
SELECT * FROM posts;
Code language: SQL (Structured Query Language) (sql)
全文検索を使用したデータのクエリ
これらの3つの方法のいずれかを使用して、FTS5テーブルに対してフルテキストクエリを実行できます。
まず、 MATCHを使用します SELECTステートメントのWHERE句の演算子。たとえば、 fts5という用語を持つすべての行を取得するには 、次のクエリを使用します:
SELECT *
FROM posts
WHERE posts MATCH 'fts5';
Code language: SQL (Structured Query Language) (sql)
次に、等しい( = ) WHEREの演算子 SELECTの句 声明。次のステートメントは、上記のステートメントと同じ結果を返します。
SELECT *
FROM posts
WHERE posts = 'fts5';
Code language: SQL (Structured Query Language) (sql) 第三に、テーブル値関数の構文を使用します。このようにして、検索語を最初のテーブル引数として使用します。
SELECT *
FROM posts('fts5');
Code language: SQL (Structured Query Language) (sql)
デフォルトでは、FTS5は大文字と小文字を区別しません。 fts5という用語を扱います FTS5 およびFts5 同じです。
検索結果を関連性の高いものから低いものへと並べ替えるには、次のようにORDERBY句を使用します。
SELECT *
FROM posts
WHERE posts MATCH 'text'
ORDER BY rank;
Code language: SQL (Structured Query Language) (sql)
フルテキストクエリ構文の使用
全文検索クエリはフレーズで構成され、各フレーズは1つ以上のトークンの順序付きリストです。次の例のように、「+」演算子を使用して2つのフレーズを連結できます。
"learn SQLite"
"learn + SQLite"
Code language: SQL (Structured Query Language) (sql) FTS5は、フレーズの作成に使用されたトークンのシーケンスと一致するトークンのサブシーケンスがドキュメントに少なくとも1つ含まれている場合に、ドキュメントがフレーズと一致するかどうかを判断します。
次のクエリは、検索語 Learn SQLiteに一致するすべてのドキュメントを返します。 :
SELECT *
FROM posts
WHERE posts MATCH 'learn SQLite';
Code language: SQL (Structured Query Language) (sql)
プレフィックス検索
アスタリスク(*)をプレフィックストークンとして使用できます。フレーズにアスタリスク(*)が含まれている場合、そのフレーズで始まるトークンを含むすべてのドキュメントと一致します。たとえば、search *は、検索、検索、検索などと一致します。次の例を参照してください。
SELECT *
FROM posts
WHERE posts = 'search*';Code language: SQL (Structured Query Language) (sql)
ブール演算子
ブール演算子を使用できます(例: NOT ) 、またはコード> 、または AND クエリを組み合わせる。
- q1 AND q2:q1とq2の両方のクエリが一致する場合に一致します。
- q1またはq2:クエリq1またはq2のいずれかが一致する場合に一致します。
- q1 NOT q2:クエリq1が一致し、q2が一致しない場合に一致します。
たとえば、 learnに一致するドキュメントを取得するには フレーズですが、 FTS5と一致しません フレーズ、あなたは NOTを使用します 次のように演算子:
SELECT *
FROM posts
WHERE posts MATCH 'learn NOT text';
Code language: SQL (Structured Query Language) (sql)
いずれかのフレーズに一致するドキュメントを検索するにはlearn またはtext 、 ORを使用します 次の例のように演算子:
SELECT *
FROM posts
WHERE posts MATCH 'learn OR text';
Code language: SQL (Structured Query Language) (sql)
SQLiteと検索の両方に一致するドキュメントを見つけるには、 ANDを使用します 以下に示す演算子:
SELECT *
FROM posts
WHERE posts MATCH 'sqlite AND searching';
Code language: SQL (Structured Query Language) (sql)
演算子の優先順位を変更するには、括弧を使用して式をグループ化します。例:
SELECT *
FROM posts
WHERE posts MATCH 'search AND sqlite OR help';
Code language: SQL (Structured Query Language) (sql)
このステートメントは、 searchに一致するドキュメントを返します およびsqlite またはhelp 。 searchに一致するドキュメントを検索するには およびsqlite またはhelp 、次のように括弧を使用します:
SELECT *
FROM posts
WHERE posts MATCH 'search AND (sqlite OR help)';
Code language: SQL (Structured Query Language) (sql)
組み込みの補助機能
SQLiteには、FTS5テーブルのフルテキストクエリ内で使用できる3つの組み込み補助関数が用意されています。
-
bm25()現在の一致の精度を表す値を返します。値が小さいほど、一致が良好であることを意味します。 -
heightlight()補助関数は、指定されたマークアップで囲まれた検索語を含むテキストのコピーを返します。例:検索語 -
snippet()含まれる検索用語の数を最大化するために、テキストの短いフラグメントを選択します。
たとえば、次のクエリでは、highlight()関数を使用して、タグを使用して検索語を装飾します。
SELECT highlight(posts,0, '<b>', '</b>') title,
highlight(posts,1, '<b>', '</b>') body
FROM posts
WHERE posts MATCH 'SQLite'
ORDER BY rank;
Code language: SQL (Structured Query Language) (sql)
このチュートリアルでは、FTS5仮想テーブルモジュールを介してSQLite全文検索機能を使用する方法を学習しました。