I've been reading through [this excellent answer](https://dba.stackexchange.com/a/103823/150338) to understand how pg_trgm works a bit, but I'm still unclear on the most efficient way of solving this query (efficient in terms of speed of search): I have a table `search` that I run trigram searches on that looks like this: ``` Column | Type | Modifiers -------------+---------+----------- id | bpchar | collate C user_id | integer | type | text | search_on | text | collate C data | json | Indexes: "index_search_id" UNIQUE, btree (id) "index_search_search_on" gist (search_on gist_trgm_ops) "index_search_type" btree (type) "index_search_user_id" btree (user_id) ``` In this scenario, `user_id` is `NULLable` and `type` is _also_ `NULLable`. The queries I'd run amount to these possibilities: 1. Search for rows `WHERE user_id = 123 OR user_id IS NULL AND search_on % 'mystring'` 2. Search for rows `WHERE user_id = 123 OR user_id IS NULL AND type='my-type' AND search_on % 'mystring'` In plain words, I want all rows that have _my_ user_id or NULL user_id, optionally are categorized by `type`, and match the term being passed in. Right now I just have individual indexes on the 3 columns (as shown above) that can change based on the query. I understand however that a single index is generally more efficient. Is it possible to use a single index that does trigram searches, but also exact match on `user_id` and `type` where they can optionally be `NULL`