タスク:django管理エリアで全文検索を実装します。
検索を行うモデルの例:
class Movie(models.Model): title_en = models.CharField(max_length=255, null=True) title_ru = models.CharField(max_length=255, null=True) year = models.PositiveSmallIntegerField(null=True)
sphinxをインストールして構成する
sphinxはどのパッケージマネージャーからでもインストールできます。FreeBSDしか手元にないので、portsからインストールします。
cd /usr/ports/textproc/sphinxsearch make install clean
この記事ではバージョン0.9.9を使用していますが、django-sphinxパッケージは間違いなく動作します。他のバージョンではテストされていません。
構成/usr/local/etc/sphinx.confを作成します
設定からログファイルとディレクトリを作成し、chown _sphinxにします。 postgresも使用する場合は、スフィンクスが接続できるように、pg_hba.confに適切な行を追加してください。
ユーザーに必要なテーブルからの読み取り許可を与えます。 もう一度グーグルしないように、postgresの例を示します。
GRANT CONNECT ON DATABASE mydb TO sphinx; GRANT USAGE ON SCHEMA public TO sphinx; GRANT SELECT ON movies_movie TO sphinx;
インデクサーを起動して、クラウンに配置します
/usr/local/bin/indexer --config /usr/local/etc/sphinx.conf --rotate --all >/dev/null 2>&1
スフィンクスを実行する
/usr/local/etc/rc.d/sphinxsearch start
Djangoの統合
django-sphinxパッケージを置きます
pip install django-sphinx
「djangosphinx」をINSTALLED_APPSに追加します
settings.pyに設定を書き込みます
SPHINX_API_VERSION = 0x116
モデルにSphinx Managerを追加する
class Movie(models.Model): search = SphinxSearch( index='movies', weights={ 'title_en': 100, 'title_ru': 100, } )
全文検索が機能することを確認します。
>>> Movie.search.query(u'').order_by('year')[0] <Movie: The Green Mile (1999) - >
管理パネルでスフィンクスを検索する
Django-sphinxには独自のクラスSphinxModelAdminがあり、管理パネルの通常の検索でスフィンクスを使用できます。
しかし、ここに著者がこの機能について書いているものがあります:
- 最大のスフィンクス結果のみを表示します(デフォルトは1000)
- 現在、フィルターは機能しません。
- これは大規模なハックであるため、Djangoの更新時に動作を継続する場合としない場合があります。
これは私たちには適していないので、それを終了する必要があります。
django 1.6では、ModelAdminクラスにget_search_resultsメソッドがあり、組み込みの検索エンジンをオーバーライドできます。
ドキュメント:
docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_search_resultsそれを使用します。
私は次のクラスを得ました:
class SphinxModelAdmin(admin.ModelAdmin): def get_search_results(self, request, queryset, search_term): if search_term: sphinx_queryset = self.model.search.query(search_term) doc_ids = [doc.pk for doc in sphinx_queryset] queryset = queryset.filter(pk__in=doc_ids) return queryset, True else: return super(SphinxModelAdmin, self).get_search_results( request, queryset, search_term )
この方法では、フィルターや管理パネルの並べ替えが失われることはありません。検索をスフィンクスで見つかったドキュメントに絞り込むだけです。
次のように使用します。
class MovieAdmin(SphinxModelAdmin): pass
検索が正しく機能していることを確認してください。
外観-django-grappelliこのソリューションの短所:
このトピックを書いている時点でのDjango 1.6はベータ版です。
参照:
sphinxsearch.comgithub.com/dcramer/django-sphinxvostryakov.ru/blog/28-sphinx-11-django-postgresqldocs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_search_results