Yii рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ PostgreSQL tsearch2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдХреЛрдИ рднреА рд╕рд╛рдЗрдЯ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧреНрд░рдВрде рд╣реИред рдЧреНрд░рдВрдереЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЕрдХреНрд╕рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЦреЛрдЬред рдЕрдЪреНрдЫрд╛ рдкреБрд░рд╛рдирд╛ LIKE рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдирд╣реАрдВред PostgreSQL рдореЗрдВ tsearch2 рдЬреИрд╕реА рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдЪреАрдЬреЗрдВ рд╣реИрдВред рд╡рд╛рдИрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдореИрдВ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдмрддрд╛рдКрдВрдЧрд╛ред
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рдПрдХ рдмрд╛рд░ рдЬрдм рдореБрдЭреЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╕рд╛рдЗрдЯреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ред Tsearch2 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ Google рдкрд░ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рд╕реЛрдЪреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдЗрдЯ рдореЗрдВ рдердХрд╛рдК рдЧрд╛рдЗрдб рд╣реИред LIKE рдХреА рддреБрд▓рдирд╛ рдореЗрдВ tsearch2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЖрдХрд░реНрд╖рдг рдХреНрдпрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдмрд╣реБрдд рд╕рдордЭрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд╛рдЗрдЯ рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рднрд░реА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдПрд╕рдХреНрдпреВрдПрд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рддрд░реАрдХреЗ рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред CListView рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ CActiveDataProvider рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣реАрдВ рд╕реЗ рдорд╕реНрддреА рд╢реБрд░реВ рд╣реБрдИред
рдирд┐рд░реНрдгрдп
CActiveDataProvider рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ CDbCriteria рд╡рд░реНрдЧ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрдВрдХреНрд╢рди рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП FROM рдлрд╝реАрд▓реНрдб рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЬреЛ tsearch2 рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:
рдЪрдпрди рдХрд░реЗрдВ ... FROM ..., to_tsquery ( $ sh_string ) AS q ...
рд╕рднреА рдЬреЛ рд░рд╣рддрд╛ рд╣реИ рд╡рд╣ findAllBySql рдореЗрдердб рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдкреЙрдкреБрд▓реЗрдЯреЗрдб рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, CActiveDataProvider рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрдВрддреНрд░ рдХреЗрд╡рд▓ findAll рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рддреЛ рд╣рдо рд╢реБрджреНрдз SQL рдХреНрд╡реЗрд░реА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдореЙрдбрд▓ рдХреЛ CActiveDataProvider рдореЗрдВ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ? рд╕рдорд╛рдзрд╛рди
Stackoverflow рдкрд░ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛
, рд▓реЗрдХрд┐рди рдкрд░реЗрд╢рд╛рдиреА рд╡рд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдИред рдореЗрд░реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬрд╣рд╛рдВ рдЧреНрд░рдВрде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЧрдП рдереЗ, рдХреБрдВрдЬреА рдлрд╝реАрд▓реНрдб рдХреЛ рдЖрдИрдбреА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ txt_id рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрддреНрддрд░ рд╕реЗ рдкрд╛рда рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдерд╛ред рдореБрдЭреЗ рдпрд╣реА рдорд┐рд▓рд╛ рд╣реИред
рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ:
$ _shString = '' ;
рдЕрдЧрд░ ( isset ( $ _GET [ 'sh' ] ) )
{
$ _shString = implode ( '&' , рд╡рд┐рд╕реНрдлреЛрдЯ ( '' , $ _GET [ 'sh' ] ) ) ;
$ _qry = "
рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
txt_id,
ts_headline (txt, q, 'StartSel = <strong>, StopSel = </ strong>, MaxScript = 35, Minints = 15') as txt,
ts_rank (fti_txt, q) AS рд░реИрдВрдХ
рд╕реЗ
рдЧреНрд░рдВрде, to_tsquery (: рд╢) AS q
рдХрд╣рд╛рдВ
user_id =: uid рдФрд░ fti_txt @@ q
ORDER BY рд░реИрдВрдХ DESC
" ;
$ _model = рдЧреНрд░рдВрде :: рдореЙрдбрд▓ ( ) -> findAllBySql ( $ _qry , array ( ': uid' => Yii :: app ( ) -> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ -> рдЖрдИрдбреА , ': sh' = $ _shString ) ) ;
}
рджреЗрдЦрдиреЗ рдореЗрдВ:
$ рдпрд╣ -> рд╡рд┐рдЬреЗрдЯ ( 'zii.widgets.CListView' , рд╕рд░рдгреА ()
'рдЖрдИрдбреА' => 'рдЦреЛрдЬ-рдкрд░рд┐рдгрд╛рдо' ,
'dataProvider' => рдирдпрд╛ CArrayDataProvider ( $ рдореЙрдбрд▓ , рд╕рд░рдгреА ( 'keyField' => 'txt_id' ) )
'itemView' => '_text' ,
) ) ;
рдЙрд╕реА рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ
рдРрд░реЗ ( 'рдХреАрдлрд┐рд▓реНрдб' => 'txt_id' )
рдпреБрдкреАрдбреАред 2012-04-02
рдЬреИрд╕рд╛ рдХрд┐ рдЖрджрд░рдгреАрдп рд░рд╛рдЗрд╡ рдиреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рднреА рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реВрдк рд╕реЗ рдФрд░ рдЬрдм CListView рдореЗрдВ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рдореБрдЭреЗ
рдлреНрд░реЗрдорд╡рд░реНрдХ рдлрд╝реЛрд░рдо рдкрд░ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫрдирд╛ рдерд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╕реНрддреГрдд рдЙрддреНрддрд░ рддреБрд░рдВрдд рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ! рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЙрддреНрддрд░ рдХрд╛ рд╕рд╛рд░:
CSqlDataProvider рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдореЗрд░рд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛ред рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ:
$ _shString = '' ;
рдЕрдЧрд░ ( isset ( $ _GET [ 'sh' ] ) )
{
$ _shString = implode ( '&' , рд╡рд┐рд╕реНрдлреЛрдЯ ( '' , $ _GET [ 'sh' ] ) ) ;
US ': uid' => Yii :: app ( ) -> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ -> рдЖрдИрдбреА , ': sh' => $ _shString ) ;
$ _qry = "
рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
txt_id,
ts_headline (txt, q, 'StartSel = <strong>, StopSel = </ strong>, MaxScript = 35, Minints = 15') as txt,
ts_rank (fti_txt, q) AS рд░реИрдВрдХ
рд╕реЗ
рдЧреНрд░рдВрде, to_tsquery (: рд╢) AS q
рдХрд╣рд╛рдВ
user_id =: uid рдФрд░ fti_txt @@ q
ORDER BY рд░реИрдВрдХ DESC
" ;
$ dataProvider = рдирдпрд╛ CSqlDataProvider ( $ _qry , рд╕рд░рдгреА )
'TotalItemCount' => $ _cnt ,
'params' => array ( ': uid' => Yii :: app ( ) -> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ -> рдЖрдИрдбреА , ': sh' => $ _shString ) ,
'рдХреАрдлрд┐рд▓реНрдб' => 'txt_id' ,
'рдкреЗрдЬрд┐рдиреЗрд╢рди' => рд╕рд░рдгреА (
'рдкреЗрдЬрд╕рд╛рдЗрдЬрд╝' => 20 ,
) ,
) ) ;
}
рдЖрдЧреЗ рджреЗрдЦрдиреЗ рдореЗрдВ:
$ рдпрд╣ -> рд╡рд┐рдЬреЗрдЯ ( 'zii.widgets.CListView' , рд╕рд░рдгреА ()
'рдЖрдИрдбреА' => 'рдЦреЛрдЬ-рдкрд░рд┐рдгрд╛рдо' ,
'dataProvider' => $ dataProvider ,
'itemView' => '_text' ,
) ) ;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рджреГрд╢реНрдп _text.php рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:
<div class = "view">
<? php
// рдЗрдХреЛ CHtml :: рдПрдирдХреЛрдб ($ рдбреЗрдЯрд╛-> txt);
// рдЗрдХреЛ $ рдбреЗрдЯрд╛-> txt;
рдЗрдХреЛ $ рдбреЗрдЯрд╛ [ 'txt' ] ;
?>
</ Div>
рд╡рд┐рд╢реЗрд╖ рдиреЛрдЯ рдХреЗ рджреЛ рдмрд┐рдВрджреБ рд╣реИрдВ:
- CSqlDataProvider рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЦреЛрдЬрдиреЗ рдФрд░ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрдиреБрд░реЛрдз рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд┐рдП рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рд╕рдорд╛рди рдЧрдВрднреАрд░рддрд╛ рдХреЗ рджреЛ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред
- рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдЕрдВрджрд░ рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ "рдкрд╛рд╕" рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╛рдкреНрдд $ рдбреЗрдЯрд╛ рдШрдЯрдХ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рд░рдгреА рдХрд╛ рдкреНрд░рд╛рд░реВрдк рд╣реИред рдореИрдВрдиреЗ рд╕реНрд░реЛрдд _text.php рдХреЛ рд╡реНрдпрд░реНрде рдирд╣реАрдВ рдЙрджреНрдзреГрдд рдХрд┐рдпрд╛, рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдЧреВрдВрдЬ $ рдбреЗрдЯрд╛ ['txt'] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рдЗрдХреЛ $ рдбреЗрдЯрд╛ рдХреЗ рдмрдЬрд╛рдп-> txt;
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрднрд╡ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛!