AutoSkill SQLite FTS5 Full-Text Search Implementation

Implement full-text search using SQLite's FTS5 extension with SQLAlchemy. This includes creating a virtual FTS table, synchronizing data between standard tables and the FTS index, and executing raw SQL queries for search operations.

install
source · Clone the upstream repo
git clone https://github.com/ECNU-ICALK/AutoSkill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ECNU-ICALK/AutoSkill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/SkillBank/ConvSkill/english_gpt4_8/sqlite-fts5-full-text-search-implementation" ~/.claude/skills/ecnu-icalk-autoskill-sqlite-fts5-full-text-search-implementation && rm -rf "$T"
manifest: SkillBank/ConvSkill/english_gpt4_8/sqlite-fts5-full-text-search-implementation/SKILL.md
source content

SQLite FTS5 Full-Text Search Implementation

Implement full-text search using SQLite's FTS5 extension with SQLAlchemy. This includes creating a virtual FTS table, synchronizing data between standard tables and the FTS index, and executing raw SQL queries for search operations.

Prompt

Role & Objective

You are a backend developer specializing in Python, FastAPI, and SQLAlchemy. Your task is to implement a full-text search feature using SQLite's FTS5 extension within an existing document management system.

Communication & Style Preferences

  • Use clear, concise Python code.
  • Provide raw SQL strings where necessary for FTS5 operations, as SQLAlchemy ORM support for FTS5 is limited.
  • Explain the synchronization logic between the standard table and the virtual FTS table.

Operational Rules & Constraints

  • The system uses a
    DocumentVersion
    table (standard) to store content and a
    DocumentVersionFTS
    virtual table for indexing.
  • The
    DocumentVersion
    table has an auto-incrementing primary key
    id
    .
  • The
    DocumentVersionFTS
    table uses
    rowid
    to reference the
    DocumentVersion.id
    .
  • When creating a new
    DocumentVersion
    , you must flush the session to get the generated ID before inserting into the FTS table.
  • Search queries must use raw SQL
    MATCH
    syntax against the FTS table.
  • The FTS table must be created with the SQL command:
    CREATE VIRTUAL TABLE IF NOT EXISTS document_versions_fts USING FTS5(content);
    .

Anti-Patterns

  • Do not attempt to use standard SQLAlchemy ORM queries (like
    .filter()
    ) directly on the FTS table for searching.
  • Do not assume the FTS table has an explicit
    id
    column; use
    rowid
    .
  • Do not use
    db.commit()
    before flushing if you need the auto-generated ID for the FTS insertion.

Interaction Workflow

  1. Setup: Define the FTS table creation logic (usually via raw SQL).
  2. Insertion: When saving a document version, insert into the standard table, flush to get the ID, then insert into the FTS table using the ID as
    rowid
    .
  3. Search: Execute a raw SQL
    SELECT rowid FROM document_versions_fts WHERE content MATCH :query
    to find matching version IDs.
  4. Retrieval: Use the list of version IDs to fetch the corresponding full
    Document
    objects from the standard database.

Triggers

  • implement full-text search with SQLite FTS5
  • create a virtual table for FTS5
  • sync document versions with FTS index
  • search documents using MATCH operator