рдпреБрдкреАрдбреАред рднрд╛рдЧ реи
рдпрд╣ рд▓реЗрдЦ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬреЗрдХреНрдпреВ рдореЗрдВ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИред рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХрд╛рдо рдкрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдкрдбрд╝рд╛ - рдФрд░ рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рдордЭрджрд╛рд░ рд╕рд╛рдордЧреНрд░реА рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖред рдХрдЯ рдХреЗ рддрд╣рдд рд▓рдбрд╝рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдЕрдиреБрднрд╡ред
рдЯрд╛рдИ
рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдкрд░ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЦреЛрдЬ рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ ~ 3.6 рдЬреАрдмреА рдХреА рдХреБрд▓ рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рде ~ 500 рд╣рдЬрд╛рд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЦреЛрдЬ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдРрд╕реЗ рдлреЙрд░реНрдо рдХреЛ рднрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг-рдкрд╛рда рдХреНрд╡реЗрд░реА рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рд╕реНрдлрд┐рдВрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдЬ рдХрд╛рд░реНрдп (рдпрд╛ рдмрд▓реНрдХрд┐, рдХрд╛рдо рдХрд┐рдпрд╛) рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереАрдВ:
- рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдиреЗ рд▓рдЧрднрдЧ 8 рдЬреАрдмреА рд░реИрдо рдХреА рдЦрдкрдд рдХреАред 8 рдЬреАрдмреА рд░реИрдо рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдкрд░, рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореЗрдореЛрд░реА рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рд╣реБрдИ, рдЗрд╕рдиреЗ рднрдпрд╛рдирдХ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ред
- рд╕реВрдЪрдХрд╛рдВрдХ рд▓рдЧрднрдЧ 40 рдорд┐рдирдЯ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рд░рддрд╛ рдХрд╛ рдХреЛрдИ рд╕рд╡рд╛рд▓ рд╣реА рдирд╣реАрдВ рдерд╛, рджрд┐рди рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЕрдиреБрдХреНрд░рдордг рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
- рдЦреЛрдЬ рдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд┐рдпрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЧрдП рдереЗ, рдЬреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдереЗ: рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЖрдИрдбреА-рд╢рдиреАрдХреНрд╕ рдХреЛ рд╕реНрдлрд┐рдВрдХреНрд╕ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛, рдФрд░ рдмреИрдХрдПрдВрдб рдкрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рдХрд╛рд░реНрдп рдЙрддреНрдкрдиреНрди рд╣реБрдЖ - рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рджреЛ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:
- рдЯрд╛рдЗрдЯреЗрди рд╕реНрдлрд┐рдВрдХреНрд╕: рдПрдХ рд░реАрдпрд▓рдЯрд╛рдЗрдо рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЛрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБред
- рдмрд┐рд▓реНрдЯ-рдЗрди FTS PostgreSQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рджреВрд╕рд░реЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдЗрд╕ рддрд░рд╣ рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдСрдЯреЛ-рдЕрдкрдбреЗрдЯ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рджреЛ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмреАрдЪ рд▓рдВрдмреЗ рд╕рдВрдЪрд╛рд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЛ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕реЗрд╡рд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрдЧреЗ рд░рд╣реАрдВред
рдЪрд▓рд┐рдП рд╢реБрд░реВ рд╕реЗ рд╣реА рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рднреЛрд▓реЗрдкрди рд╕реЗ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдХрд╣рддрд╛ рд╣реИ, рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬреЛрдВ рдХреЛ tsvector
рдФрд░ tsquery
рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкрд╣рд▓рд╛ рдПрдХ рдЦреЛрдЬ-рдЕрдиреБрдХреВрд▓рд┐рдд рд░реВрдк рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдкрд╛рда рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдПрдХ рдкреВрд░реНрдг-рдкрд╛рда рдХреНрд╡реЗрд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
PostgreSQL рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╣рд╛рдБ to_tsvector
, plainto_tsquery
, to_tsquery
ред рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд░реИрдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ts_rank
ред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╣рдЬ рд╣реИ рдФрд░ рд╡реЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред
рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
SELECT id, ts_rank(to_tsvector("document_text"), plainto_tsquery('')) FROM documents_document WHERE to_tsvector("document_text") @@ plainto_tsquery('') ORDER BY ts_rank(to_tsvector("document_text"), plainto_tsquery('')) DESC;
рд╣рдордиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рдЖрдИрдбреА-рдПрд╕ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ "рдХреНрд╡реЗрд░реА" рд╢рдмреНрдж рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреЗ рдЕрд╡рд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ред рд╕рдм рдХреБрдЫ рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ? рдирд╣реАрдВред
рдКрдкрд░ рджрд┐рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:
- рд╣рдо рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
- Ts_vector рдлрд╝рдВрдХреНрд╢рди рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
- Ts_rank рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЦреЛрдЬ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓реЗрддреА рд╣реИред рдпреБрджреНрдзрдХ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ:
Gather Merge (actual time=420289.477..420313.969 rows=58742 loops=1) Workers Planned: 2 Workers Launched: 2 -> Sort (actual time=420266.150..420267.935 rows=19581 loops=3) Sort Key: (ts_rank(to_tsvector(document_text), plainto_tsquery(''::text))) DESC Sort Method: quicksort Memory: 2278kB -> Parallel Seq Scan on documents_document (actual time=65.454..420235.446 rows=19581 loops=3) Filter: (to_tsvector(document_text) @@ plainto_tsquery(''::text)) Rows Removed by Filter: 140636 Planning time: 3.706 ms Execution time: 420315.895 ms
420 рд╕реЗрдХрдВрдб! рдПрдХ рдирд┐рд╡реЗрджрди рдХреЗ рд▓рд┐рдП!
рдЖрдзрд╛рд░ рднреА рдкреНрд░рдкрддреНрд░ рдХреА рдмрд╣реБрдд рд╕рд╛рд░реА vorings рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ [54000] word is too long to be indexed
ред рдЪрд┐рдВрддрд╛ рдХреА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ WYSIWYG рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ
рдЬрд╣рд╛рдВ рднреА рд╕рдВрднрд╡ рд╣реЛ, рдФрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ 54 рд╣рдЬрд╛рд░ рд╣реИрдВред рдЗрд╕ рд▓рдВрдмрд╛рдИ рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдРрд╕реА рд╡реЙрд░реНрдбрд┐рдВрдЧ рд▓рд┐рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдХреНрд╖рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред
рд╣рдо рдиреЛрдЯ рдХрд┐рдП рдЧрдП рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдФрд░ рдЦреЛрдЬ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
рд╣рдо рднреЛрд▓реЗрдкрди рд╕реЗ рдЦреЛрдЬ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рд╣рдо рдореБрдХрд╛рдмрд▓рд╛ рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЦреЗрд▓реЗрдВрдЧреЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ - рд╣рдо рдПрдХ рдЯреЗрд╕реНрдЯ рдмреЗрд╕ рдмрдирд╛рдПрдВрдЧреЗред рдЗрд╕рдореЗрдВ ~ 12 рд╣рдЬрд╛рд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╡рд╣рд╛рдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ~ 35 рд╕реЗрдХрдВрдбред рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд▓рдВрдмрд╛!
рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ Sort (actual time=35431.874..35432.208 rows=3593 loops=1) Sort Key: (ts_rank(to_tsvector(document_text), plainto_tsquery(''::text))) DESC Sort Method: quicksort Memory: 377kB -> Seq Scan on documents_document (actual time=8.470..35429.261 rows=3593 loops=1) Filter: (to_tsvector(document_text) @@ plainto_tsquery(''::text)) Rows Removed by Filter: 9190 Planning time: 0.200 ms Execution time: 35432.294 ms
рд╕реВрдЪреА
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛: рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕реВрдЪрдХрд╛рдВрдХред
CREATE INDEX idx_gin_document ON documents_document USING gin (to_tsvector('russian', "document_text"));
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ ~ 26 рд╕реЗрдХрдВрдб рд▓рдЧ рдЧрдпрд╛ред рдЙрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП to_tsvector рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ рдпрд╣ рдЕрднреА рднреА рдЦреЛрдЬ рдХреЛ 12 рд╕реЗрдХрдВрдб рддрдХ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рдЕрдХреНрд╖рдореНрдп рд░реВрдк рд╕реЗ рд▓рдВрдмрд╛ рд╣реИ!
рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ Sort (actual time=12213.943..12214.327 rows=3593 loops=1) Sort Key: (ts_rank(to_tsvector('russian'::regconfig, document_text), plainto_tsquery(''::text))) DESC Sort Method: quicksort Memory: 377kB -> Bitmap Heap Scan on documents_document (actual time=3.849..12212.248 rows=3593 loops=1) Recheck Cond: (to_tsvector('russian'::regconfig, document_text) @@ plainto_tsquery(''::text)) Heap Blocks: exact=946 -> Bitmap Index Scan on idx_gin_document (actual time=0.427..0.427 rows=3593 loops=1) Index Cond: (to_tsvector('russian'::regconfig, document_text) @@ plainto_tsquery(''::text)) Planning time: 0.109 ms Execution time: 12214.452 ms
рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ to_tsvector
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ tsvector
рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдмрджрд▓рддреЗ рд╕рдордп, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдмреИрдХрдПрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:
- рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЯрд╛рдЗрдк
tsvector
рдХрд╛ рдПрдХ рд╕реНрддрдВрдн рдЬреЛрдбрд╝реЗрдВред - рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдПрдХ-рд╕реЗ-рдПрдХ рд╕рдВрдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ, рдФрд░ рд╡рд╣рд╛рдВ рд╡реИрдХреНрдЯрд░ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВред
рдкрд╣рд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдлрд╛рдпрджреЗ: рдЦреЛрдЬ рдореЗрдВ join-s рдХреА рдХрдореАред
рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдлрд╛рдпрджреЗ: рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдХреА рдХрдореА, рдпрд╣ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдЖрдХрд╛рд░ рд░рд╣рддрд╛ рд╣реИред рдмреИрдХрдЕрдк рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ tsvector
рдкрд░ рд╕рдордп рдФрд░ рд╕реНрдерд╛рди рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдмреИрдХрдЕрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рджреЛрдиреЛрдВ рдпрд╛рддреНрд░рд╛рдПрдВ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИрдВ рдХрд┐ рдбрд┐рд╕реНрдХ рдкрд░ рдбреЗрдЯрд╛ рджреЛрдЧреБрдирд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдФрд░ рдЙрдирдХреЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рдЧреНрд░рдВрде рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЪреБрдирд╛, рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред
рд╕реВрдЪрдХрд╛рдВрдХ рдирд┐рд░реНрдорд╛рдг CREATE INDEX idx_gin_document ON documents_documentvector USING gin ("document_text");
рдирдИ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА SELECT documents_document.id, ts_rank("text", plainto_tsquery('')) FROM documents_document LEFT JOIN documents_documentvector ON documents_document.id = documents_documentvector.document_id WHERE "text" @@ plainto_tsquery('') ORDER BY ts_rank("text", plainto_tsquery('')) DESC;
рд▓рд┐рдВрдХ рдХреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдПрдВред рдбреЗрдЯрд╛ рдХреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ 24 рд╕реЗрдХрдВрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛, рдФрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдиреЗ рдореЗрдВ рдХреЗрд╡рд▓ 2.7 рд╕реЗрдХрдВрдб рдХрд╛ рд╕рдордп рд▓рдЧрд╛ ред рдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдХрд╛рдлреА рддреЗрдЬреА рдирд╣реАрдВ рдЖрдИ, рд▓реЗрдХрд┐рди рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдЕрдм рдмрд╣реБрдд рдЬрд▓реНрджреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рдХрд┐рддрдиреА рдмрд╛рд░ рдЦреЛрдЬ рддреЗрдЬ рд╣реБрдИ рд╣реИ?
Sort (actual time=48.147..48.432 rows=3593 loops=1) Sort Key: (ts_rank(documents_documentvector.text, plainto_tsquery(''::text))) DESC Sort Method: quicksort Memory: 377kB -> Hash Join (actual time=2.281..47.389 rows=3593 loops=1) Hash Cond: (documents_document.id = documents_documentvector.document_id) -> Seq Scan on documents_document (actual time=0.003..2.190 rows=12783 loops=1) -> Hash (actual time=2.252..2.252 rows=3593 loops=1) Buckets: 4096 Batches: 1 Memory Usage: 543kB -> Bitmap Heap Scan on documents_documentvector (actual time=0.465..1.641 rows=3593 loops=1) Recheck Cond: (text @@ plainto_tsquery(''::text)) Heap Blocks: exact=577 -> Bitmap Index Scan on idx_gin_document (actual time=0.404..0.404 rows=3593 loops=1) Index Cond: (text @@ plainto_tsquery(''::text)) Planning time: 0.410 ms Execution time: 48.573 ms
рдЬреБрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕рдкреНрд░рд╢реНрди:
SELECT id, ts_rank("text", plainto_tsquery('')) AS rank FROM documents_documentvector WHERE "text" @@ plainto_tsquery('') ORDER BY rank;
рдкрд░рд┐рдгрд╛рдо:
рд╕реЙрд░реНрдЯ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 44.339..44.487 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 3593 рд▓реВрдк = 1)
рд╕реЙрд░реНрдЯ рдХреА: (ts_rank (рдЯреЗрдХреНрд╕реНрдЯ, plainto_tsquery ('рдХреНрд╡реЗрд░реА' :: рдЯреЗрдХреНрд╕реНрдЯ)))
рд╕реЙрд░реНрдЯ рд╡рд┐рдзрд┐: Quicksort рдореЗрдореЛрд░реА: 265kB
-> рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдкрд░ рдмрд┐рдЯрдореИрдк рд╣реА рд╕реНрдХреИрди рдХрд░реЗрдВ_рдирд┐рд░реНрджреЗрд╢рдХ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.692..43.682 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 3593 рд▓реВрдк = 1)
Recheck Cond: (рдЯреЗрдХреНрд╕реНрдЯ @@ plainto_tsquery ('рдХреНрд╡реЗрд░реА' :: рдЯреЗрдХреНрд╕реНрдЯ))
рдвреЗрд░ рдмреНрд▓реЙрдХ: рд╕рдЯреАрдХ = 577
-> idx_gin_document рдкрд░ рдмрд┐рдЯрдореИрдк рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.577..0.577 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 3593 рд▓реВрдк = 1)
рд╕реВрдЪрдХрд╛рдВрдХ рдХрдВрдбреЛрдо: (рдкрд╛рда @@ plainto_tsquery ('рдХреНрд╡реЗрд░реА' :: рдкрд╛рда))
рдпреЛрдЬрдирд╛ рд╕рдордп: 0.182 рдПрдордПрд╕
рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп: 44.610 рдПрдордПрд╕
рдпрдХреАрди рдирд╣реАрдВ рд╣реЛрддрд╛! рдФрд░ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдФрд░ ts_rank
рдмрд╛рд╡рдЬреВрдж рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдЦреЛрдЬ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ ts_rank
рд▓рд┐рдП ts_rank
рдХреА рдЧрдгрдирд╛ рджреНрд╡рд╛рд░рд╛ ts_rank
рдЬрд╛рдПрдЧрд╛ред
ts_rank
рдПрдХрд╛рдзрд┐рдХ рдХреЙрд▓
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╣рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗред 44 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдПрдХ рд╕рднреНрдп рдиреЗрддреГрддреНрд╡ рд╕рдордп рд╣реИред рд╕реБрдЦрдж рдЕрдВрдд рдХрд░реАрдм рд▓рдЧрддрд╛ рд╣реИ? рд╡рд╣рд╛рдБ рдпрд╣ рдерд╛!
ts_rank
рдмрд┐рдирд╛ рдПрдХ рд╣реА рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдПрдБ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред
Ts_rank рдХреЗ рдмрд┐рдирд╛рдкреНрд░рд╢реНрди:
SELECT document_id, 1 AS rank FROM documents_documentvector WHERE "text" @@ plainto_tsquery('') ORDER BY rank;
рдкрд░рд┐рдгрд╛рдо:
Bitmap Heap Scan on documents_documentvector (actual time=0.503..1.609 rows=3593 loops=1) Recheck Cond: (text @@ plainto_tsquery(''::text)) Heap Blocks: exact=577 -> Bitmap Index Scan on idx_gin_document (actual time=0.439..0.439 rows=3593 loops=1) Index Cond: (text @@ plainto_tsquery(''::text)) Planning time: 0.147 ms Execution time: 1.715 ms
1.7 рдПрдордПрд╕! рддреАрд╕ рдЧреБрдирд╛ рддреЗрдЬ! рдПрдХ рдореБрдХрд╛рдмрд▓рд╛ рдЖрдзрд╛рд░ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдо ~ 150 рдПрдордПрд╕ рдФрд░ 1.5 рд╕реЗрдХрдВрдб рд╣реИрдВред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдВрддрд░ рдкрд░рд┐рдорд╛рдг рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ, рдФрд░ 1.5 рд╕реЗрдХрдВрдб рд╡рд╣ рд╕рдордп рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдк рдЖрдзрд╛рд░ рд╕реЗ рдЙрддреНрддрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдЖрдк рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЫрдВрдЯрдиреА рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ; рдЖрдк рдЧрд┐рдирддреА рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕рднреА ts_rank
рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП ts_rank
рдЧрдгрдирд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдЙрдиреНрд╣реЗрдВ рд╕реЙрд░реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░, рд╕рдмрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ (рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдХреЙрд▓ ts_rank)ред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛: рд╕рд╣реА рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рд╣реА рдЪрдпрди рдХрд░рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИ, рдФрд░ рдЧрд▓рдд рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдЦреЛрдЬ рдЕрднреА рднреА рдзреАрдореА рд╣реЛрдЧреАред
рдореБрдЭреЗ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд░рдордмрджреНрдз рд░реВрдк рдореЗрдВ рдЖрдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдлрд┐рдВрдХреНрд╕ рдХрд░рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, PostgreSQL рдореЗрдВ рдмреЙрдХреНрд╕ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдо рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдереЗ - рдЖрд░рдпреВрдПрдо рдЗрдВрдбреЗрдХреНрд╕ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ ред рдпрд╣ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╕реАрдзреЗ рддрдерд╛рдХрдерд┐рдд рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред tsvector
рдФрд░ tsquery
рдмреАрдЪ "рджреВрд░реА" рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдПрдХ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реБрдЖ рдкрд░рд┐рдгрд╛рдоред
рд▓реЗрдХрд┐рди рдПрдХ рдЬреАрдЖрдИрдПрди рдлреЗрдВрдХрдирд╛ рдФрд░ рдЖрд░рдпреВрдПрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЕрднреА рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдореЗрдВ рдЖрд╡реЗрджрди рдХреЗ minuses, pluses рдФрд░ рд╕реАрдорд╛рдПрдВ рд╣реИрдВ - рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред