from django.db import models, transaction
class Article(models.Model):
# ...
def save(self, *args, **kwargs):
with transaction.atomic():
transaction.on_commit(
lambda: update_search(self.pk))
super().save(*args, **kwargs)
Slide 27
Slide 27 text
from django.db import models, transaction
class Article(models.Model):
# ...
def delete(self, *args, **kwargs):
pk = self.pk
with transaction.atomic():
transaction.on_commit(
lambda: delete_search(pk))
return super().delete(
*args, **kwargs)
Slide 28
Slide 28 text
Maintain A Complete
Search Index
Slide 29
Slide 29 text
What Is Search?
Try to find something by looking or
otherwise seeking carefully and
thoroughly. — Oxford English Dictionary
Slide 30
Slide 30 text
• Example:
https://github.com/MarkusH/talk-django-search
• Search in Django:
https://docs.djangoproject.com/en/2.0/topics/db/search/
• Choosing a PostgreSQL text search method:
https://blog.2ndquadrant.com/text-search-strategies-in-postgresql/
• Trigram Extension:
https://www.postgresql.org/docs/10/static/pgtrgm.html
• Full-text search:
https://www.postgresql.org/docs/10/static/textsearch-tables.html
Slide 31
Slide 31 text
Thank you!
@m_holtermann
Slide 32
Slide 32 text
import blog.indexes
from django.contrib.postgres.operations import TrigramExtension
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [('blog', '0002_auto_20180503_1925')]
operations = [
TrigramExtension(),
migrations.AddIndex(
model_name='entry',
index=blog.indexes.TrigramGistIndex(
fields=['body'], name='body_trgm_gist')),
]
Slide 33
Slide 33 text
-- Creates extension pg_trgm
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
-- Create index body_trgm_gist on field(s)
-- body of model entry
CREATE INDEX "body_trgm_gist" ON "blog_entry"
USING gist (UPPER("body") gist_trgm_ops);