Django + рд╕реНрдлрд┐рдВрдХреНрд╕ = django-sphinx (?)



рдЬрдм рд╣рдордиреЗ Django-рдмреИрдЯрд░рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдмрд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЖрдЦрд┐рд░реА рд▓реЗрдЦ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА django-sphinx рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИ рдФрд░ рд╣рдорд╛рд░реА рдХрд╣рд╛рдиреА рдПрдХ рдЕрд▓рдЧ рдкреЛрд╕реНрдЯ рдХреА рдУрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдБ рд╡рд╣ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЖрдЬ, Django рдореЗрдВ рдЦреЛрдЬреЛрдВ рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдЪреНрдЫреЗ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рдХреБрдЫ рджреЛ рд╣реИрдВ: рд╣реЗрдбрд╕реНрдЯреИрдХ рдФрд░ рдбреАрдЬреЗрдВрдЧреЛ-рд╕реНрдлрд┐рдВрдХреНрд╕ ред рд╣реЗрд╕реНрдЯреИрдХ рд╕реЙрд▓, рд╣реЛрд╢ рдФрд░ рд╣реИрдкрд┐рдпрди рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░, рдЕрдлрд╕реЛрд╕, рдХреБрдЫ рд╕рд╛рд░ рд▓рд╛рдЗрд╕реЗрдВрд╕рд┐рдВрдЧ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╕реНрдлрд┐рдВрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред django-sphinx, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ Sphinx рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣реЗрдбрд╕реНрдЯреИрдХ рдПрдХ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓рд╛, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдФрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдЙрддреНрдкрд╛рдж рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реНрдлрд┐рдВрдХреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣, рдЕрдлрд╕реЛрд╕, рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдФрд░ рд╕реНрдлрд┐рдВрдХреНрд╕ рд╣рдорд╛рд░реА рд╕рдм рдХреБрдЫ рд╣реИ, рдЗрд╕рдХреА рдЧрддрд┐, рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░, рдЬреЛ рд╣рдорд╛рд░реЗ рднреМрдЧреЛрд▓рд┐рдХ рдЕрдХреНрд╖рд╛рдВрд╢реЛрдВ рдореЗрдВ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд░реВрд╕реА рдЖрдХреГрддрд┐ рд╡рд┐рдЬреНрдЮрд╛рди рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдЬрд┐рд╕реЗ рдЗрд╕рдХреЗ рдирд┐рдХрдЯрддрдо рдкреНрд░рддрд┐рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред "рдмрдбрд╝рд╛, рд▓реЗрдХрд┐рди 5 ... рдпрд╛ рдЫреЛрдЯрд╛, рд▓реЗрдХрд┐рди 3?"



рдЪреВрдВрдХрд┐ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдЕрднреА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЦреЛрдЬ рдЗрдВрдЬрди рдЪреБрдирдиреЗ рдХрд╛ рд╕рд╡рд╛рд▓ рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рдереАред рдФрд░ django-sphinx рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдм рдкреНрд░рдХреГрддрд┐ рдореЗрдВ "jangosphinx" рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдмреИрдЯрд░реА рдХреА рдкрд╕рдВрдж рдкрд╣рд▓реЗ рд╕реЗ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдереАред рддреЛ:

рдЕрдЪреНрдЫрд╛:

рдЦрд░рд╛рдм:


рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕реНрдлрд┐рдВрдХреНрд╕ рдХреА рдбрд┐рд▓реАрд╡рд░реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкрд╛рдпрдерди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рдореИрдЬрд┐рдХ 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 search = SphinxSearch(weights={'title': 100, 'teaser_text': 80, 'text': 90}) ... 


рдореБрдЦреНрдп рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдХрд┐ рд╣рдо 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'] #   result = Post.search.query(user_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.com
2) рдореВрд▓ django-sphinx - github.com/dcramer/django-sphinx
3) рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдХреАрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдХрд╛рдВрдЯрд╛ - github.com/futurecolors/django-sphinx

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


All Articles