Я использую Postgres 10.6, и у меня есть таблица с 30M-адресами, которые я объединил в один столбец (textsearch
):
create table my_addresses as
SELECT
concat_ws(' ', my_text_id, full_address, postcode, business_name) as address,
to_tsvector('english', concat_ws(' ', my_text_id, full_address, postcode, business_name)) as textsearch
from my_data;
Вдобавок к этому я создал индекс с
CREATE INDEX ON my_addresses USING GIN (textsearch);
Я пытаюсь добиться свободного текстового поиска (например, Google), где я могу ввести любой текст и выбрать 10 самых похожих адресов.Поэтому я запрашиваю с помощью:
SELECT address, similarity('flat 11 peabody se17 1bt', address) AS simil
FROM my_addresses
select * from x
ORDER BY simil DESC
LIMIT 10;
В результате запрос выглядит нормально, но он очень очень медленный и выглядит так, будто даже не использует индекс.
Итак, я создал альтернативуиндекс, на этот раз основанный на поле address
следующим образом:
CREATE INDEX ON my_addresses USING GIN (address gin_trgm_ops);
и изменил запрос следующим образом:
SELECT address, similarity('flat 11 peabody se17 1bt', address) AS simil
FROM my_addresses
where addresses % 'flat 11 peabody se17 1bt'
ORDER BY simil DESC
LIMIT 10;
На этот раз используется индекс, но он все еще оченьмедленно (около 1 минуты).
Итак, я попробовал новый индекс:
CREATE INDEX ON my_addresses USING GIST (address gist_trgm_ops);
и снова изменил запрос следующим образом:
SELECT address, address <-> 'flat 11 peabody se17 1bt' AS dist
FROM my_addresses
ORDER BY dist LIMIT 10;
, но этовсе еще очень медленный.
Есть ли способ сделать такой запрос быстрым?