Postgresql

如何索引文本postgresql 中的欄位?

  • September 14, 2018

我有兩列:

alternate_names text[]
first_name character varying

我不確定如何為這種類型的查詢編寫索引?

SELECT "people".* FROM "people" 
WHERE (lower(first_name) = 'Balzaretti' OR 'Balzaretti' ILIKE ANY (alternate_first_names));

您可能可以使用該citext模組不區分大小寫地查詢事物。但我寧願在系統中強制規定只儲存小寫值,只查詢小寫值。任何一個都可以讓你擺脫 ILIKE,然後讓你在數組值上使用合適的 GIN 索引。

這確實會產生一個煩人的語法問題,因為沒有內置運算符來詢問數組是否包含標量,您必須詢問數組是否包含恰好包含一個元素的另一個數組。

create index on people (first_name);
create index on people using GIN (alternate_names);
select * from people where lower('Balzaretti')=first_name or
   ARRAY[lower('Balzaretti')] && alternate_names;

如果您不想指定名稱兩次(並避免在執行時使用 BitmapOr),您可以將 first_name 組合到alternate_names 列表中,方法是更改​​程式碼以執行此操作,或者使用表達式索引:

create index on people using GIN ((alternate_names || ARRAY[first_name]));
select * from people where 
   ARRAY[lower('Balzaretti')] && (alternate_names || ARRAY[first_name]);

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