概要 :このチュートリアルでは、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全文検索機能を使用する方法を学習しました。