django pgroonga

Post on 12-Apr-2017

148 Views

Category:

Technology

7 Downloads

Preview:

Click to see full reader

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

top related