GIN индекс
GIN (Generalized Inverted Index) — инвертированный индекс, который позволяет реализовать что-то на подобии полнотекстового поиска. Активно используется в PostgreSQL.
Механизм работы индекса достаточно прост. Берем текст, разбиваем его на слова. Дальше эти слова добавляются в хеш-таблицу в качестве ключей, а в качестве значений массив с айдишниками записей, в которых встречается это слово.
Чтобы найти записи достаточно разбить поисковую строку на слова. Дальше для этих слов достать айдишники записей из хеш-таблицы и объединить их. В итоге получаем список найденных записей.
На в реальных системах этот индекс работает немного сложнее. В индексе хранятся не сами слова, а их лексемы. Они определяют основу слова, исключают разные языковые вариации и позволяют более широко искать слова в тексте.
Для создания лексем обычно есть словарь, который на вход принимает слово а результатом является лексема.
Вообще GIN индекс похожий на алфавитный указатель в конце книги, где для каждого термина приведен список страниц в которых этот термин упоминается.

Ниже небольшая реализация самого простого индекса на C#: