From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Индекс для автокомплита |
Date: | 2015-01-10 00:05:02 |
Message-ID: | 20150110000501.GA6552@vdsl.uvw.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-ru-general |
Имеется БД в которой есть текстовое поле где хранится одно или
несколько слов в каждом
id text
1 Привет
2 Привет медвед
3 вася
4 пупкин
5 вася пупкин
6 вася пупкин сказал привет медвед
...
Далее пользователь начинает вводить текст, хотим комплитить ему считая
что он вводит с начала слова. пользователь может ввести несколько слов
что сделали:
1. написали функцию которая по фразе возвращает массив составляющих ее
сабфраз array[] по убыванию, пометили ее immutable
(то есть на фразу 'вася пупкин сказал привет медвед' будет 5
вариантов: 'вася пупкин сказал привет медвед', 'пупкин сказал привет
медвед', 'сказал привет медвед', 'привет медвед' и 'медвед')
2. построили 5 индексов по первым 5 словам в каждой фразе
3. при поиске выбираем по 20 штук из каждого индекса и смешиваем
ну и получается человек начинает вводить 'мед' получает 2 и 6 вариант
а начинает вводить 'при' получает 1, 2, 6 варианты (в индексе lower
лежат)
все работает ок, но есть ОЧЕНЬ редкие случаи когда пользователь
начинает вводить 6 или 7 слово.
можно и по ним конечно индексы достроить...
но в целом примененный подход по сути итак равен 5 выборкам из
индекса, плюс куча избыточных данных в выборке.
может как-то можно подобную задачу решить более оригинально?
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From | Date | Subject | |
---|---|---|---|
Next Message | Petr Korobeinikov | 2015-01-10 12:49:18 | Re: [pgsql-ru-general] Индекс для автокомплита |
Previous Message | Andrey Lizenko | 2015-01-08 22:37:51 | Re: [pgsql-ru-general] Как заставить Pg использовать индекс? |