{"id":68143,"date":"2024-07-04T18:32:21","date_gmt":"2024-07-04T15:02:21","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/optimizing-fuzzy-search-across-multiple-tables-pgtrgm-gin-and-triggers-4d1p\/"},"modified":"2024-07-04T18:32:21","modified_gmt":"2024-07-04T15:02:21","slug":"optimizing-fuzzy-search-across-multiple-tables-pgtrgm-gin-and-triggers-4d1p","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/optimizing-fuzzy-search-across-multiple-tables-pgtrgm-gin-and-triggers-4d1p\/","title":{"rendered":"\u0628\u0647\u06cc\u0646\u0647 \u0633\u0627\u0632\u06cc \u062c\u0633\u062a\u062c\u0648\u06cc \u0641\u0627\u0632\u06cc \u062f\u0631 \u0686\u0646\u062f\u06cc\u0646 \u062c\u062f\u0648\u0644: pg_trgm\u060c GIN \u0648 Triggers"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n            PostgreSQL \u0628\u0647\u0628\u0648\u062f\u0647\u0627\u06cc \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647\u06cc \u0631\u0627 \u0641\u0631\u0627\u062a\u0631 \u0627\u0632 \u0646\u0645\u0627\u06cc\u0647 \u0633\u0627\u0632\u06cc \u062a\u06a9 \u0633\u062a\u0648\u0646\u06cc \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 YugabyteDB \u0646\u06cc\u0632 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.  \u0628\u0631\u0627\u06cc \u062c\u0633\u062a\u062c\u0648\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0642\u062f\u0627\u0631 \u06a9\u0627\u0645\u0644 \u0622\u0646 \u0645\u0634\u062e\u0635 \u0646\u06cc\u0633\u062a\u060c \u067e\u0633\u0648\u0646\u062f pg_trgm \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0686\u0646\u062f\u06cc\u0646 \u062a\u0631\u06cc\u06af\u0631\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062f \u0648 GIN \u0627\u06cc\u0646 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0686\u0646\u062f\u06af\u0627\u0646\u0647 \u0631\u0627 \u062f\u0631 \u0647\u0631 \u0631\u062f\u06cc\u0641 \u0641\u0647\u0631\u0633\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f.  \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0627\u0633\u06a9\u0646 \u0628\u06cc\u062a \u0645\u067e \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0646\u0645\u0627\u06cc\u0647\u200c\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0633\u062a\u0648\u0646\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u062f\u0631 \u06cc\u06a9 \u062c\u062f\u0648\u0644 \u062a\u0631\u06a9\u06cc\u0628 \u06a9\u0646\u062f.  \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0686\u0627\u0644\u0634\u200c\u0647\u0627 \u0632\u0645\u0627\u0646\u06cc \u0628\u0647 \u0648\u062c\u0648\u062f \u0645\u06cc\u200c\u0622\u06cc\u0646\u062f \u06a9\u0647 \u06af\u0632\u0627\u0631\u0647\u200c\u0647\u0627 \u062f\u0631 \u062c\u062f\u0648\u0644\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u062f\u0631 \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0646\u062f.  \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c \u062a\u0631\u06cc\u06af\u0631\u0647\u0627 \u0648\u0627\u0631\u062f \u0639\u0645\u0644 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f \u0648 \u0628\u0627 \u062d\u0641\u0638 \u0633\u062a\u0648\u0646\u200c\u0647\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641\u200c\u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u06a9\u0627\u0631\u0628\u0631 \u06a9\u0647 \u0628\u0647 \u062c\u0633\u062a\u062c\u0648\u0647\u0627\u06cc \u0641\u0627\u0632\u06cc \u0627\u062e\u062a\u0635\u0627\u0635 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647\u200c\u0627\u0646\u062f\u060c \u0627\u0645\u06a9\u0627\u0646 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u0627\u06cc\u0647\u200c\u0633\u0627\u0632\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u062b\u0627\u0644\u06cc \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062c\u062f\u0648\u0644\u06cc \u0627\u0632 \u0634\u0647\u0631\u0647\u0627 \u0648 \u06a9\u0634\u0648\u0631\u0647\u0627 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0645\u0646 \u0627\u0632 gvenzl\/sample-data \u0645\u06cc\u200c\u0633\u0627\u0632\u0645:<\/p>\n<p>\\! curl -s https:\/\/raw.githubusercontent.com\/gvenzl\/sample-data\/main\/countries-cities-currencies\/uninstall.sql  &gt; countries.sql<br \/>\n\\! curl -s https:\/\/raw.githubusercontent.com\/gvenzl\/sample-data\/main\/countries-cities-currencies\/install.sql | awk &#8216;\/D a t a    l o a d\/{print &#8220;do $$ begin&#8221;}\/ COMMIT \/{print &#8220;end; $$ ;&#8221;}{print}&#8217; &gt;&gt; countries.sql<br \/>\n\\i countries.sql<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u0645 \u0634\u0647\u0631\u0647\u0627\u06cc\u06cc \u0631\u0627 \u0641\u0647\u0631\u0633\u062a \u06a9\u0646\u0645 \u06a9\u0647 \u062f\u0631 \u0646\u0627\u0645 \u0634\u0647\u0631 \u06cc\u0627 \u0646\u0627\u0645 \u06a9\u0634\u0648\u0631\u0634\u0627\u0646 &#8220;\u0628\u0646\u062f\u0631&#8221; \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f:<\/p>\n<p>yugabyte=# select city.name, country.name<br \/>\nfrom cities city<br \/>\njoin countries country using(country_id)<br \/>\nwhere city.name ilike &#8216;%port%&#8217; or country.name ilike &#8216;%port%&#8217;;<\/p>\n<p>      name      |        name<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n Port Moresby   | Papua New Guinea<br \/>\n Port of Spain  | Trinidad and Tobago<br \/>\n Port au Prince | Haiti<br \/>\n Porto Novo     | Benin<br \/>\n Port Vila      | Vanuatu<br \/>\n Port Louis     | Mauritius<br \/>\n Lisbon         | Portugal<br \/>\n(7 rows)<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u06a9\u062f\u0627\u0645 \u0634\u0627\u062e\u0635 \u0628\u0631\u0627\u06cc \u062a\u0633\u0631\u06cc\u0639 \u062f\u0631 \u0627\u06cc\u0646 \u062c\u0633\u062a\u062c\u0648 \u0627\u06cc\u062c\u0627\u062f \u0634\u0648\u062f\u061f<\/p>\n<p>  \u062a\u0631\u06cc\u06af\u0631\u0627\u0645 \u0648 \u0634\u0627\u062e\u0635 GIN \u062f\u0631 \u0647\u0631 \u062f\u0648 \u062c\u062f\u0648\u0644<\/p>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0645\u0646 \u06cc\u06a9 \u062c\u0633\u062a\u062c\u0648\u06cc \u0641\u0627\u0632\u06cc \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u0645\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0622\u0646 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0645 pg_trgm \u067e\u0633\u0648\u0646\u062f \u0648 \u06cc\u06a9 \u0634\u0627\u062e\u0635 GIN \u062f\u0631 \u0647\u0631 \u062f\u0648 \u0633\u062a\u0648\u0646:<\/p>\n<p>create extension if not exists pg_trgm;<br \/>\ncreate index on cities using gin (name gin_trgm_ops);<br \/>\ncreate index on countries using gin (name gin_trgm_ops);<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u062a\u0623\u0633\u0641\u0627\u0646\u0647\u060c \u0646\u0645\u06cc \u062a\u0648\u0627\u0646 \u0622\u0646 \u0631\u0627 \u0628\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f \u0632\u06cc\u0631\u0627 \u062f\u0648 \u0633\u062a\u0648\u0646 \u062f\u0631 \u062f\u0648 \u062c\u062f\u0648\u0644 \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u0646\u062f \u0648 \u0627\u0633\u06a9\u0646 \u0628\u06cc\u062a \u0645\u067e \u0641\u0642\u0637 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u06cc\u062a \u0645\u067e \u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u062c\u062f\u0648\u0644 \u062a\u0631\u06a9\u06cc\u0628 \u06a9\u0646\u062f:<\/p>\n<p>yugabyte=# explain (costs off)<br \/>\nselect city.name, country.name<br \/>\nfrom cities city<br \/>\njoin countries country using(country_id)<br \/>\nwhere city.name ilike &#8216;%port%&#8217; or country.name ilike &#8216;%port%&#8217;;<br \/>\n                                          QUERY PLAN<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n Nested Loop<br \/>\n   -&gt;  Seq Scan on cities city<br \/>\n   -&gt;  Index Scan using countries_pk on countries country<br \/>\n         Index Cond: ((country_id)::text = (city.country_id)::text)<br \/>\n         Filter: (((city.name)::text ~~* &#8216;%port%&#8217;::text) OR ((name)::text ~~* &#8216;%port%&#8217;::text))<br \/>\n(5 rows)<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0631\u0627 \u0628\u0627 \u06cc\u06a9 UNION \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0646\u0648\u06cc\u0633\u0645:<\/p>\n<p>yugabyte=# explain (costs off)<br \/>\nselect city.name, country.name<br \/>\nfrom cities city<br \/>\njoin countries country using(country_id)<br \/>\nwhere city.name ilike &#8216;%port%&#8217;<br \/>\nunion<br \/>\nselect city.name, country.name<br \/>\nfrom cities city<br \/>\njoin countries country using(country_id)<br \/>\nwhere country.name ilike &#8216;%port%&#8217;;<br \/>\n                                                                     QUERY PLAN<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br \/>\n HashAggregate<br \/>\n   Group Key: city.name, country.name<br \/>\n   -&gt;  Append<br \/>\n         -&gt;  YB Batched Nested Loop Join<br \/>\n               Join Filter: ((city.country_id)::text = (country.country_id)::text)<br \/>\n               -&gt;  Index Scan using cities_name_idx1 on cities city<br \/>\n                     Index Cond: ((name)::text ~~* &#8216;%port%&#8217;::text)<br \/>\n               -&gt;  Index Scan using countries_pk on countries country<br \/>\n                     Index Cond: ((country_id)::text = ANY (ARRAY[(city.country_id)::text, ($1)::text, ($2)::text, &#8230;, ($1023)::text]))<br \/>\n         -&gt;  YB Batched Nested Loop Join<br \/>\n               Join Filter: ((city_1.country_id)::text = (country_1.country_id)::text)<br \/>\n               -&gt;  Index Scan using countries_name_idx1 on countries country_1<br \/>\n                     Index Cond: ((name)::text ~~* &#8216;%port%&#8217;::text)<br \/>\n               -&gt;  Index Scan using cities_countries_fk001 on cities city_1<br \/>\n                     Index Cond: ((country_id)::text = ANY (ARRAY[(country_1.country_id)::text, ($1025)::text, ($1026)::text, &#8230;, ($2047)::text]))<br \/>\n(15 rows)<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0627\u0645\u0627 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u06a9\u0627\u0631\u0628\u0631 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc\u06cc \u0628\u0627 ORM \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f \u06a9\u0647 \u0646\u062a\u0648\u0627\u0646\u062f \u0686\u0646\u06cc\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062f.<\/p>\n<p>  \u06cc\u06a9 \u0633\u062a\u0648\u0646 \u0627\u0636\u0627\u0641\u06cc \u0628\u0631\u0627\u06cc \u062c\u0633\u062a\u062c\u0648 \u062d\u0641\u0638 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0645\u0646 \u06cc\u06a9 \u0633\u062a\u0648\u0646 \u0627\u0636\u0627\u0641\u06cc \u062f\u0631 &#8220;\u0634\u0647\u0631\u0647\u0627&#8221; \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u0645 \u06a9\u0647 \u0646\u0627\u0645 \u0634\u0647\u0631 \u0648 \u0646\u0627\u0645 \u06a9\u0634\u0648\u0631 \u0631\u0627 \u0628\u0627 \u06cc\u06a9 \u0634\u0627\u062e\u0635 GIN \u0631\u0648\u06cc \u0633\u0647 \u06af\u0631\u0627\u0645 \u0647\u0627 \u0628\u0647 \u0647\u0645 \u067e\u06cc\u0648\u0646\u062f \u0645\u06cc \u062f\u0647\u062f:<\/p>\n<p>alter table cities add fuzzy_search text;<\/p>\n<p>create index on cities using gin (fuzzy_search gin_trgm_ops);<\/p>\n<p>update cities<br \/>\nset fuzzy_search = format(&#8216;%s %s&#8217;,cities.name, countries.name)<br \/>\nfrom countries where countries.country_id = cities.country_id<br \/>\n;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u062f\u0631 \u0627\u06cc\u0646 \u0633\u062a\u0648\u0646 &#8220;fuzzy_search&#8221; \u067e\u0631\u0633 \u0648 \u062c\u0648 \u06a9\u0646\u0645:<\/p>\n<p>yugabyte=# explain (costs off)<br \/>\nselect city.name, country.name<br \/>\nfrom cities city<br \/>\njoin countries country using(country_id)<br \/>\nwhere fuzzy_search ilike &#8216;%port%&#8217;;<br \/>\n                                                         QUERY PLAN<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n YB Batched Nested Loop Join<br \/>\n   Join Filter: ((city.country_id)::text = (country.country_id)::text)<br \/>\n   -&gt;  Index Scan using cities_fuzzy_search_idx on cities city<br \/>\n         Index Cond: (fuzzy_search ~~* &#8216;%port%&#8217;::text)<br \/>\n   -&gt;  Index Scan using countries_pk on countries country<br \/>\n         Index Cond: ((country_id)::text = ANY (ARRAY[(city.country_id)::text, ($1)::text, ($2)::text, &#8230;, ($1023)::text]))<br \/>\n(6 rows)<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0627\u0633\u062a \u06a9\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647\u200c\u0647\u0627\u06cc \u062f\u0627\u062f\u0647 SQL \u062f\u0627\u0631\u0627\u06cc \u0645\u062d\u0631\u06a9\u200c\u0647\u0627\u06cc\u06cc \u0647\u0633\u062a\u0646\u062f: \u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0648\u062f\u0646 \u0645\u0642\u062f\u0627\u0631\u06cc \u0645\u0646\u0637\u0642 \u062f\u0627\u062f\u0647 \u0634\u0641\u0627\u0641 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647.<\/p>\n<p>\u06a9\u062f \u062a\u0631\u06cc\u06af\u0631\u0647\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0627\u0644\u06af\u0648\u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0634\u0645\u0627 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0647\u0634 \u0647\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc \u0628\u0633\u062a\u06af\u06cc \u062f\u0627\u0631\u062f.  \u0645\u0648\u0627\u0631\u062f\u06cc \u06a9\u0647 \u0628\u0647 \u0622\u0646\u0647\u0627 \u062e\u0648\u0627\u0647\u0645 \u067e\u0631\u062f\u0627\u062e\u062a \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632:<\/p>\n<p>\u062f\u0631\u062c \u06cc\u06a9 \u0634\u0647\u0631 \u062c\u062f\u06cc\u062f \u06a9\u0647 \u0628\u0647 \u06cc\u06a9 \u06a9\u0634\u0648\u0631 \u0627\u0634\u0627\u0631\u0647 \u062f\u0627\u0631\u062f \u0628\u0627\u06cc\u062f \u0646\u0627\u0645 \u06a9\u0634\u0648\u0631 \u0631\u0627 \u0628\u0647 \u0633\u062a\u0648\u0646 \u062c\u0633\u062a\u062c\u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u062f<br \/>\n\u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u06cc\u06a9 \u0634\u0647\u0631 \u0628\u0627\u06cc\u062f \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0633\u062a\u0648\u0646 \u062c\u0633\u062a\u062c\u0648 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u062f<br \/>\n\u062f\u0631\u062c\u060c \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06cc\u0627 \u062d\u0630\u0641 \u06cc\u06a9 \u06a9\u0634\u0648\u0631 \u0628\u0627\u06cc\u062f \u0633\u062a\u0648\u0646 \u062c\u0633\u062a\u062c\u0648 \u0631\u0627 \u062f\u0631 \u0647\u0645\u0647 \u0634\u0647\u0631\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u0622\u0646 \u0627\u0631\u062c\u0627\u0639 \u0645\u06cc\u200c\u062f\u0647\u0646\u062f\u060c \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06a9\u0646\u062f.  \u0627\u06af\u0631 \u06a9\u0644\u06cc\u062f \u062e\u0627\u0631\u062c\u06cc \u0628\u0627 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0622\u0628\u0634\u0627\u0631\u06cc \u062f\u0627\u0631\u06cc\u062f\u060c \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0647 \u0647\u0645\u0647 \u0622\u0646 \u0645\u0648\u0627\u0631\u062f \u0646\u06cc\u0627\u0632 \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u062d\u0631\u06a9 \u0647\u0627\u06cc \u0645\u0646 \u0647\u0633\u062a\u0646\u062f:<\/p>\n<p>&#8212; Trigger for insert, update, and delete on cities<br \/>\ncreate or replace function trg_cities_fuzzy_search() returns trigger as $$<br \/>\nbegin<br \/>\n    if tg_op = &#8216;INSERT&#8217; or tg_op = &#8216;UPDATE&#8217; then<br \/>\n        new.fuzzy_search := format(&#8216;%s %s&#8217;, new.name, (select name from countries where country_id = new.country_id));<br \/>\n        return new;<br \/>\n    end if;<br \/>\nend;<br \/>\n$$ language plpgsql;<br \/>\ncreate trigger trg_cities_fuzzy_search<br \/>\nbefore insert or update or delete on cities<br \/>\nfor each row execute function trg_cities_fuzzy_search();<\/p>\n<p>&#8212; Trigger for update and delete on countries<br \/>\ncreate or replace function trg_countries_fuzzy_search() returns trigger as $$<br \/>\nbegin<br \/>\n    if tg_op in ( &#8216;UPDATE&#8217; , &#8216;INSERT&#8217; ) then<br \/>\n        update cities<br \/>\n        set fuzzy_search = format(&#8216;%s %s&#8217;, cities.name, new.name)<br \/>\n        where country_id = new.country_id;<br \/>\n        return new;<br \/>\n    elsif tg_op = &#8216;DELETE&#8217; then<br \/>\n        update cities<br \/>\n        set fuzzy_search = format(&#8216;%s&#8217;, name)<br \/>\n        where country_id = old.country_id;<br \/>\n        return old;<br \/>\n    end if;<br \/>\nend;<br \/>\n$$ language plpgsql;<br \/>\ncreate trigger trg_countries_fuzzy_search<br \/>\nafter update or delete on countries<br \/>\nfor each row<br \/>\nexecute function trg_countries_fuzzy_search();<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u0647\u0645\u062a\u0631\u06cc\u0646 \u0686\u06cc\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u062a\u0633\u062a \u0647\u0627\u06cc\u06cc \u0628\u0631\u0627\u06cc \u067e\u0648\u0634\u0634 \u062a\u0645\u0627\u0645 DML \u0627\u0633\u062a \u06a9\u0647 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u062f\u0631 \u0622\u0646 \u062c\u062f\u0627\u0648\u0644 \u0627\u062a\u0641\u0627\u0642 \u0628\u06cc\u0641\u062a\u062f \u0648 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 &#8220;\u0633\u062a\u0648\u0646 fuzzy_search&#8221; \u0647\u0645\u06cc\u0634\u0647 \u062f\u0631\u0633\u062a \u0627\u0633\u062a.  \u0628\u0647 \u0639\u0628\u0627\u0631\u062a \u062f\u06cc\u06af\u0631\u060c \u0647\u06cc\u0686 \u0631\u062f\u06cc\u0641\u06cc \u062a\u0648\u0633\u0637:<\/p>\n<p>select format(&#8216;%s %s&#8217;,city.name, country.name) , fuzzy_search as names<br \/>\nfrom cities city<br \/>\njoin countries country using(country_id)<br \/>\nwhere format(&#8216;%s %s&#8217;,city.name, country.name) != fuzzy_search<br \/>\n;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06af\u0631 \u062a\u0633\u062a \u0627\u0633\u062a\u0631\u0633 \u0628\u0631\u0627\u06cc \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062d\u06cc\u0627\u062a\u06cc \u062f\u0627\u0631\u06cc\u062f \u06a9\u0647 \u0622\u0646 \u062c\u062f\u0627\u0648\u0644 \u0631\u0627 \u0627\u0635\u0644\u0627\u062d \u0645\u06cc \u06a9\u0646\u062f\u060c \u0628\u0627\u06cc\u062f \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0633\u0631\u0628\u0627\u0631 \u0642\u0627\u0628\u0644 \u0642\u0628\u0648\u0644 \u0627\u0633\u062a.<\/p>\n<p>\u0628\u0627 \u0627\u062c\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0631\u0627\u0647 \u062d\u0644\u060c \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062d\u062f\u0627\u0642\u0644 \u0627\u0633\u062a: \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u0645\u0639\u06cc\u0627\u0631\u0647\u0627 \u0631\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0633\u062a\u0648\u0646\u06cc \u06a9\u0647 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0627\u0635 \u0628\u0631\u0627\u06cc \u062c\u0633\u062a\u062c\u0648\u06cc \u0641\u0627\u0632\u06cc \u062a\u0639\u06cc\u06cc\u0646 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0628\u0633\u0627\u0632\u06cc\u062f.  \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0645\u0632\u0627\u06cc\u0627\u06cc \u063a\u06cc\u0631\u0639\u0627\u062f\u06cc \u0633\u0627\u0632\u06cc (\u0641\u06cc\u0644\u062a\u0631 \u06a9\u0631\u062f\u0646 \u0642\u0628\u0644 \u0627\u0632 \u067e\u06cc\u0648\u0633\u062a\u0646) \u0631\u0627 \u0628\u062f\u0648\u0646 \u0645\u0639\u0627\u06cc\u0628 (\u0645\u0627\u0646\u0646\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0645\u0646\u0637\u0642 \u062f\u0627\u062f\u0647 \u062f\u0631 \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0631\u0627\u06cc \u062d\u0641\u0638 \u062b\u0628\u0627\u062a) \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u0628\u0627 PostgreSQL\u060c YugabyteDB \u0648 \u0647\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 PostgreSQL \u0633\u0627\u0632\u06af\u0627\u0631 \u0627\u0633\u062a\u060c \u06a9\u0647 \u0627\u0644\u0628\u062a\u0647 \u0628\u0647 \u0645\u0639\u0646\u0627\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0634\u0627\u062e\u0635\u200c\u0647\u0627 \u0648 \u0645\u062d\u0631\u06a9\u200c\u0647\u0627\u06cc GIN \u0627\u0633\u062a.<\/p>\n<div data-article-id=\"1911547\" id=\"article-body\">\n<p>PostgreSQL \u0628\u0647\u0628\u0648\u062f\u0647\u0627\u06cc \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647\u06cc \u0631\u0627 \u0641\u0631\u0627\u062a\u0631 \u0627\u0632 \u0646\u0645\u0627\u06cc\u0647 \u0633\u0627\u0632\u06cc \u062a\u06a9 \u0633\u062a\u0648\u0646\u06cc \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 YugabyteDB \u0646\u06cc\u0632 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.  \u0628\u0631\u0627\u06cc \u062c\u0633\u062a\u062c\u0648\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0642\u062f\u0627\u0631 \u06a9\u0627\u0645\u0644 \u0622\u0646 \u0645\u0634\u062e\u0635 \u0646\u06cc\u0633\u062a\u060c \u067e\u0633\u0648\u0646\u062f pg_trgm \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0686\u0646\u062f\u06cc\u0646 \u062a\u0631\u06cc\u06af\u0631\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062f \u0648 GIN \u0627\u06cc\u0646 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0686\u0646\u062f\u06af\u0627\u0646\u0647 \u0631\u0627 \u062f\u0631 \u0647\u0631 \u0631\u062f\u06cc\u0641 \u0641\u0647\u0631\u0633\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f.  \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0627\u0633\u06a9\u0646 \u0628\u06cc\u062a \u0645\u067e \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0646\u0645\u0627\u06cc\u0647\u200c\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0633\u062a\u0648\u0646\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u062f\u0631 \u06cc\u06a9 \u062c\u062f\u0648\u0644 \u062a\u0631\u06a9\u06cc\u0628 \u06a9\u0646\u062f.  \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0686\u0627\u0644\u0634\u200c\u0647\u0627 \u0632\u0645\u0627\u0646\u06cc \u0628\u0647 \u0648\u062c\u0648\u062f \u0645\u06cc\u200c\u0622\u06cc\u0646\u062f \u06a9\u0647 \u06af\u0632\u0627\u0631\u0647\u200c\u0647\u0627 \u062f\u0631 \u062c\u062f\u0648\u0644\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u062f\u0631 \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0646\u062f.  \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c \u062a\u0631\u06cc\u06af\u0631\u0647\u0627 \u0648\u0627\u0631\u062f \u0639\u0645\u0644 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f \u0648 \u0628\u0627 \u062d\u0641\u0638 \u0633\u062a\u0648\u0646\u200c\u0647\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641\u200c\u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u06a9\u0627\u0631\u0628\u0631 \u06a9\u0647 \u0628\u0647 \u062c\u0633\u062a\u062c\u0648\u0647\u0627\u06cc \u0641\u0627\u0632\u06cc \u0627\u062e\u062a\u0635\u0627\u0635 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647\u200c\u0627\u0646\u062f\u060c \u0627\u0645\u06a9\u0627\u0646 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u0627\u06cc\u0647\u200c\u0633\u0627\u0632\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u062b\u0627\u0644\u06cc \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062c\u062f\u0648\u0644\u06cc \u0627\u0632 \u0634\u0647\u0631\u0647\u0627 \u0648 \u06a9\u0634\u0648\u0631\u0647\u0627 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0645\u0646 \u0627\u0632 gvenzl\/sample-data \u0645\u06cc\u200c\u0633\u0627\u0632\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"err\">\\<\/span><span class=\"o\">!<\/span> <span class=\"n\">curl<\/span> <span class=\"o\">-<\/span><span class=\"n\">s<\/span> <span class=\"n\">https<\/span><span class=\"p\">:<\/span><span class=\"o\">\/\/<\/span><span class=\"n\">raw<\/span><span class=\"p\">.<\/span><span class=\"n\">githubusercontent<\/span><span class=\"p\">.<\/span><span class=\"n\">com<\/span><span class=\"o\">\/<\/span><span class=\"n\">gvenzl<\/span><span class=\"o\">\/<\/span><span class=\"n\">sample<\/span><span class=\"o\">-<\/span><span class=\"k\">data<\/span><span class=\"o\">\/<\/span><span class=\"n\">main<\/span><span class=\"o\">\/<\/span><span class=\"n\">countries<\/span><span class=\"o\">-<\/span><span class=\"n\">cities<\/span><span class=\"o\">-<\/span><span class=\"n\">currencies<\/span><span class=\"o\">\/<\/span><span class=\"n\">uninstall<\/span><span class=\"p\">.<\/span><span class=\"k\">sql<\/span>  <span class=\"o\">&gt;<\/span> <span class=\"n\">countries<\/span><span class=\"p\">.<\/span><span class=\"k\">sql<\/span>\n<span class=\"err\">\\<\/span><span class=\"o\">!<\/span> <span class=\"n\">curl<\/span> <span class=\"o\">-<\/span><span class=\"n\">s<\/span> <span class=\"n\">https<\/span><span class=\"p\">:<\/span><span class=\"o\">\/\/<\/span><span class=\"n\">raw<\/span><span class=\"p\">.<\/span><span class=\"n\">githubusercontent<\/span><span class=\"p\">.<\/span><span class=\"n\">com<\/span><span class=\"o\">\/<\/span><span class=\"n\">gvenzl<\/span><span class=\"o\">\/<\/span><span class=\"n\">sample<\/span><span class=\"o\">-<\/span><span class=\"k\">data<\/span><span class=\"o\">\/<\/span><span class=\"n\">main<\/span><span class=\"o\">\/<\/span><span class=\"n\">countries<\/span><span class=\"o\">-<\/span><span class=\"n\">cities<\/span><span class=\"o\">-<\/span><span class=\"n\">currencies<\/span><span class=\"o\">\/<\/span><span class=\"n\">install<\/span><span class=\"p\">.<\/span><span class=\"k\">sql<\/span> <span class=\"o\">|<\/span> <span class=\"n\">awk<\/span> <span class=\"s1\">'\/D a t a    l o a d\/{print \"do $$ begin\"}\/ COMMIT \/{print \"end; $$ ;\"}{print}'<\/span> <span class=\"o\">&gt;&gt;<\/span> <span class=\"n\">countries<\/span><span class=\"p\">.<\/span><span class=\"k\">sql<\/span>\n<span class=\"err\">\\<\/span><span class=\"n\">i<\/span> <span class=\"n\">countries<\/span><span class=\"p\">.<\/span><span class=\"k\">sql<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u0645 \u0634\u0647\u0631\u0647\u0627\u06cc\u06cc \u0631\u0627 \u0641\u0647\u0631\u0633\u062a \u06a9\u0646\u0645 \u06a9\u0647 \u062f\u0631 \u0646\u0627\u0645 \u0634\u0647\u0631 \u06cc\u0627 \u0646\u0627\u0645 \u06a9\u0634\u0648\u0631\u0634\u0627\u0646 &#8220;\u0628\u0646\u062f\u0631&#8221; \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"n\">yugabyte<\/span><span class=\"o\">=#<\/span> <span class=\"k\">select<\/span> <span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span>\n<span class=\"k\">from<\/span> <span class=\"n\">cities<\/span> <span class=\"n\">city<\/span>\n<span class=\"k\">join<\/span> <span class=\"n\">countries<\/span> <span class=\"n\">country<\/span> <span class=\"k\">using<\/span><span class=\"p\">(<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">where<\/span> <span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span> <span class=\"k\">ilike<\/span> <span class=\"s1\">'%port%'<\/span> <span class=\"k\">or<\/span> <span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span> <span class=\"k\">ilike<\/span> <span class=\"s1\">'%port%'<\/span><span class=\"p\">;<\/span>\n\n      <span class=\"n\">name<\/span>      <span class=\"o\">|<\/span>        <span class=\"n\">name<\/span>\n<span class=\"c1\">----------------+---------------------<\/span>\n <span class=\"n\">Port<\/span> <span class=\"n\">Moresby<\/span>   <span class=\"o\">|<\/span> <span class=\"n\">Papua<\/span> <span class=\"k\">New<\/span> <span class=\"n\">Guinea<\/span>\n <span class=\"n\">Port<\/span> <span class=\"k\">of<\/span> <span class=\"n\">Spain<\/span>  <span class=\"o\">|<\/span> <span class=\"n\">Trinidad<\/span> <span class=\"k\">and<\/span> <span class=\"n\">Tobago<\/span>\n <span class=\"n\">Port<\/span> <span class=\"n\">au<\/span> <span class=\"n\">Prince<\/span> <span class=\"o\">|<\/span> <span class=\"n\">Haiti<\/span>\n <span class=\"n\">Porto<\/span> <span class=\"n\">Novo<\/span>     <span class=\"o\">|<\/span> <span class=\"n\">Benin<\/span>\n <span class=\"n\">Port<\/span> <span class=\"n\">Vila<\/span>      <span class=\"o\">|<\/span> <span class=\"n\">Vanuatu<\/span>\n <span class=\"n\">Port<\/span> <span class=\"n\">Louis<\/span>     <span class=\"o\">|<\/span> <span class=\"n\">Mauritius<\/span>\n <span class=\"n\">Lisbon<\/span>         <span class=\"o\">|<\/span> <span class=\"n\">Portugal<\/span>\n<span class=\"p\">(<\/span><span class=\"mi\">7<\/span> <span class=\"k\">rows<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06a9\u062f\u0627\u0645 \u0634\u0627\u062e\u0635 \u0628\u0631\u0627\u06cc \u062a\u0633\u0631\u06cc\u0639 \u062f\u0631 \u0627\u06cc\u0646 \u062c\u0633\u062a\u062c\u0648 \u0627\u06cc\u062c\u0627\u062f \u0634\u0648\u062f\u061f<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/optimizing-fuzzy-search-across-multiple-tables-pgtrgm-gin-and-triggers-4d1p\/#%D8%AA%D8%B1%DB%8C%DA%AF%D8%B1%D8%A7%D9%85_%D9%88_%D8%B4%D8%A7%D8%AE%D8%B5_GIN_%D8%AF%D8%B1_%D9%87%D8%B1_%D8%AF%D9%88_%D8%AC%D8%AF%D9%88%D9%84\" >\u062a\u0631\u06cc\u06af\u0631\u0627\u0645 \u0648 \u0634\u0627\u062e\u0635 GIN \u062f\u0631 \u0647\u0631 \u062f\u0648 \u062c\u062f\u0648\u0644<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/optimizing-fuzzy-search-across-multiple-tables-pgtrgm-gin-and-triggers-4d1p\/#%DB%8C%DA%A9_%D8%B3%D8%AA%D9%88%D9%86_%D8%A7%D8%B6%D8%A7%D9%81%DB%8C_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%AC%D8%B3%D8%AA%D8%AC%D9%88_%D8%AD%D9%81%D8%B8_%DA%A9%D9%86%DB%8C%D8%AF\" >\u06cc\u06a9 \u0633\u062a\u0648\u0646 \u0627\u0636\u0627\u0641\u06cc \u0628\u0631\u0627\u06cc \u062c\u0633\u062a\u062c\u0648 \u062d\u0641\u0638 \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AA%D8%B1%DB%8C%DA%AF%D8%B1%D8%A7%D9%85_%D9%88_%D8%B4%D8%A7%D8%AE%D8%B5_GIN_%D8%AF%D8%B1_%D9%87%D8%B1_%D8%AF%D9%88_%D8%AC%D8%AF%D9%88%D9%84\"><\/span>\n<p>  \u062a\u0631\u06cc\u06af\u0631\u0627\u0645 \u0648 \u0634\u0627\u062e\u0635 GIN \u062f\u0631 \u0647\u0631 \u062f\u0648 \u062c\u062f\u0648\u0644<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0645\u0646 \u06cc\u06a9 \u062c\u0633\u062a\u062c\u0648\u06cc \u0641\u0627\u0632\u06cc \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u0645\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0622\u0646 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0645 <code>pg_trgm<\/code> \u067e\u0633\u0648\u0646\u062f \u0648 \u06cc\u06a9 \u0634\u0627\u062e\u0635 GIN \u062f\u0631 \u0647\u0631 \u062f\u0648 \u0633\u062a\u0648\u0646:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"k\">create<\/span> <span class=\"n\">extension<\/span> <span class=\"n\">if<\/span> <span class=\"k\">not<\/span> <span class=\"k\">exists<\/span> <span class=\"n\">pg_trgm<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">create<\/span> <span class=\"k\">index<\/span> <span class=\"k\">on<\/span> <span class=\"n\">cities<\/span> <span class=\"k\">using<\/span> <span class=\"n\">gin<\/span> <span class=\"p\">(<\/span><span class=\"n\">name<\/span> <span class=\"n\">gin_trgm_ops<\/span><span class=\"p\">);<\/span>\n<span class=\"k\">create<\/span> <span class=\"k\">index<\/span> <span class=\"k\">on<\/span> <span class=\"n\">countries<\/span> <span class=\"k\">using<\/span> <span class=\"n\">gin<\/span> <span class=\"p\">(<\/span><span class=\"n\">name<\/span> <span class=\"n\">gin_trgm_ops<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u062a\u0623\u0633\u0641\u0627\u0646\u0647\u060c \u0646\u0645\u06cc \u062a\u0648\u0627\u0646 \u0622\u0646 \u0631\u0627 \u0628\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f \u0632\u06cc\u0631\u0627 \u062f\u0648 \u0633\u062a\u0648\u0646 \u062f\u0631 \u062f\u0648 \u062c\u062f\u0648\u0644 \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u0646\u062f \u0648 \u0627\u0633\u06a9\u0646 \u0628\u06cc\u062a \u0645\u067e \u0641\u0642\u0637 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u06cc\u062a \u0645\u067e \u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u062c\u062f\u0648\u0644 \u062a\u0631\u06a9\u06cc\u0628 \u06a9\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"n\">yugabyte<\/span><span class=\"o\">=#<\/span> <span class=\"k\">explain<\/span> <span class=\"p\">(<\/span><span class=\"n\">costs<\/span> <span class=\"k\">off<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">select<\/span> <span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span>\n<span class=\"k\">from<\/span> <span class=\"n\">cities<\/span> <span class=\"n\">city<\/span>\n<span class=\"k\">join<\/span> <span class=\"n\">countries<\/span> <span class=\"n\">country<\/span> <span class=\"k\">using<\/span><span class=\"p\">(<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">where<\/span> <span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span> <span class=\"k\">ilike<\/span> <span class=\"s1\">'%port%'<\/span> <span class=\"k\">or<\/span> <span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span> <span class=\"k\">ilike<\/span> <span class=\"s1\">'%port%'<\/span><span class=\"p\">;<\/span>\n                                          <span class=\"n\">QUERY<\/span> <span class=\"n\">PLAN<\/span>\n<span class=\"c1\">-----------------------------------------------------------------------------------------------<\/span>\n <span class=\"n\">Nested<\/span> <span class=\"n\">Loop<\/span>\n   <span class=\"o\">-&gt;<\/span>  <span class=\"n\">Seq<\/span> <span class=\"n\">Scan<\/span> <span class=\"k\">on<\/span> <span class=\"n\">cities<\/span> <span class=\"n\">city<\/span>\n   <span class=\"o\">-&gt;<\/span>  <span class=\"k\">Index<\/span> <span class=\"n\">Scan<\/span> <span class=\"k\">using<\/span> <span class=\"n\">countries_pk<\/span> <span class=\"k\">on<\/span> <span class=\"n\">countries<\/span> <span class=\"n\">country<\/span>\n         <span class=\"k\">Index<\/span> <span class=\"n\">Cond<\/span><span class=\"p\">:<\/span> <span class=\"p\">((<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">)<\/span>\n         <span class=\"n\">Filter<\/span><span class=\"p\">:<\/span> <span class=\"p\">(((<\/span><span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span> <span class=\"o\">~~*<\/span> <span class=\"s1\">'%port%'<\/span><span class=\"p\">::<\/span><span class=\"nb\">text<\/span><span class=\"p\">)<\/span> <span class=\"k\">OR<\/span> <span class=\"p\">((<\/span><span class=\"n\">name<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span> <span class=\"o\">~~*<\/span> <span class=\"s1\">'%port%'<\/span><span class=\"p\">::<\/span><span class=\"nb\">text<\/span><span class=\"p\">))<\/span>\n<span class=\"p\">(<\/span><span class=\"mi\">5<\/span> <span class=\"k\">rows<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0631\u0627 \u0628\u0627 \u06cc\u06a9 UNION \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0646\u0648\u06cc\u0633\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"n\">yugabyte<\/span><span class=\"o\">=#<\/span> <span class=\"k\">explain<\/span> <span class=\"p\">(<\/span><span class=\"n\">costs<\/span> <span class=\"k\">off<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">select<\/span> <span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span>\n<span class=\"k\">from<\/span> <span class=\"n\">cities<\/span> <span class=\"n\">city<\/span>\n<span class=\"k\">join<\/span> <span class=\"n\">countries<\/span> <span class=\"n\">country<\/span> <span class=\"k\">using<\/span><span class=\"p\">(<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">where<\/span> <span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span> <span class=\"k\">ilike<\/span> <span class=\"s1\">'%port%'<\/span>\n<span class=\"k\">union<\/span>\n<span class=\"k\">select<\/span> <span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span>\n<span class=\"k\">from<\/span> <span class=\"n\">cities<\/span> <span class=\"n\">city<\/span>\n<span class=\"k\">join<\/span> <span class=\"n\">countries<\/span> <span class=\"n\">country<\/span> <span class=\"k\">using<\/span><span class=\"p\">(<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">where<\/span> <span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span> <span class=\"k\">ilike<\/span> <span class=\"s1\">'%port%'<\/span><span class=\"p\">;<\/span>\n                                                                     <span class=\"n\">QUERY<\/span> <span class=\"n\">PLAN<\/span>\n<span class=\"c1\">----------------------------------------------------------------------------------------------------------------------------------------------------<\/span>\n <span class=\"n\">HashAggregate<\/span>\n   <span class=\"k\">Group<\/span> <span class=\"k\">Key<\/span><span class=\"p\">:<\/span> <span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span>\n   <span class=\"o\">-&gt;<\/span>  <span class=\"n\">Append<\/span>\n         <span class=\"o\">-&gt;<\/span>  <span class=\"n\">YB<\/span> <span class=\"n\">Batched<\/span> <span class=\"n\">Nested<\/span> <span class=\"n\">Loop<\/span> <span class=\"k\">Join<\/span>\n               <span class=\"k\">Join<\/span> <span class=\"n\">Filter<\/span><span class=\"p\">:<\/span> <span class=\"p\">((<\/span><span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">)<\/span>\n               <span class=\"o\">-&gt;<\/span>  <span class=\"k\">Index<\/span> <span class=\"n\">Scan<\/span> <span class=\"k\">using<\/span> <span class=\"n\">cities_name_idx1<\/span> <span class=\"k\">on<\/span> <span class=\"n\">cities<\/span> <span class=\"n\">city<\/span>\n                     <span class=\"k\">Index<\/span> <span class=\"n\">Cond<\/span><span class=\"p\">:<\/span> <span class=\"p\">((<\/span><span class=\"n\">name<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span> <span class=\"o\">~~*<\/span> <span class=\"s1\">'%port%'<\/span><span class=\"p\">::<\/span><span class=\"nb\">text<\/span><span class=\"p\">)<\/span>\n               <span class=\"o\">-&gt;<\/span>  <span class=\"k\">Index<\/span> <span class=\"n\">Scan<\/span> <span class=\"k\">using<\/span> <span class=\"n\">countries_pk<\/span> <span class=\"k\">on<\/span> <span class=\"n\">countries<\/span> <span class=\"n\">country<\/span>\n                     <span class=\"k\">Index<\/span> <span class=\"n\">Cond<\/span><span class=\"p\">:<\/span> <span class=\"p\">((<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span> <span class=\"o\">=<\/span> <span class=\"k\">ANY<\/span> <span class=\"p\">(<\/span><span class=\"n\">ARRAY<\/span><span class=\"p\">[(<\/span><span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"err\">$<\/span><span class=\"mi\">1<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"err\">$<\/span><span class=\"mi\">2<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"p\">...,<\/span> <span class=\"p\">(<\/span><span class=\"err\">$<\/span><span class=\"mi\">1023<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">]))<\/span>\n         <span class=\"o\">-&gt;<\/span>  <span class=\"n\">YB<\/span> <span class=\"n\">Batched<\/span> <span class=\"n\">Nested<\/span> <span class=\"n\">Loop<\/span> <span class=\"k\">Join<\/span>\n               <span class=\"k\">Join<\/span> <span class=\"n\">Filter<\/span><span class=\"p\">:<\/span> <span class=\"p\">((<\/span><span class=\"n\">city_1<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">country_1<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">)<\/span>\n               <span class=\"o\">-&gt;<\/span>  <span class=\"k\">Index<\/span> <span class=\"n\">Scan<\/span> <span class=\"k\">using<\/span> <span class=\"n\">countries_name_idx1<\/span> <span class=\"k\">on<\/span> <span class=\"n\">countries<\/span> <span class=\"n\">country_1<\/span>\n                     <span class=\"k\">Index<\/span> <span class=\"n\">Cond<\/span><span class=\"p\">:<\/span> <span class=\"p\">((<\/span><span class=\"n\">name<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span> <span class=\"o\">~~*<\/span> <span class=\"s1\">'%port%'<\/span><span class=\"p\">::<\/span><span class=\"nb\">text<\/span><span class=\"p\">)<\/span>\n               <span class=\"o\">-&gt;<\/span>  <span class=\"k\">Index<\/span> <span class=\"n\">Scan<\/span> <span class=\"k\">using<\/span> <span class=\"n\">cities_countries_fk001<\/span> <span class=\"k\">on<\/span> <span class=\"n\">cities<\/span> <span class=\"n\">city_1<\/span>\n                     <span class=\"k\">Index<\/span> <span class=\"n\">Cond<\/span><span class=\"p\">:<\/span> <span class=\"p\">((<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span> <span class=\"o\">=<\/span> <span class=\"k\">ANY<\/span> <span class=\"p\">(<\/span><span class=\"n\">ARRAY<\/span><span class=\"p\">[(<\/span><span class=\"n\">country_1<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"err\">$<\/span><span class=\"mi\">1025<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"err\">$<\/span><span class=\"mi\">1026<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"p\">...,<\/span> <span class=\"p\">(<\/span><span class=\"err\">$<\/span><span class=\"mi\">2047<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">]))<\/span>\n<span class=\"p\">(<\/span><span class=\"mi\">15<\/span> <span class=\"k\">rows<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0627\u0645\u0627 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u06a9\u0627\u0631\u0628\u0631 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc\u06cc \u0628\u0627 ORM \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f \u06a9\u0647 \u0646\u062a\u0648\u0627\u0646\u062f \u0686\u0646\u06cc\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%DB%8C%DA%A9_%D8%B3%D8%AA%D9%88%D9%86_%D8%A7%D8%B6%D8%A7%D9%81%DB%8C_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%AC%D8%B3%D8%AA%D8%AC%D9%88_%D8%AD%D9%81%D8%B8_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u06cc\u06a9 \u0633\u062a\u0648\u0646 \u0627\u0636\u0627\u0641\u06cc \u0628\u0631\u0627\u06cc \u062c\u0633\u062a\u062c\u0648 \u062d\u0641\u0638 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0646 \u06cc\u06a9 \u0633\u062a\u0648\u0646 \u0627\u0636\u0627\u0641\u06cc \u062f\u0631 &#8220;\u0634\u0647\u0631\u0647\u0627&#8221; \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u0645 \u06a9\u0647 \u0646\u0627\u0645 \u0634\u0647\u0631 \u0648 \u0646\u0627\u0645 \u06a9\u0634\u0648\u0631 \u0631\u0627 \u0628\u0627 \u06cc\u06a9 \u0634\u0627\u062e\u0635 GIN \u0631\u0648\u06cc \u0633\u0647 \u06af\u0631\u0627\u0645 \u0647\u0627 \u0628\u0647 \u0647\u0645 \u067e\u06cc\u0648\u0646\u062f \u0645\u06cc \u062f\u0647\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"k\">alter<\/span> <span class=\"k\">table<\/span> <span class=\"n\">cities<\/span> <span class=\"k\">add<\/span> <span class=\"n\">fuzzy_search<\/span> <span class=\"nb\">text<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">create<\/span> <span class=\"k\">index<\/span> <span class=\"k\">on<\/span> <span class=\"n\">cities<\/span> <span class=\"k\">using<\/span> <span class=\"n\">gin<\/span> <span class=\"p\">(<\/span><span class=\"n\">fuzzy_search<\/span> <span class=\"n\">gin_trgm_ops<\/span><span class=\"p\">);<\/span>\n\n<span class=\"k\">update<\/span> <span class=\"n\">cities<\/span>\n<span class=\"k\">set<\/span> <span class=\"n\">fuzzy_search<\/span> <span class=\"o\">=<\/span> <span class=\"n\">format<\/span><span class=\"p\">(<\/span><span class=\"s1\">'%s %s'<\/span><span class=\"p\">,<\/span><span class=\"n\">cities<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">countries<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">from<\/span> <span class=\"n\">countries<\/span> <span class=\"k\">where<\/span> <span class=\"n\">countries<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cities<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span>\n<span class=\"p\">;<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u062f\u0631 \u0627\u06cc\u0646 \u0633\u062a\u0648\u0646 &#8220;fuzzy_search&#8221; \u067e\u0631\u0633 \u0648 \u062c\u0648 \u06a9\u0646\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"n\">yugabyte<\/span><span class=\"o\">=#<\/span> <span class=\"k\">explain<\/span> <span class=\"p\">(<\/span><span class=\"n\">costs<\/span> <span class=\"k\">off<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">select<\/span> <span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span>\n<span class=\"k\">from<\/span> <span class=\"n\">cities<\/span> <span class=\"n\">city<\/span>\n<span class=\"k\">join<\/span> <span class=\"n\">countries<\/span> <span class=\"n\">country<\/span> <span class=\"k\">using<\/span><span class=\"p\">(<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">where<\/span> <span class=\"n\">fuzzy_search<\/span> <span class=\"k\">ilike<\/span> <span class=\"s1\">'%port%'<\/span><span class=\"p\">;<\/span>\n                                                         <span class=\"n\">QUERY<\/span> <span class=\"n\">PLAN<\/span>\n<span class=\"c1\">-----------------------------------------------------------------------------------------------------------------------------<\/span>\n <span class=\"n\">YB<\/span> <span class=\"n\">Batched<\/span> <span class=\"n\">Nested<\/span> <span class=\"n\">Loop<\/span> <span class=\"k\">Join<\/span>\n   <span class=\"k\">Join<\/span> <span class=\"n\">Filter<\/span><span class=\"p\">:<\/span> <span class=\"p\">((<\/span><span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">)<\/span>\n   <span class=\"o\">-&gt;<\/span>  <span class=\"k\">Index<\/span> <span class=\"n\">Scan<\/span> <span class=\"k\">using<\/span> <span class=\"n\">cities_fuzzy_search_idx<\/span> <span class=\"k\">on<\/span> <span class=\"n\">cities<\/span> <span class=\"n\">city<\/span>\n         <span class=\"k\">Index<\/span> <span class=\"n\">Cond<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"n\">fuzzy_search<\/span> <span class=\"o\">~~*<\/span> <span class=\"s1\">'%port%'<\/span><span class=\"p\">::<\/span><span class=\"nb\">text<\/span><span class=\"p\">)<\/span>\n   <span class=\"o\">-&gt;<\/span>  <span class=\"k\">Index<\/span> <span class=\"n\">Scan<\/span> <span class=\"k\">using<\/span> <span class=\"n\">countries_pk<\/span> <span class=\"k\">on<\/span> <span class=\"n\">countries<\/span> <span class=\"n\">country<\/span>\n         <span class=\"k\">Index<\/span> <span class=\"n\">Cond<\/span><span class=\"p\">:<\/span> <span class=\"p\">((<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span> <span class=\"o\">=<\/span> <span class=\"k\">ANY<\/span> <span class=\"p\">(<\/span><span class=\"n\">ARRAY<\/span><span class=\"p\">[(<\/span><span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"err\">$<\/span><span class=\"mi\">1<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"err\">$<\/span><span class=\"mi\">2<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">,<\/span> <span class=\"p\">...,<\/span> <span class=\"p\">(<\/span><span class=\"err\">$<\/span><span class=\"mi\">1023<\/span><span class=\"p\">)::<\/span><span class=\"nb\">text<\/span><span class=\"p\">]))<\/span>\n<span class=\"p\">(<\/span><span class=\"mi\">6<\/span> <span class=\"k\">rows<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0627\u0633\u062a \u06a9\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647\u200c\u0647\u0627\u06cc \u062f\u0627\u062f\u0647 SQL \u062f\u0627\u0631\u0627\u06cc \u0645\u062d\u0631\u06a9\u200c\u0647\u0627\u06cc\u06cc \u0647\u0633\u062a\u0646\u062f: \u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0648\u062f\u0646 \u0645\u0642\u062f\u0627\u0631\u06cc \u0645\u0646\u0637\u0642 \u062f\u0627\u062f\u0647 \u0634\u0641\u0627\u0641 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647.<\/p>\n<p>\u06a9\u062f \u062a\u0631\u06cc\u06af\u0631\u0647\u0627 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0627\u0644\u06af\u0648\u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0634\u0645\u0627 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0647\u0634 \u0647\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc \u0628\u0633\u062a\u06af\u06cc \u062f\u0627\u0631\u062f.  \u0645\u0648\u0627\u0631\u062f\u06cc \u06a9\u0647 \u0628\u0647 \u0622\u0646\u0647\u0627 \u062e\u0648\u0627\u0647\u0645 \u067e\u0631\u062f\u0627\u062e\u062a \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632:<\/p>\n<ul>\n<li>\u062f\u0631\u062c \u06cc\u06a9 \u0634\u0647\u0631 \u062c\u062f\u06cc\u062f \u06a9\u0647 \u0628\u0647 \u06cc\u06a9 \u06a9\u0634\u0648\u0631 \u0627\u0634\u0627\u0631\u0647 \u062f\u0627\u0631\u062f \u0628\u0627\u06cc\u062f \u0646\u0627\u0645 \u06a9\u0634\u0648\u0631 \u0631\u0627 \u0628\u0647 \u0633\u062a\u0648\u0646 \u062c\u0633\u062a\u062c\u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u062f<\/li>\n<li>\u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u06cc\u06a9 \u0634\u0647\u0631 \u0628\u0627\u06cc\u062f \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0633\u062a\u0648\u0646 \u062c\u0633\u062a\u062c\u0648 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u062f<\/li>\n<li>\u062f\u0631\u062c\u060c \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06cc\u0627 \u062d\u0630\u0641 \u06cc\u06a9 \u06a9\u0634\u0648\u0631 \u0628\u0627\u06cc\u062f \u0633\u062a\u0648\u0646 \u062c\u0633\u062a\u062c\u0648 \u0631\u0627 \u062f\u0631 \u0647\u0645\u0647 \u0634\u0647\u0631\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u0622\u0646 \u0627\u0631\u062c\u0627\u0639 \u0645\u06cc\u200c\u062f\u0647\u0646\u062f\u060c \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06a9\u0646\u062f.  \u0627\u06af\u0631 \u06a9\u0644\u06cc\u062f \u062e\u0627\u0631\u062c\u06cc \u0628\u0627 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0622\u0628\u0634\u0627\u0631\u06cc \u062f\u0627\u0631\u06cc\u062f\u060c \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0647 \u0647\u0645\u0647 \u0622\u0646 \u0645\u0648\u0627\u0631\u062f \u0646\u06cc\u0627\u0632 \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/li>\n<\/ul>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u062d\u0631\u06a9 \u0647\u0627\u06cc \u0645\u0646 \u0647\u0633\u062a\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"c1\">-- Trigger for insert, update, and delete on cities<\/span>\n<span class=\"k\">create<\/span> <span class=\"k\">or<\/span> <span class=\"k\">replace<\/span> <span class=\"k\">function<\/span> <span class=\"n\">trg_cities_fuzzy_search<\/span><span class=\"p\">()<\/span> <span class=\"k\">returns<\/span> <span class=\"k\">trigger<\/span> <span class=\"k\">as<\/span> <span class=\"err\">$$<\/span>\n<span class=\"k\">begin<\/span>\n    <span class=\"n\">if<\/span> <span class=\"n\">tg_op<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'INSERT'<\/span> <span class=\"k\">or<\/span> <span class=\"n\">tg_op<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'UPDATE'<\/span> <span class=\"k\">then<\/span>\n        <span class=\"k\">new<\/span><span class=\"p\">.<\/span><span class=\"n\">fuzzy_search<\/span> <span class=\"p\">:<\/span><span class=\"o\">=<\/span> <span class=\"n\">format<\/span><span class=\"p\">(<\/span><span class=\"s1\">'%s %s'<\/span><span class=\"p\">,<\/span> <span class=\"k\">new<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"k\">select<\/span> <span class=\"n\">name<\/span> <span class=\"k\">from<\/span> <span class=\"n\">countries<\/span> <span class=\"k\">where<\/span> <span class=\"n\">country_id<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">));<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">end<\/span> <span class=\"n\">if<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">end<\/span><span class=\"p\">;<\/span>\n<span class=\"err\">$$<\/span> <span class=\"k\">language<\/span> <span class=\"n\">plpgsql<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">create<\/span> <span class=\"k\">trigger<\/span> <span class=\"n\">trg_cities_fuzzy_search<\/span>\n<span class=\"k\">before<\/span> <span class=\"k\">insert<\/span> <span class=\"k\">or<\/span> <span class=\"k\">update<\/span> <span class=\"k\">or<\/span> <span class=\"k\">delete<\/span> <span class=\"k\">on<\/span> <span class=\"n\">cities<\/span>\n<span class=\"k\">for<\/span> <span class=\"k\">each<\/span> <span class=\"k\">row<\/span> <span class=\"k\">execute<\/span> <span class=\"k\">function<\/span> <span class=\"n\">trg_cities_fuzzy_search<\/span><span class=\"p\">();<\/span>\n\n<span class=\"c1\">-- Trigger for update and delete on countries<\/span>\n<span class=\"k\">create<\/span> <span class=\"k\">or<\/span> <span class=\"k\">replace<\/span> <span class=\"k\">function<\/span> <span class=\"n\">trg_countries_fuzzy_search<\/span><span class=\"p\">()<\/span> <span class=\"k\">returns<\/span> <span class=\"k\">trigger<\/span> <span class=\"k\">as<\/span> <span class=\"err\">$$<\/span>\n<span class=\"k\">begin<\/span>\n    <span class=\"n\">if<\/span> <span class=\"n\">tg_op<\/span> <span class=\"k\">in<\/span> <span class=\"p\">(<\/span> <span class=\"s1\">'UPDATE'<\/span> <span class=\"p\">,<\/span> <span class=\"s1\">'INSERT'<\/span> <span class=\"p\">)<\/span> <span class=\"k\">then<\/span>\n        <span class=\"k\">update<\/span> <span class=\"n\">cities<\/span>\n        <span class=\"k\">set<\/span> <span class=\"n\">fuzzy_search<\/span> <span class=\"o\">=<\/span> <span class=\"n\">format<\/span><span class=\"p\">(<\/span><span class=\"s1\">'%s %s'<\/span><span class=\"p\">,<\/span> <span class=\"n\">cities<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"k\">new<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">where<\/span> <span class=\"n\">country_id<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">elsif<\/span> <span class=\"n\">tg_op<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'DELETE'<\/span> <span class=\"k\">then<\/span>\n        <span class=\"k\">update<\/span> <span class=\"n\">cities<\/span>\n        <span class=\"k\">set<\/span> <span class=\"n\">fuzzy_search<\/span> <span class=\"o\">=<\/span> <span class=\"n\">format<\/span><span class=\"p\">(<\/span><span class=\"s1\">'%s'<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">where<\/span> <span class=\"n\">country_id<\/span> <span class=\"o\">=<\/span> <span class=\"k\">old<\/span><span class=\"p\">.<\/span><span class=\"n\">country_id<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">old<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">end<\/span> <span class=\"n\">if<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">end<\/span><span class=\"p\">;<\/span>\n<span class=\"err\">$$<\/span> <span class=\"k\">language<\/span> <span class=\"n\">plpgsql<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">create<\/span> <span class=\"k\">trigger<\/span> <span class=\"n\">trg_countries_fuzzy_search<\/span>\n<span class=\"k\">after<\/span> <span class=\"k\">update<\/span> <span class=\"k\">or<\/span> <span class=\"k\">delete<\/span> <span class=\"k\">on<\/span> <span class=\"n\">countries<\/span>\n<span class=\"k\">for<\/span> <span class=\"k\">each<\/span> <span class=\"k\">row<\/span>\n<span class=\"k\">execute<\/span> <span class=\"k\">function<\/span> <span class=\"n\">trg_countries_fuzzy_search<\/span><span class=\"p\">();<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0647\u0645\u062a\u0631\u06cc\u0646 \u0686\u06cc\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u062a\u0633\u062a \u0647\u0627\u06cc\u06cc \u0628\u0631\u0627\u06cc \u067e\u0648\u0634\u0634 \u062a\u0645\u0627\u0645 DML \u0627\u0633\u062a \u06a9\u0647 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u062f\u0631 \u0622\u0646 \u062c\u062f\u0627\u0648\u0644 \u0627\u062a\u0641\u0627\u0642 \u0628\u06cc\u0641\u062a\u062f \u0648 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 &#8220;\u0633\u062a\u0648\u0646 fuzzy_search&#8221; \u0647\u0645\u06cc\u0634\u0647 \u062f\u0631\u0633\u062a \u0627\u0633\u062a.  \u0628\u0647 \u0639\u0628\u0627\u0631\u062a \u062f\u06cc\u06af\u0631\u060c \u0647\u06cc\u0686 \u0631\u062f\u06cc\u0641\u06cc \u062a\u0648\u0633\u0637:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"k\">select<\/span> <span class=\"n\">format<\/span><span class=\"p\">(<\/span><span class=\"s1\">'%s %s'<\/span><span class=\"p\">,<\/span><span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">)<\/span> <span class=\"p\">,<\/span> <span class=\"n\">fuzzy_search<\/span> <span class=\"k\">as<\/span> <span class=\"k\">names<\/span>\n<span class=\"k\">from<\/span> <span class=\"n\">cities<\/span> <span class=\"n\">city<\/span>\n<span class=\"k\">join<\/span> <span class=\"n\">countries<\/span> <span class=\"n\">country<\/span> <span class=\"k\">using<\/span><span class=\"p\">(<\/span><span class=\"n\">country_id<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">where<\/span> <span class=\"n\">format<\/span><span class=\"p\">(<\/span><span class=\"s1\">'%s %s'<\/span><span class=\"p\">,<\/span><span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">country<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">)<\/span> <span class=\"o\">!=<\/span> <span class=\"n\">fuzzy_search<\/span>\n<span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06af\u0631 \u062a\u0633\u062a \u0627\u0633\u062a\u0631\u0633 \u0628\u0631\u0627\u06cc \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062d\u06cc\u0627\u062a\u06cc \u062f\u0627\u0631\u06cc\u062f \u06a9\u0647 \u0622\u0646 \u062c\u062f\u0627\u0648\u0644 \u0631\u0627 \u0627\u0635\u0644\u0627\u062d \u0645\u06cc \u06a9\u0646\u062f\u060c \u0628\u0627\u06cc\u062f \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0633\u0631\u0628\u0627\u0631 \u0642\u0627\u0628\u0644 \u0642\u0628\u0648\u0644 \u0627\u0633\u062a.<\/p>\n<p>\u0628\u0627 \u0627\u062c\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0631\u0627\u0647 \u062d\u0644\u060c \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062d\u062f\u0627\u0642\u0644 \u0627\u0633\u062a: \u0628\u0647 \u0633\u0627\u062f\u06af\u06cc \u0645\u0639\u06cc\u0627\u0631\u0647\u0627 \u0631\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0633\u062a\u0648\u0646\u06cc \u06a9\u0647 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0627\u0635 \u0628\u0631\u0627\u06cc \u062c\u0633\u062a\u062c\u0648\u06cc \u0641\u0627\u0632\u06cc \u062a\u0639\u06cc\u06cc\u0646 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0628\u0633\u0627\u0632\u06cc\u062f.  \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0645\u0632\u0627\u06cc\u0627\u06cc \u063a\u06cc\u0631\u0639\u0627\u062f\u06cc \u0633\u0627\u0632\u06cc (\u0641\u06cc\u0644\u062a\u0631 \u06a9\u0631\u062f\u0646 \u0642\u0628\u0644 \u0627\u0632 \u067e\u06cc\u0648\u0633\u062a\u0646) \u0631\u0627 \u0628\u062f\u0648\u0646 \u0645\u0639\u0627\u06cc\u0628 (\u0645\u0627\u0646\u0646\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0645\u0646\u0637\u0642 \u062f\u0627\u062f\u0647 \u062f\u0631 \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0631\u0627\u06cc \u062d\u0641\u0638 \u062b\u0628\u0627\u062a) \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u0628\u0627 PostgreSQL\u060c YugabyteDB \u0648 \u0647\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 PostgreSQL \u0633\u0627\u0632\u06af\u0627\u0631 \u0627\u0633\u062a\u060c \u06a9\u0647 \u0627\u0644\u0628\u062a\u0647 \u0628\u0647 \u0645\u0639\u0646\u0627\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0634\u0627\u062e\u0635\u200c\u0647\u0627 \u0648 \u0645\u062d\u0631\u06a9\u200c\u0647\u0627\u06cc GIN \u0627\u0633\u062a.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang PostgreSQL \u0628\u0647\u0628\u0648\u062f\u0647\u0627\u06cc \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647\u06cc \u0631\u0627 \u0641\u0631\u0627\u062a\u0631 \u0627\u0632 \u0646\u0645\u0627\u06cc\u0647 \u0633\u0627\u0632\u06cc \u062a\u06a9 \u0633\u062a\u0648\u0646\u06cc \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 YugabyteDB \u0646\u06cc\u0632 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0631\u0627\u06cc \u062c\u0633\u062a\u062c\u0648\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0642\u062f\u0627\u0631 \u06a9\u0627\u0645\u0644 \u0622\u0646 \u0645\u0634\u062e\u0635 \u0646\u06cc\u0633\u062a\u060c \u067e\u0633\u0648\u0646\u062f pg_trgm \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0686\u0646\u062f\u06cc\u0646 \u062a\u0631\u06cc\u06af\u0631\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062f \u0648 GIN \u0627\u06cc\u0646 \u0645\u0642\u0627\u062f\u06cc\u0631 \u0686\u0646\u062f\u06af\u0627\u0646\u0647 \u0631\u0627 \u062f\u0631 \u0647\u0631 \u0631\u062f\u06cc\u0641 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":68144,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-68143","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/68143","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=68143"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/68143\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/68144"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=68143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=68143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=68143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}