
рдЬрдм
рд╣рдордиреЗ Django-рдмреИрдЯрд░рд┐рдпреЛрдВ рдХреЗ
рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдмрд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЖрдЦрд┐рд░реА
рд▓реЗрдЦ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА django-sphinx рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИ рдФрд░ рд╣рдорд╛рд░реА рдХрд╣рд╛рдиреА рдПрдХ рдЕрд▓рдЧ рдкреЛрд╕реНрдЯ рдХреА рдУрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдБ рд╡рд╣ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдЬ, Django рдореЗрдВ рдЦреЛрдЬреЛрдВ рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдЪреНрдЫреЗ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рдХреБрдЫ рджреЛ рд╣реИрдВ:
рд╣реЗрдбрд╕реНрдЯреИрдХ рдФрд░
рдбреАрдЬреЗрдВрдЧреЛ-рд╕реНрдлрд┐рдВрдХреНрд╕ ред рд╣реЗрд╕реНрдЯреИрдХ рд╕реЙрд▓, рд╣реЛрд╢ рдФрд░ рд╣реИрдкрд┐рдпрди рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░, рдЕрдлрд╕реЛрд╕, рдХреБрдЫ рд╕рд╛рд░ рд▓рд╛рдЗрд╕реЗрдВрд╕рд┐рдВрдЧ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╕реНрдлрд┐рдВрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред django-sphinx, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ Sphinx рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣реЗрдбрд╕реНрдЯреИрдХ рдПрдХ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓рд╛, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдФрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдЙрддреНрдкрд╛рдж рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реНрдлрд┐рдВрдХреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣, рдЕрдлрд╕реЛрд╕, рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдФрд░
рд╕реНрдлрд┐рдВрдХреНрд╕ рд╣рдорд╛рд░реА рд╕рдм рдХреБрдЫ рд╣реИ, рдЗрд╕рдХреА рдЧрддрд┐, рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░, рдЬреЛ рд╣рдорд╛рд░реЗ рднреМрдЧреЛрд▓рд┐рдХ рдЕрдХреНрд╖рд╛рдВрд╢реЛрдВ рдореЗрдВ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд░реВрд╕реА рдЖрдХреГрддрд┐ рд╡рд┐рдЬреНрдЮрд╛рди рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдЬрд┐рд╕реЗ рдЗрд╕рдХреЗ рдирд┐рдХрдЯрддрдо рдкреНрд░рддрд┐рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред "рдмрдбрд╝рд╛, рд▓реЗрдХрд┐рди 5 ... рдпрд╛ рдЫреЛрдЯрд╛, рд▓реЗрдХрд┐рди 3?"
рдЪреВрдВрдХрд┐ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдЕрднреА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЦреЛрдЬ рдЗрдВрдЬрди рдЪреБрдирдиреЗ рдХрд╛ рд╕рд╡рд╛рд▓ рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рдереАред рдФрд░ django-sphinx рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдм рдкреНрд░рдХреГрддрд┐ рдореЗрдВ "jangosphinx" рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдмреИрдЯрд░реА рдХреА рдкрд╕рдВрдж рдкрд╣рд▓реЗ рд╕реЗ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдереАред рддреЛ:
рдЕрдЪреНрдЫрд╛:
- рд╕реНрдлрд┐рдВрдХреНрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рдорд░реНрдерди <= 0.9.9
- рдореЙрдбрд▓ рдкреНрд░рдмрдВрдзрдХ (SphinxSearch) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА, рдЖрдк рд╕реАрдзреЗ рдореЙрдбрд▓ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдлрд╝реАрд▓реНрдб рдпрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдирд╛рдо рдЬреИрд╕реЗ рд╡рдЬрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рддрдГ рд╕реНрдлрд┐рдВрдХреНрд╕-рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ
- рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ pseudo`queryset (SphinxQueryset), рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ
рдЦрд░рд╛рдм:
- рдЪреЗрдирд┐рдВрдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирдИ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдЙрджрд╛рд╣рд░рдг (рдиреАрдЪреЗ рдЙрджрд╛рд╣рд░рдг) рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ
- рдореВрд▓ django-sphinx рдкреИрдХреЗрдЬ рдореЗрдВ рдХреБрдЫ рдХрд╖реНрдЯрдкреНрд░рдж рдЦреБрд▓реЗ рдмрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрд╡рд░реНрдЬрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдкрд╡рд╛рдж), рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рд╣рдорд╛рд░реЗ рдХрд╛рдВрдЯреЗ рдореЗрдВ рддрдп рдХрд┐рдП рдЧрдП рд╣реИрдВ
- рдХреЛрдИ рднреА рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ, рддрд┐рд░рдЫрд╛ рдкреНрд░рд▓реЗрдЦрди
- рдкреИрдХреЗрдЬ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдм рдЗрд╕рдХреЗ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕реНрдлрд┐рдВрдХреНрд╕ рдХреА рдбрд┐рд▓реАрд╡рд░реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкрд╛рдпрдерди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рд╕рд┐рд░реНрдл
рдореИрдЬрд┐рдХ 4 рдПрдХреНрд╕ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдереА ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ - рдЕрдкрдиреА рдЦреБрдж рдХреА рдмреИрдЯрд░реА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП,
рд▓рд╛рдареА рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рдеред
рджреВрд╕рд░реА рдУрд░, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред Django-sphinx рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░, рдмрдбрд╝реЗ рдФрд░ рдХрд╛рдо рдХреЗ рд╕рд╛рде рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред
рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореЙрдбрд▓ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЦреЛрдЬ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
class Post(models.Model): ... title = models.CharField(_(u''), max_length=1000) teaser_text = models.TextField(_(u''), blank=True) text = models.TextField(_(u'')) ...
рдореБрдЦреНрдп рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдХрд┐ рд╣рдо django-sphinx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ Sphinx API, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдбрд╝рдХреЛрдВ рдХреА рддрд░рд╣, django-sphinx рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрд╕ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдлрд┐рдВрдХреНрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдо рдореЙрдбрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдмрдВрдзрди рдХрдорд╛рдВрдб
generate_sphinx_config рд╣реИ ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИ:
$ ./manage.py generate_sphinx_config --all > absolute_path_to_config_file.conf
рд╡реИрд╕реЗ, рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрди рдЯреЗрдореНрдкреНрд▓реЗрдЯреЛрдВ рдореЗрдВ, рдЖрдк
рдЦреЛрдЬ рдореЛрдб , рд░реВрд╕реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрддреНрдпрд╛рджрд┐, рдлрд┐рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреЛ рд╣рд╛рде рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХред
рдЕрдм рд╣рдореЗрдВ рдЦреБрдж рд╣реА рд╕рд░реНрдЪ рдЗрдВрдЬрди рдбреЗрдореЙрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред Django-sphinx рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЗрд╕ рднрд╛рдЧ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ, Sphinx рдмреЙрдХреНрд╕ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
$ sudo searchd --config absolute_path_to_our_config_file.conf
рдкрд╣рд▓реА рд╢реБрд░реБрдЖрдд рдореЗрдВ,
рдЦреЛрдЬ рдиреЗ рд╢рдкрде рд▓реА рдХрд┐ рдХреЛрдИ рд╕реВрдЪрдХрд╛рдВрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрдВрдбреЗрдХреНрд╕ рдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
$ sudo indexer --config absolute_path_to_our_config_file.conf --all --rotate
рд╡рд╣ рд╕рдм рд╣реИред рдмреЗрд╢рдХ, рдЖрдк рдЗрди рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рд╕рд░рд▓ рдкреНрд░рдмрдВрдзрди рдЯреАрдо рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдлрд┐рдВрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрдирд╛рдПрдЧреАред рдирд┐рдЬреА рддреМрд░ рдкрд░, рд╣рдордиреЗ рдХрд┐рдпрд╛ред
рддреЛ рдЖрдк рдЕрдкрдиреА рдЦреЛрдЬреЛрдВ рдХреЛ рдХреИрд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ? рд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛ django-sphinx рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рджреГрд╢реНрдп рдореЗрдВ рдЖрдкрдХреЛ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:
... user_query = self.request.GET['query']
рд╣рдореЗрдВ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рдФрд░ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЫрджреНрдо 'рдХреНрд╡реЗрд░реА-рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдлрд┐рдВрдХреНрд╕ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЦреЛрдЬ рдЗрдВрдЬрди рдкрд░рд┐рдгрд╛рдо рд╕реНрдирд┐рдкреЗрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдереЛрдбрд╝рд╛ рднреА рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
passages_opts = {'before_match': '<span style="background-color: yellow">', 'match': '</span>', 'chunk_separator': '...', 'around': 10, 'single_passage': True, 'exact_phrase': True, } result = result.set_options(passages=True, passages_opts=passages_opts)
рдпрд╣ рдХреЛрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдкрдХреЛ рдЪрдпрди рдХреЗ рдЖрдЧреЗ рдЫрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬреЛ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдорд▓рд╛ рд╣реИ), рддреЛ рдпрд╣рд╛рдВ рдбреНрд░реЗрдЧрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред
рдмрд╛рдЧреЛрдлрд╛рдХ рдирдВрдмрд░ резрдЕрдкрд╡рд░реНрдЬрд┐рдд рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░реНрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА id рдХреА anhiki рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдирдкреИрдХреНрдб рдбрд┐рдХреНрд╢рдирд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдирд╛ рдЖрд╕рд╛рди):
excluded_obj_id_list = [post.id for post in result if post.is_published] filtered_result = result.exclude(**{'@id__in': excluded_obj_id_list})
рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдЦрд┐рд░реА рдСрдкрд░реЗрд╢рди рд╕реЗ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреЛрдИ рдмрд╣рд┐рд╖реНрдХреГрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдмрд╛рдЧреЛрдлрд┐рдХрд╛ рдирдВрдмрд░ реирд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЙрд╕реА рддрд░реАрдХреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рднреАрддрд░ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред
filtered_result = Post.search.query(user_query).exclude(**{'@id__in': excluded_obj_id_list})
рдФрд░ рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рдХреЛрдб рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдмрд╛рдЧрдлрд┐рдЪрд╛ рдирдВрдмрд░ 3рд╕реНрдлрд┐рдВрдХреНрд╕ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЦреЛрдЬ рдореЛрдб рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдореЛрдб рдХреЛ 'SPH_MATCH_ANY' рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдХрд┐рд╕реА рднреА рдХреНрд╡реЗрд░реА рд╢рдмреНрджреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ)ред рдпрджрд┐ рдЖрдк рдореЙрдбрд▓ рдореЗрдВ рд╣реА рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
search = SphinxSearch(weights={'title': 100, 'teaser_text': 80, 'text': 90}, mode='SPH_MATCH_ANY')
рдпрджрд┐ рд╣рдо рддрд░реНрдХ рдореЗрдВ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдХреА рдкреАрдврд╝реА рдФрд░ рдЙрдирдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИ ...
result = Post.search\ .query(user_query)\ .exclude(**{'@id__in': excluded_obj_id_list})\ .set_options(passages=True, passages_opts=passages_opts, mode='SPH_MATCH_ANY)
... рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕реНрдирд┐рдкреЗрдЯ рдирд╣реАрдВ рджрд┐рдЦреЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдореЗрдВ рдЦреЛрдЬ рдореЛрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдирд┐рдкреЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
{% for post in search_results %} <div class="g-content"> <a href="{{ post.get_absolute_url }}" class="b-teaser__descr__snippet-link"> {{ post.sphinx.passages.text|safe }} </a> </div> {% endfor %}
рдЙрд▓реНрд▓рд┐рдЦрд┐рдд "рд╕реБрд╡рд┐рдзрд╛рдУрдВ" рдиреЗ рдмрд╣реБрдд рдЦреВрди рдкреА рд▓рд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдкреЛрд╕реНрдЯ рдЖрдкрдХреЗ рдХреБрдЫ рд╕рдордп рдФрд░ рддрдВрддреНрд░рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред
рдФрд░ рдЕрдВрдд рдореЗрдВред рджрд┐рд╕рдВрдмрд░ 2011 рдореЗрдВ, рд╕реНрдлрд┐рдВрдХреНрд╕
рдХреА рдкрд╣рд▓реА рдирдИ рд░рд┐рд▓реАрдЬ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ
рдЬрд╛рд░реА рдХреА рдЧрдИ
рдереА - рд╕рдВрд╕реНрдХрд░рдг 2.0.3ред django-sphinx рднреА рдХреЗрд╡рд▓ 0.9.7, 0.9.8 рдФрд░ 0.9.9 рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде "рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ"ред
1) рд╕реНрдлрд┐рдВрдХреНрд╕ -
sphinxsearch.com2) рдореВрд▓ django-sphinx -
github.com/dcramer/django-sphinx3) рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдХреАрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдХрд╛рдВрдЯрд╛ -
github.com/futurecolors/django-sphinx