Postgresql
如何索引文本postgresql 中的欄位?
我有兩列:
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]);