Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
django_pgroonga
2017/2/9 Groonga Meatup 2017
Atsuo Ishimoto
自己紹介
2
石本 敦夫
フリーランスのプログラマ
python.jp の管理人
著書
Pythonライブラリ厳選レシピ
Python文法詳解
パーフェクトPython
PGroongaのきっかけ
3
自作メモアプリの検索エンジン
Django
4
PythonのポピュラーなWebフレームワーク
https://www.jetbrains.com/pycharm/python-developers-survey-2016/
Django ORMのテーブル定義
5
class Person(models.Model):
name = models.TextField()
age = models.IntegerField()
CREATE TABLE myapp_p...
Django ORMのQuery
6
Person.objects.filter(
name__contains='ishimoto')
SELECT *
FROM Person
WHERE name LIKE '%ishimoto%';
Py...
Django-pgroongaのセットアップ
7
動作環境
• Python3.x
• Django 1.10以降
$ pip3 install django-groonga
8
モデルの作成
class Memo(models.Model):
memo = models.TextField()
 通常のモデル定義と同じ
 エクステンションの指定はできない
 インデックスの指定はできない
CREATE TABL...
エクステンションの登録
9
マイグレーション機能を利用
class Migration(migrations.Migration):
…
operations = [
migrations.RunSQL(
'CREATE EXTENSION p...
インデックスの作成
10
マイグレーション機能を利用
class Migration(migrations.Migration):
…
operations = [
migrations.RunSQL(
'''CREATE INDEX idx1...
like 検索の実行
11
memo = Memo.create(
memo='牛乳と卵買ってきて')
memo.save()
Memoオブジェクトの登録
Python
SQL
INSERT INTO app_memo(memo)
VALUES...
like 検索の実行
12
Memo.objects.filter(
memo__contains='牛乳')
Like検索の実行
Python
SQL
SELECT * FROM myapp_memo
where memo LIKE '%牛乳...
クエリ構文による検索
13
Memo.objects.filter(
memo__groonga='卵 OR 牛乳')
フィールド名__groonga='検索式'
Python
SQL
SELECT * FROM myapp_memo
WHER...
検索スコア
14
from django_pgroonga import Score
q = (Memo.objects
.annotate(score=Score(Memo))
.order_by('-score')
.filter(memo...
Upcoming SlideShare
Loading in …5
×

Django pgroonga

752 views

Published on

Django pgroonga

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Django pgroonga

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

×