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