diff --git a/Dockerfile.postgres b/Dockerfile.postgres new file mode 100644 index 0000000..becae87 --- /dev/null +++ b/Dockerfile.postgres @@ -0,0 +1,14 @@ +FROM pgvector/pgvector:pg16 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends curl ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +RUN curl -fsSL -o /usr/share/postgresql/16/tsearch_data/uk_UA.aff \ + https://raw.githubusercontent.com/LibreOffice/dictionaries/master/uk_UA/uk_UA.aff \ + && curl -fsSL -o /usr/share/postgresql/16/tsearch_data/uk_UA.dic \ + https://raw.githubusercontent.com/LibreOffice/dictionaries/master/uk_UA/uk_UA.dic \ + && chmod 644 /usr/share/postgresql/16/tsearch_data/uk_UA.* + +COPY scripts/ukrainian.stop /usr/share/postgresql/16/tsearch_data/ukrainian.stop +RUN chmod 644 /usr/share/postgresql/16/tsearch_data/ukrainian.stop diff --git a/alembic/versions/02530c3f9c6b_switch_fts_to_ukrainian_config.py b/alembic/versions/02530c3f9c6b_switch_fts_to_ukrainian_config.py index b43cf8e..e671d40 100644 --- a/alembic/versions/02530c3f9c6b_switch_fts_to_ukrainian_config.py +++ b/alembic/versions/02530c3f9c6b_switch_fts_to_ukrainian_config.py @@ -44,6 +44,31 @@ """ ) + # Create stop-words dictionary for Ukrainian + op.execute( + """ + DO $$ + BEGIN + CREATE TEXT SEARCH DICTIONARY ukrainian_stop ( + TEMPLATE = simple, + STOPWORDS = ukrainian + ); + EXCEPTION WHEN duplicate_object THEN + -- already exists + END + $$; + """ + ) + + # Configure ukrainian text-search to use stop-words filtering + op.execute( + """ + ALTER TEXT SEARCH CONFIGURATION ukrainian + ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part + WITH ukrainian_stop, simple; + """ + ) + # Create immutable wrapper for ukrainian config op.execute( """ @@ -54,7 +79,7 @@ """ ) - # Add generated column using ukrainian stemmer + # Add generated column using ukrainian config op.execute( """ ALTER TABLE property_listings @@ -95,6 +120,9 @@ "DROP FUNCTION IF EXISTS to_tsvector_ukrainian(text)" ) op.execute( + "DROP TEXT SEARCH DICTIONARY IF EXISTS ukrainian_stop CASCADE" + ) + op.execute( "DROP TEXT SEARCH CONFIGURATION IF EXISTS ukrainian CASCADE" ) diff --git a/docker-compose.yml b/docker-compose.yml index 7c7820a..a9e2dd5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,8 @@ services: postgres: - image: pgvector/pgvector:pg16 + build: + context: . + dockerfile: Dockerfile.postgres container_name: vmk_postgres environment: POSTGRES_USER: postgres diff --git a/scripts/ukrainian.stop b/scripts/ukrainian.stop new file mode 100644 index 0000000..363a597 --- /dev/null +++ b/scripts/ukrainian.stop @@ -0,0 +1,152 @@ +а +без +біля +більш +був +була +були +було +бути +в +вам +вас +весь +вздовж +ви +від +він +все +всередині +всі +всього +всьому +від +гаразд +для +до +з +за +завдяки +замість +і +із +інших +її +його +йому +кожен +кожна +кожне +кожні +котрий +котра +котре +котрі +крізь +крім +коли +ледь +між +мене +мені +ми +мій +мною +моєї +моєму +мої +моїй +моїм +мою +моя +на +над +нам +нами +нас +наш +наша +наше +наші +не +неї +немає +нижче +ні +ніж +о +об +обидва +од +один +одна +однак +одне +он +особливо +під +після +по +повз +поки +при +про +проте +проти +сам +сама +саме +самі +само +самого +самому +свій +себе +собі +собою +спереду +та +так +такий +також +там +те +тебе +тобі +тобою +того +тоді +той +тому +ту +тут +ті +тільки +у +усе +усі +усього +хоча +хто +це +цей +цього +цьому +через +чи +чия +чий +чим +чого +чому +шляхом +ще +що +щоб +я +як +яка +який +якого +якої +якщо \ No newline at end of file