Django 1.6 рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдореЗрдВ рд╕реНрдлрд┐рдВрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдЬреЗрдВ

рдХрд╛рд░реНрдп: 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) 


рд╕реНрдлрд┐рдВрдХреНрд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


рд╣рдо рдХрд┐рд╕реА рднреА рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдлрд┐рдВрдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдлреНрд░реАрдмреАрдПрд╕рдбреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВред
 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 } 


рд╣рдо рд▓реЙрдЧрд┐рди рд╕реЗ рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ _sphinx рдмрдирд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ pg_hba.conf рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд▓рд╛рдЗрди рдЬреЛрдбрд╝рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╕реНрдлрд┐рдВрдХреНрд╕ рдХрдиреЗрдХреНрдЯ рд╣реЛ рд╕рдХреЗред
рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдореИрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЧреВрдЧрд▓ рди рд╣реЛ:
 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 

INSTALLED_APPS рдореЗрдВ 'djangosphinx' рдЬреЛрдбрд╝реЗрдВ
рд╣рдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
 SPHINX_API_VERSION = 0x116 #  sphinx 0.9.9+ SPHINX_PORT = 9312 SPHINX_SERVER = '127.0.0.1' 

рдореЙрдбрд▓ рдореЗрдВ рд╕реНрдлрд┐рдВрдХреНрд╕ рдкреНрд░рдмрдВрдзрдХ рдЬреЛрдбрд╝реЗрдВ
 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.odelAdmin.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 рд╡рд┐рд╖рдп рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп рдмреАрдЯрд╛ рдореЗрдВ рд╣реИред

ssylochki:
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

Source: https://habr.com/ru/post/In188242/


All Articles