DjangoでLudiaを使う

開発版Djangoで、パッチを当てる箇所が以前の手順と変わっているのでご紹介。

${PYTHON_PATH}/django/db/backends/postgresql(_psycopg2)/base.py

class DatabaseOperations(PostgresqlDatabaseOperations):
    """....."""
    # ここに全文検索用のメソッドを追加する
    def fulltext_search_sql(self, field_name):
        return '%s @@ %%s' % field_name

DatabaseOperations クラスに全文検索用のメソッドを追加します
PostgreSQL上で、Ludia用インデックスを作成すると、全文検索が利用可能になります


管理画面から全文検索フィールドを表示させる
models.py

class Memo(models.Model):
    name = models.CharField(max_length=50)
    body = models.TextField()
    
    class Meta:
        ordering = ['name']

    class Admin:
        list_display = ('name',)
        list_filter = ('name',)
        search_fields = ('@body',)
        
    def __unicode__(self):
        return u'%s' % self.name

search_fields に全文検索の対象とするフィールドの先頭に"@"を付加すると
管理画面に検索ボックスが追加され、Ludiaによる検索が可能になります。


データベースAPIから全文検索する
views.py

from django.shortcuts import render_to_response, get_list_or_404
from todo.task.models import Memo

def memo_search(request):
    post_data = request.POST.copy()
    word = post_data['search']
    object_list = get_list_or_404(Memo.objects.filter(body__search=word))

    return render_to_response('task/memo_list.html', {'object_list': object_list })

データを取得するクエリセット取得時に、
照合のキーワード引数名を field__lookuptype=value とする (アンダースコアは二重)
管理画面と同様の結果が得ることができます。