рдХрд╛рд░реНрдп: 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 рдмрдирд╛рдПрдВ
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда рд╣рдо рд▓реЙрдЧрд┐рди рд╕реЗ рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ _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
рдореЙрдбрд▓ рдореЗрдВ рд╕реНрдлрд┐рдВрдХреНрд╕ рдкреНрд░рдмрдВрдзрдХ рдЬреЛрдбрд╝реЗрдВ
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.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.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