Введение
GIN расшифровывается как Generalized Inverted Index (Обобщенный инвертированный индекс). GIN предназначен для случаев, когда индексируемые элементы являются составными значениями, а запросы, обрабатываемые индексом, должны искать значения элементов, которые появляются в составе составных элементов. Например, элементы могут быть документами, а запросы - поиском документов, содержащих определенные слова.
Мы используем слово элемент для обозначения составного значения, которое должно быть проиндексировано, и слово ключ для обозначения значения элемента. GIN всегда хранит и ищет ключи, а не значения элементов как таковые.
Индекс GIN хранит набор пар (ключ, список проводок), где список проводок - это набор идентификаторов строк, в которых встречается ключ. Один и тот же идентификатор строки может встречаться в нескольких списках проводок, поскольку элемент может содержать более одного ключа. Каждое значение ключа хранится только один раз, поэтому индекс GIN очень компактен для случаев, когда один и тот же ключ встречается много раз.
GIN является обобщенным в том смысле, что коду метода доступа GIN не нужно знать конкретные операции, которые он ускоряет. Вместо этого он использует пользовательские стратегии, определенные для конкретных типов данных. Стратегия определяет, как извлекаются ключи из индексированных элементов и условий запроса, а также как определить, удовлетворяет ли строка, содержащая некоторые значения ключей в запросе, запросу.
Одно из преимуществ GIN заключается в том, что он позволяет разрабатывать пользовательские типы данных с соответствующими методами доступа экспертом в области типа данных, а не экспертом по базам данных. Это практически то же самое преимущество, что и у GiST.