19
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

django の管理画面の検索で Elasticsearch を使う

Posted at

データが80万レコードくらいになってくると標準の LIKE 検索では無理な感じなので Elasticsearch を導入して検索できるといいなーと思って試してみました。 Haystack のドキュメントにはまだ書かれてなかったんだけど、簡単にできました。

django で Elasticsearch を使う方法はこちらを参考にしました。

http://django-haystack.readthedocs.org/en/latest/tutorial.html
https://gist.github.com/voluntas/6739918

以下のものがインストールされていることを前提とします。

  • Elasticsearch
  • django
  • Haystack

あと、以下のようなモデルがあるということにします。

models.py
from django.contrib.auth.models import User
from django.db import models

class Memo(models.Model):
    user = models.ForeignKey(User)
    text = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

search_indexes.py を書く。

search_indexes.py
import datetime

from haystack import indexes

from memo.models import Memo


class MemoIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
	user = indexes.CharField(model_attr='user')

    def get_model(self):
        return Memo

    def index_queryset(self, using=None):
        return self.get_model().objects.filter(created_at__lte=datetime.datetime.now())

admin.py を書きます。ここで Haystack の SearchModelAdmin を継承するのがポイント。 search_fields は適当に入れておく。

admin.py
from django.contrib import admin
from haystack.admin import SearchModelAdmin

from memo.models import Memo


class MemoAdmin(SearchModelAdmin):
    list_display = ('user', 'created_at',)
    search_fields = (
        'text',
    )

admin.site.register(Memo, MemoAdmin)

適当にデータをいれて

$ python manage.py rebuild_index

管理画面にログインして普通に検索すると Elasticsearch を使ってくれるはず。

19
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?