PostgreSQLのフルテキスト検索の実装

この記事では、PostgreSQLのフルテキスト検索の実装について詳しく解説します。具体的なPythonコード例とその詳細な解説、さらに応用例も含めています。

目次

PostgreSQLフルテキスト検索の基本

PostgreSQLでは、`tsvector`と`tsquery`といったデータ型と関数を用いて、高度なテキスト検索が可能です。このセクションでは、基本的な概念と設定について説明します。

tsvectorとtsquery

`tsvector`は、テキストデータを解析して生成される「単語」のベクトルです。
`tsquery`は、検索クエリを形成するためのデータ型です。

# PythonでのPostgreSQLフルテキスト検索の例(Psycopg2を用いた場合)
import psycopg2

# データベースに接続
conn = psycopg2.connect("dbname=test user=postgres")
cursor = conn.cursor()

# フルテキスト検索
cursor.execute("SELECT title FROM books WHERE to_tsvector('english', title) @@ to_tsquery('english', 'NLP');")
results = cursor.fetchall()

for result in results:
    print(result)

# データベースから切断
cursor.close()
conn.close()

PythonでのPostgreSQLフルテキスト検索実装

PythonでPostgreSQLのフルテキスト検索を実装するには、通常`psycopg2`といったライブラリを用います。以下に具体的なコード例とその解説を示します。

環境の設定

まずは、`psycopg2`をインストールします。

# インストール
pip install psycopg2

基本的な検索クエリの作成

# 基本的な検索クエリの作成
import psycopg2

def search_books(keyword):
    # データベース接続
    conn = psycopg2.connect("dbname=test user=postgres")
    cursor = conn.cursor()

    # フルテキスト検索
    cursor.execute(f"SELECT title FROM books WHERE to_tsvector('english', title) @@ to_tsquery('english', %s);", (keyword,))
    results = cursor.fetchall()

    for result in results:
        print(result[0])

    # 切断
    cursor.close()
    conn.close()

応用例

AND検索とOR検索

フルテキスト検索ではAND検索とOR検索も可能です。具体的なコードは以下の通りです。

# AND検索とOR検索
def search_books_advanced(keyword1, keyword2):
    conn = psycopg2.connect("dbname=test user=postgres")
    cursor = conn.cursor()

    # AND検索
    cursor.execute(f"SELECT title FROM books WHERE to_tsvector('english', title) @@ to_tsquery('english', %s & %s);", (keyword1, keyword2))
    results = cursor.fetchall()
    print("AND検索の結果:")
    for result in results:
        print(result[0])

    # OR検索
    cursor.execute(f"SELECT title FROM books WHERE to_tsvector('english', title) @@ to_tsquery('english', %s | %s);", (keyword1, keyword2))
    results = cursor.fetchall()
    print("OR検索の結果:")
    for result in results:
        print(result[0])

    cursor.close()
    conn.close()

ランキングの付与

検索結果にランキングを付与することもできます。

# ランキングの付与
def search_books_ranked(keyword):
    conn = psycopg2.connect("dbname=test user=postgres")
    cursor = conn.cursor()

    # ランキングを付与
    cursor.execute(f"SELECT title, ts_rank_cd(to_tsvector('english', title), to_tsquery('english', %s)) as rank FROM books WHERE to_tsvector('english', title) @@ to_tsquery('english', %s) ORDER BY rank DESC;", (keyword, keyword))
    results = cursor.fetchall()

    for result in results:
        print(f"{result[0]}: {result[1]}")

    cursor.close()
    conn.close()

まとめ

この記事では、PostgreSQLのフルテキスト検索の基本からPythonでの具体的な実装、さらに応用例までを網羅的に解説しました。これらの情報を活用して、PostgreSQLを用いた高度なテキスト検索を行ってみてください。

コメント

コメントする

目次