django pgroonga

14
django_pgroonga 2017/2/9 Groonga Meatup 2017 Atsuo Ishimoto

Upload: atsuo-ishimoto

Post on 12-Apr-2017

148 views

Category:

Technology


7 download

TRANSCRIPT

Page 1: Django pgroonga

django_pgroonga

2017/2/9 Groonga Meatup 2017Atsuo Ishimoto

Page 2: Django pgroonga

自己紹介

2

石本 敦夫フリーランスのプログラマpython.jp の管理人著書

Python ライブラリ厳選レシピPython 文法詳解パーフェクト Python

Page 3: Django pgroonga

3

PGroonga のきっかけ自作メモアプリの検索エンジン

Page 4: Django pgroonga

4

DjangoPython のポピュラーな Web フレームワーク

https://www.jetbrains.com/pycharm/python-developers-survey-2016/

Page 5: Django pgroonga

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

Page 6: Django pgroonga

6

Django ORM の QueryPerson.objects.filter(

name__contains='ishimoto')

SELECT * FROM Person WHERE name LIKE '%ishimoto%';

Python

SQL

Page 7: Django pgroonga

7

Django-pgroonga のセットアップ

動作環境• Python 3 .x• Django 1.10 以降

$ pip3 install django-groonga

Page 8: Django pgroonga

8

モデルの作成class Memo(models.Model): memo = models.TextField()

通常のモデル定義と同じエクステンションの指定はできないインデックスの指定はできない

CREATE TABLE myapp_memo ( id serial NOT NULL PRIMARY KEY, memo text NOT NULL);

クラス定義SQL

Page 9: Django pgroonga

9

エクステンションの登録マイグレーション機能を利用

class Migration(migrations.Migration): … operations = [ migrations.RunSQL( 'CREATE EXTENSION pgroonga', 'DROP EXTENSION pgroonga', ),]

Page 10: Django pgroonga

10

インデックスの作成マイグレーション機能を利用

class Migration(migrations.Migration): … operations = [ migrations.RunSQL( '''CREATE INDEX idx1 ON testapp_memo USING pgroonga (id, memo)''', '''DROP INDEX idx1''', ),]

Page 11: Django pgroonga

11

like 検索の実行 memo = Memo.create( memo=' 牛乳と卵買ってきて ') memo.save()

Memo オブジェクトの登録Python

SQL

INSERT INTO app_memo(memo)VALUES(' 牛乳と卵買ってきて '));

COMMIT;

Page 12: Django pgroonga

12

like 検索の実行

Memo.objects.filter( memo__contains=' 牛乳 ')

Like 検索の実行Python

SQL SELECT * FROM myapp_memo where memo LIKE '% 牛乳 %')

Page 13: Django pgroonga

13

クエリ構文による検索

Memo.objects.filter( memo__groonga=' 卵 OR 牛乳 ')

フィールド名 __groonga=' 検索式 '

Python

SQLSELECT * FROM myapp_memoWHERE memo @@ ' 卵 OR 牛乳 '

Page 14: Django pgroonga

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