3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

peeweeで全文検索を行った話(MySQL)

Last updated at Posted at 2021-03-31

#Peeweeとは
peeweeはPython用のORMです。
扱えるデータベースが豊富で利点も多いですがなにぶん公式ドキュメント以外の参考資料が少ない印象です

#Peeweeで全文検索をやってみたい
現在関わっているプロジェクトであいまい検索を行いたいとの話が出てきた為、peeweeの資料を読み漁って
やり方を探してみましたが、いまいちわかりずらいです。
その為、googleで探してみたところ以下のブランチが見つかりました。
https://github.com/coleifer/peewee/issues/1955

#環境

  • peewee:3.14.2
  • python3.8

#参考ブランチを元に全文検索を行ってみる

全文検索を行うにはまず既存のDBのテーブル変更を行う必要がありそうです

ALTER TABLE TESTDB.staff add FULLTEXT (user_name) WITH PARSER ngram;

※おそらくpeeweeのModel設定を変更し、反映した方が良さそうですがやり方を調べても見つからなかったため今回は
直接変更を行っています

query = TESTDB.select().where(Match(TESTDB.user_name,name))

def Match(columns, expr, modifier=None):
    """
    Match

    Parameters
    ----------
    columns : peewee_obj(検索対象のフィールド) 
              list,tupleでの複数指定可能
    expr : str(検索文字列)
    modifier : str(修飾子)

    Returns
    -------
       NodeList (where条件)
    """
    if isinstance(columns, (list, tuple)):
        match = peewee.fn.MATCH(*columns)  # Tuple of one or more columns / fields.
    else:
        match = peewee.fn.MATCH(columns)  # Single column / field.
    args = expr if modifier is None else peewee.NodeList((expr, SQL(modifier)))
    return peewee.NodeList((match, peewee.fn.AGAINST(args)))

上記にて検索を行ったところうまくあいまい検索にて取得することが取得することができました。

#注意事項
上記の方法であいまい検索を行う場合ですが、一文字でのあいまい検索はできません

  • 例:検索できる:  検索対象:あいうえお ⇨ 検索文字:あい/いう/うえ/えお
  •   検索できない : 検索対象:あいうえお ⇨ 検索文字:あ/い/う/え/お ⇨ 0件で返却される
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?