django pgroonga
TRANSCRIPT
django_pgroonga
2017/2/9 Groonga Meatup 2017Atsuo Ishimoto
自己紹介
2
石本 敦夫フリーランスのプログラマpython.jp の管理人著書
Python ライブラリ厳選レシピPython 文法詳解パーフェクト Python
3
PGroonga のきっかけ自作メモアプリの検索エンジン
4
DjangoPython のポピュラーな Web フレームワーク
https://www.jetbrains.com/pycharm/python-developers-survey-2016/
5
Django ORM のテーブル定義class Person(models.Model): name = models.TextField() age = models.IntegerField()
CREATE TABLE myapp_person ( id serial NOT NULL PRIMARY KEY, name text NOT NULL, age integer NOT NULL);
Pythonクラス定義
SQL
6
Django ORM の QueryPerson.objects.filter(
name__contains='ishimoto')
SELECT * FROM Person WHERE name LIKE '%ishimoto%';
Python
SQL
7
Django-pgroonga のセットアップ
動作環境• Python 3 .x• Django 1.10 以降
$ pip3 install django-groonga
8
モデルの作成class Memo(models.Model): memo = models.TextField()
通常のモデル定義と同じエクステンションの指定はできないインデックスの指定はできない
CREATE TABLE myapp_memo ( id serial NOT NULL PRIMARY KEY, memo text NOT NULL);
クラス定義SQL
9
エクステンションの登録マイグレーション機能を利用
class Migration(migrations.Migration): … operations = [ migrations.RunSQL( 'CREATE EXTENSION pgroonga', 'DROP EXTENSION pgroonga', ),]
10
インデックスの作成マイグレーション機能を利用
class Migration(migrations.Migration): … operations = [ migrations.RunSQL( '''CREATE INDEX idx1 ON testapp_memo USING pgroonga (id, memo)''', '''DROP INDEX idx1''', ),]
11
like 検索の実行 memo = Memo.create( memo=' 牛乳と卵買ってきて ') memo.save()
Memo オブジェクトの登録Python
SQL
INSERT INTO app_memo(memo)VALUES(' 牛乳と卵買ってきて '));
COMMIT;
12
like 検索の実行
Memo.objects.filter( memo__contains=' 牛乳 ')
Like 検索の実行Python
SQL SELECT * FROM myapp_memo where memo LIKE '% 牛乳 %')
13
クエリ構文による検索
Memo.objects.filter( memo__groonga=' 卵 OR 牛乳 ')
フィールド名 __groonga=' 検索式 '
Python
SQLSELECT * FROM myapp_memoWHERE memo @@ ' 卵 OR 牛乳 '
14
検索スコアfrom django_pgroonga import Scoreq = (Memo.objects .annotate(score=Score(Memo)) .order_by('-score') .filter(memo__contains=' 牛乳 '))
SELECT *,pgroonga.score(myapp_memo)FROM myapp_memoWHERE memo LIKE '% 牛乳 %'ORDER BY pgroonga.score(myapp_memo) DESC;
Python
SQL