12.9. Ð¢Ð¸Ð¿Ñ Ð¸Ð½Ð´ÐµÐºÑов, пÑедпоÑиÑаемÑе Ð´Ð»Ñ ÑекÑÑового поиÑка #
ÐÐ»Ñ ÑÑкоÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑекÑÑового поиÑка можно иÑполÑзоваÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ GIN, RUM и GiST. ÐамеÑÑÑе, ÑÑо ÑÑи индекÑÑ Ð½Ðµ ÑÑебÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка, но еÑли по какомÑ-Ñо ÑÑолбÑÑ Ð¿Ð¾Ð¸Ñк вÑполнÑеÑÑÑ ÑегÑлÑÑно, обÑÑно желаÑелÑно ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ñакой индекÑ, вÑполниÑе Ð¾Ð´Ð½Ñ Ð¸Ð· ÑледÑÑÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´:
-
CREATE INDEXимÑONÑаблиÑаUSING GIN (ÑÑолбеÑ); СоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð° базе GIN (Generalized Inverted Index, ÐбобÑÑннÑй ÐнвеÑÑиÑованнÑй ÐндекÑ).
СÑолбеÑдолжен имеÑÑ Ñипtsvector.-
CREATE INDEXимÑONÑаблиÑаUSING RUM (ÑÑолбеÑ); СоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð° базе RUM.
СÑолбеÑдолжен имеÑÑ Ñипtsvector.-
CREATE INDEXимÑONÑаблиÑаUSING GIST (ÑÑолбеÑ[ { DEFAULT | tsvector_ops } (siglen =ÑиÑло) ] ); СоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð° базе GiST (Generalized Search Tree, ÐбобÑÑнное деÑево поиÑка). ÐдеÑÑ
ÑÑолбеÑÐ¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ñипtsvectorилиtsquery. ÐеобÑзаÑелÑнÑй ÑиÑловой паÑамеÑÑsiglenопÑеделÑÐµÑ Ð´Ð»Ð¸Ð½Ñ ÑигнаÑÑÑÑ Ð² байÑÐ°Ñ (подÑобнее об ÑÑом ниже).
Ðолее пÑедпоÑÑиÑелÑнÑми Ð´Ð»Ñ ÑекÑÑового поиÑка ÑвлÑÑÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ GIN и оÑнованнÑе на меÑоде доÑÑÑпа GIN индекÑÑ RUM. ÐÑдÑÑи инвеÑÑиÑованнÑми индекÑами, они ÑодеÑÐ¶Ð°Ñ Ð·Ð°Ð¿Ð¸Ñи Ð´Ð»Ñ Ð²ÑеÑ
оÑделÑнÑÑ
Ñлов (лекÑем) Ñ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑнÑм ÑпиÑком меÑÑ Ð¸Ñ
вÑ
ождений. ÐÑи поиÑке неÑколÑкиÑ
Ñлов можно найÑи пеÑвое, а заÑем воÑполÑзоваÑÑÑÑ Ð¸Ð½Ð´ÐµÐºÑом и иÑклÑÑиÑÑ ÑÑÑоки, в коÑоÑÑÑ
дополниÑелÑнÑе Ñлова оÑÑÑÑÑÑвÑÑÑ. ÐндекÑÑ GIN Ñ
ÑанÑÑ ÑолÑко Ñлова (лекÑемÑ) из знаÑений tsvector и ÑеÑÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± иÑ
веÑаÑ
. Таким обÑазом Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа Ñ Ð²ÐµÑами поÑÑебÑеÑÑÑ Ð¿ÐµÑепÑовеÑиÑÑ ÑÑÑоки в ÑаблиÑе.
ÐÐ½Ð´ÐµÐºÑ GiST допÑÑÐºÐ°ÐµÑ Ð½ÐµÑоÑноÑÑи, Ñо еÑÑÑ Ð¾Ð½ допÑÑÐºÐ°ÐµÑ Ð»Ð¾Ð¶Ð½Ñе Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸ поÑÑÐ¾Ð¼Ñ Ð¸Ñ
нÑжно иÑклÑÑаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑно, ÑвеÑÑÑ ÑезÑлÑÑÐ°Ñ Ñ ÑакÑиÑеÑкими даннÑми ÑаблиÑÑ. (Postgres Pro Ð´ÐµÐ»Ð°ÐµÑ ÑÑо авÑомаÑиÑеÑки.) ÐндекÑÑ GiST ÑвлÑÑÑÑÑ Ð½ÐµÑоÑнÑми, Ñак как вÑе докÑменÑÑ Ð² ниÑ
пÑедÑÑавлÑÑÑÑÑ ÑигнаÑÑÑой ÑикÑиÑованной длинÑ. Ðлина ÑигнаÑÑÑÑ Ð² байÑаÑ
опÑеделÑеÑÑÑ Ð·Ð½Ð°Ñением необÑзаÑелÑного ÑелоÑиÑленного паÑамеÑÑа siglen. Ðо ÑмолÑÐ°Ð½Ð¸Ñ (когда паÑамеÑÑ siglen оÑÑÑÑÑÑвÑеÑ) Ñавно 124 байÑам, а макÑималÑÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° ÑигнаÑÑÑÑ Ñавна 2024 байÑам. СигнаÑÑÑа ÑоÑмиÑÑеÑÑÑ Ð² ÑезÑлÑÑаÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÑиÑÑÑÑÑÐ²Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñлова как одного биÑа в ÑÑÑоке из n-биÑ, а заÑем логиÑеÑкого обÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑÑиÑ
биÑовÑÑ
ÑÑÑок. ÐÑли двÑм Ñловам бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ Ð¾Ð´Ð½Ð° биÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð·Ð¸ÑиÑ, попадание оказÑваеÑÑÑ Ð»Ð¾Ð¶Ð½Ñм. ÐÑли Ð´Ð»Ñ Ð²ÑеÑ
Ñлов оказалиÑÑ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ ÑооÑвеÑÑÑвÑÑÑие биÑÑ (в ÑлÑÑае ÑакÑиÑеÑкого или ложного попаданиÑ), Ð´Ð»Ñ Ð¿ÑовеÑки пÑавилÑноÑÑи пÑÐµÐ´Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾ Ñовпадении Ñлов необÑ
одимо пÑоÑиÑаÑÑ ÑÑÑÐ¾ÐºÑ ÑаблиÑÑ. ÐÑи ÑвелиÑении ÑазмеÑа ÑигнаÑÑÑÑ Ð¿Ð¾Ð¸Ñк ÑабоÑÐ°ÐµÑ ÑоÑнее (ÑканиÑÑеÑÑÑ Ð¼ÐµÐ½ÑÑÐ°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð² индекÑе и менÑÑе ÑÑÑÐ°Ð½Ð¸Ñ ÐºÑÑи), но Ñам Ð¸Ð½Ð´ÐµÐºÑ ÑÑановиÑÑÑ Ð±Ð¾Ð»ÑÑе.
ÐÐ½Ð´ÐµÐºÑ GiST Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾ÐºÑÑваÑÑим, Ñо еÑÑÑ Ð¸ÑполÑзоваÑÑ ÑÑнкÑионалÑноÑÑÑ INCLUDE. РкаÑеÑÑве дополниÑелÑнÑÑ
в него могÑÑ Ð²ÐºÐ»ÑÑаÑÑÑÑ ÑÑолбÑÑ, Ð´Ð»Ñ Ñипа даннÑÑ
коÑоÑÑÑ
не опÑеделÑн клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов GiST. ÐÑÑибÑÑÑ, вклÑÑаемÑе в индекÑ, ÑоÑ
ÑанÑÑÑÑÑ Ð² нÑм без ÑжаÑиÑ.
ÐеÑоÑноÑÑÑ Ð¸Ð½Ð´ÐµÐºÑа пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑоизводиÑелÑноÑÑи из-за дополниÑелÑнÑÑ Ð¾Ð±ÑаÑений к запиÑÑм ÑаблиÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð¿Ñедположение о Ñовпадении оказÑваеÑÑÑ Ð»Ð¾Ð¶Ð½Ñм. Так как пÑоизволÑнÑй доÑÑÑп к ÑаблиÑе обÑÑно не бÑÐ²Ð°ÐµÑ Ð±ÑÑÑÑÑм, ÑÑо огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð¿ÑименимоÑÑÑ Ð¸Ð½Ð´ÐµÐºÑов GiST. ÐеÑоÑÑноÑÑÑ Ð»Ð¾Ð¶Ð½ÑÑ Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ð¹ завиÑÐ¸Ñ Ð¾Ñ ÑÑда ÑакÑоÑов, напÑÐ¸Ð¼ÐµÑ Ð¾Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑникалÑнÑÑ Ñлов, Ñак ÑÑо его ÑекомендÑеÑÑÑ ÑокÑаÑаÑÑ, пÑименÑÑ ÑловаÑи.
ÐамеÑÑÑе, ÑÑо поÑÑÑоение индекÑа GIN ÑаÑÑо можно ÑÑкоÑиÑÑ, ÑвелиÑив maintenance_work_mem, Ñогда как вÑÐµÐ¼Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа GiST не завиÑÐ¸Ñ Ð¾Ñ ÑÑого паÑамеÑÑа.
ÐÑавилÑно иÑполÑзÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ GIN, RUM и GiST и ÑазделÑÑ Ð±Ð¾Ð»ÑÑие коллекÑии докÑменÑов на ÑекÑии, можно ÑеализоваÑÑ Ð¾ÑÐµÐ½Ñ Ð±ÑÑÑÑÑй поиÑк Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Â«Ð½Ð° леÑÑ». СекÑиониÑоваÑÑ Ð´Ð°Ð½Ð½Ñе можно как на ÑÑовне базÑ, Ñ Ð¸ÑполÑзованием наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑ, Ñак и ÑаÑпÑеделив докÑменÑÑ Ð¿Ð¾ ÑазнÑм ÑеÑвеÑам и заÑем ÑобиÑÐ°Ñ ÑезÑлÑÑаÑÑ Ð²Ð½ÐµÑнего поиÑка, напÑимеÑ, ÑÑедÑÑвами доÑÑÑпа к ÑÑоÑонним даннÑм. ÐоÑледний ваÑÐ¸Ð°Ð½Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶ÐµÐ½ благодаÑÑ ÑомÑ, ÑÑо ÑÑнкÑии ÑанжиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑполÑзÑÑÑ ÑолÑко локалÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ.