Привет всем. Надеюсь, у вас все хорошо, я работаю над поисковой системой, критичной ко времени, и хочу знать, есть ли способ получать поток записей по очереди по марширующему запросу.
Как и в моем случае, у меня есть таблица из 40 миллионов записей, и я хочу выполнить поиск по строке поиска, но если строка поиска уникальна (содержит редкие записи) или занимает много времени, потребовалось время, чтобы просмотреть все записи, а затем вернуть результат, который время дорого.
Я уже использую индексирование (ts_vector, GIN), но без помощи.
Поисковый запрос:
explain analyze
Select "SNR_SKU",
"SNR_Title",
"SNR_ModelNo",
"SNR_Brand",
"SNR_UPC",
"SNR_Available",
"SNR_ProductURL",
"SNR_ImageURL",
"SNR_Description",
"SNR_isShow",
"SNR_Date",
"SNR_Category",
"SNR_Condition",
"SNR_SubCategory",
"SNR_PriceBefore",
"SNR_CustomerReviews",
"SNR_Price"
from (
Select *,
similarity('apple iphone 5s 16gb',"SNR_Title") as rank
from products_allproducts
Where "SNR_Title" ~ 'apple'
AND "SNR_Title" ~ 'iphone'
AND "SNR_Title" ~ '5s'
AND "SNR_Title" ~ '16gb'
ORDER BY rank DESC LIMIT 36 OFFSET 0
) AS rankTable;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Subquery Scan on ranktable (cost=1974848.30..1974848.32 rows=1 width=450) (actual time=16316.394..16316.395 rows=1 loops=1)
-> Limit (cost=1974848.30..1974848.31 rows=1 width=490) (actual time=16316.392..16316.393 rows=1 loops=1)
-> Sort (cost=1974848.30..1974848.31 rows=1 width=490) (actual time=16316.391..16316.391 rows=1 loops=1)
Sort Key: (similarity('apple iphone 5s 16gb'::text, (products_allproducts."SNR_Title")::text)) DESC
Sort Method: quicksort Memory: 25kB
-> Gather (cost=1000.00..1974848.29 rows=1 width=490) (actual time=16302.006..16316.383 rows=1 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Parallel Seq Scan on products_allproducts (cost=0.00..1973848.19 rows=1 width=490) (actual time=11275.609..16294.657 rows=0 loops=3)
Filter: ((("SNR_Title")::text ~ 'apple'::text) AND (("SNR_Title")::text ~ 'iphone'::text) AND (("SNR_Title")::text ~ '5s'::text) AND (("SNR_Title")::text ~ '16gb'::text))
Rows Removed by Filter: 6722677
Planning time: 0.902 ms
Execution time: 16462.318 ms
(13 rows)
Спасибо.
Вот мой план запроса: