Паспорт) с опечатками и выдавать лучшее найденное совпадение в Postgres. При чем искать опечатки по всему набору полей. Например имя и фамилия могут быть записаны так - "Ива нИванов" и тп приколы. Есть идея делать это следующим образом: склеить все поля в строку, разделив пробелом, положить в колонку типа TEXT, накинуть GiST и искать по этому "ключу". Проверил на 1млн записей - полет отличный. Всего таблица будет порядка 200млн записей.
При поиске буду находить наиболее "похожую" запись и программно разбивать строку на поля и перекладывать в json.
Насколько это норм идея?
а зачем разбивать если у тебя в базе исходные данные есть? Обычно проблема именно с тем как искать по нескольким словам. Опечатки это поиск по триграммам всяким и т.д. и нужно еще готовить поисковой запрос нормально... Можно даже не особо склеивать а просто индекс по выражению делать
Изначально база пустая и будет накапливаться. Накапливается не без ошибок. Да, проблема как искать по нескольким. В запросе участвуют все поля. Их штук 7. Вот я пытаюсь понять как это сделать эффективно. А выражение какое? Которое затрагивает несколько столбцов?
сколько полей по которым ищешь не особо важно, важно скорее сколько слов в запросе. Если там имена, то у тебя могут быть опечатки и в фамилии и в имени и т.д.
ну тип постгрес позволяет индексы по выражениям строить. Тип если ты юзаешь какой-нибудь concat_ws(' ' , firat_name, last_name, middle_name) то можно просто индекс по этому выражению жахнуть. Что бы не создавать лишних колонок и прочего. Но если есть возможность в коде потом ничего не "расклеивать" и юзать оригинальные данные то лучше так
В запросе все поля.
что пишут в поиске. Ну мол "вася пупкин 1990 года рождения" или там чего другое.
На счет выражения понял. Просто думал не хранить поля как отдельные столбцы, а именно из все склеить и в один сложить. Потом так же разложить при чтении
ну вот зачем себе сложности создавать?
Из соображений эффективности. Индекс по столбцу и индекс по выражению из 7 столбцов вроде разные вещи
для постгреса нет разницы
Обсуждают сегодня