データが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 を使ってくれるはず。