Postgresql

在 Postgres 中同時搜尋大量人員

  • May 24, 2022

2-5k我有一個在具有這種通用格式的條目之間變化的人員列表:

firstname1 lastname1, firstname2 lastname2, firstname3 lastname3 ...

我有一個user_table包含關於250-300k帶有firstnamelastname列的條目。我要做的是讓使用者將該名稱列表輸入到一個欄位中,並返回數據庫中具有匹配名稱的所有使用者。我的第一個直覺是創建一個name_search看起來像這樣的視圖 ->

create view name_search as (
 select
   id,
   to_tsvector(concat(firstname, ' ', lastname)) as search_field
 from user_table
)

然後我可以通過將逗號分隔列表中的所有名稱轉換為這樣的字元串來搜尋它

const queryString = "(firstname1 <-> lastname1) | (firstname2 <-> lastname2) | (firstname3 <-> lastname3) ..."

然後我可以將該字元串傳遞給這個查詢

select
 *
from name_search 
where search_field @@ to_tsquery(queryString)

我省略了一些細節,比如轉義字元串等,但我的問題是這非常慢。我想知道是否有人可以幫助我創建一個更快的解決方案。

我在這裡看不到全文搜尋的案例。

您可以按原樣為此查詢提供輸入字元串:

SELECT t.id, firstname, lastname
FROM   user_table t
JOIN  (
  SELECT split_part(fullname, ' ', 1) AS firstname
       , split_part(fullname, ' ', 2) AS lastname
  FROM   unnest(string_to_array('firstname1 lastname1, firstname2 lastname2, firstname3 lastname3', ', ')) fullname
  ) input USING (firstname, lastname);

(firstname, lastname)當輸入列表不太長時,索引應該有助於提高性能。對於檢索超過百分之幾的所有行,順序掃描無論如何都會更快。

有關的:

引用自:https://dba.stackexchange.com/questions/312495