Медленный текстовый поисковый запрос с Postgres 10.6 - PullRequest
0 голосов
/ 12 февраля 2019

Я использую 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;

, но этовсе еще очень медленный.

Есть ли способ сделать такой запрос быстрым?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...