[파이썬] Peewee Full-text search 기능

Peewee is a lightweight and expressive Object-Relational Mapping (ORM) library for Python. It provides an easy and elegant way to interact with databases, but one feature that is often overlooked is its built-in full-text search capability.

In this blog post, we will explore how to use Peewee’s full-text search functionality to perform powerful and efficient text searches in your Python applications.

Setting Up Peewee

To get started, we need to install Peewee. You can install it using pip:

$ pip install peewee

Once installed, we can import it in our Python script:

from peewee import *

Peewee provides the Match operator to perform full-text searches. To enable full-text search in your Peewee model, you need to define a ts_vector column in your database table.

Here’s an example of a Peewee model that includes a ts_vector column:

from peewee import *

database = SqliteDatabase('my_database.db')

class MyModel(Model):
    title = CharField()
    content = TextField()
    ts_vector = TSVectorField()

    class Meta:
        database = database

In the above example, the ts_vector column is of type TSVectorField. This column will store the preprocessed text data for full-text search.

Indexing Text Data

Before we can perform a full-text search, we need to index our text data. This is done by creating a trigger that updates the ts_vector column whenever the model is saved or updated.

Here’s an example of how to create a trigger to index the text data in our MyModel table:

database.execute_sql('''
    CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
    ON mymodel FOR EACH ROW EXECUTE PROCEDURE
    tsvector_update_trigger(ts_vector, 'pg_catalog.english', title, content)
''')

In the above example, we create a trigger called tsvectorupdate that will update the ts_vector column using the tsvector_update_trigger function. We pass the ts_vector column and the text columns title and content as arguments.

Once we have indexed our text data, we can perform full-text searches using the Match operator in Peewee.

Here’s an example of how to perform a full-text search for the term “python” in our MyModel table:

search_term = 'python'
results = MyModel.select().where(MyModel.ts_vector.match(search_term))

In the above example, we use the match method of the ts_vector column to perform the full-text search. The match method takes the search term as an argument.

Conclusion

Peewee’s built-in full-text search functionality provides a convenient way to perform efficient and powerful text searches in your Python applications. By indexing your text data and using the Match operator, you can easily implement full-text search capabilities in your Peewee models.

In this blog post, we discussed how to enable full-text search in Peewee, index text data, and perform full-text searches using the Match operator. Give it a try and enhance the search capabilities of your Python applications with Peewee!