django 1.6 adminでスフィンクスを検索する

タスク: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を作成します

非表示のテキスト
 #  source movies_src { type = pgsql #  mysql sql_host = 127.0.0.1 sql_user = sphinx sql_pass = sphinxpass sql_db = dbname sql_port = 5432 sql_query = select id, title_en, title_ru, year from movies_movie # ,      sql_attr_uint = year } #   index movies { source = movies_src path = /var/data/search/movies docinfo = extern charset_type = utf-8 morphology = stem_enru #      } #   searchd { listen = 9312 log = /var/log/searchd.log query_log = /var/log/searchd.query.log read_timeout = 3 client_timeout = 10 max_children = 15 pid_file = /var/run/sphinxsearch/searchd.pid max_matches = 1000 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 mva_updates_pool = 1M max_packet_size = 8M }
      
      







設定からログファイルとディレクトリを作成し、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 0.9.9+ SPHINX_PORT = 9312 SPHINX_SERVER = '127.0.0.1'
      
      





モデルに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があり、管理パネルの通常の検索でスフィンクスを使用できます。

しかし、ここに著者がこの機能について書いているものがあります:



これは私たちには適していないので、それを終了する必要があります。

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.com

github.com/dcramer/django-sphinx

vostryakov.ru/blog/28-sphinx-11-django-postgresql

docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_search_results



All Articles