GIN индекс: сортировка

From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: GIN индекс: сортировка
Date: 2014-09-29 14:39:31
Message-ID: 20140929143931.GE30939@vdsl.uvw.ru
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

есть большая база текстушек

id, text1, text2, text3, text4, ... text10

она местами разрежена (то есть text3 и text5 скажем могут быть равны
null)

далее

в поисковом запросе юзер вводит поля через запятую от одного до десяти
полей, но может вводить их в разном порядке

соответственно построил я GIN индекс так

CREATE INDEX ... USING
GIN ((ARRAY[text1, text2, text3, text4, ... text10]))

далее ищу в таблице так

SELECT
*
FROM
table
WHERE
ARRAY[text1, text2, text3, text4, ... text10] @>
ARRAY[user_text1, ... user_textn]

LIMIT
10

Ищет быстро и хорошо

но хочется тут двух вещей

1. сортировки по близости

то есть хочу чтобы сперва выдавались наиболее (или наоборот наименее)
заполненные записи.

то есть если в базе лежит

'text1', NULL, NULL, 'text4', 'text5', ...
'text1', 'text2', 'text3', 'text4', 'text5', ...

А юзер в поиске прислал text1 и text4, то я хочу чтобы либо первый
вариант выдавался в первую очередь, либо наоборот - второй, в
зависимости от настроек.

вопрос: можно ли выбрать это из индекса?

2. сортировки по порядку

если юзер ввел 'text5', 'text1', можно ли чтобы это либо не
находилось, либо иметь возможность чтобы оно попадало куда-то вглубь
выборки (то есть первыми выводились бы записи с текстовым И
позиционным совпадением, а далее только текстовым)?

Ну и еще вопрос, уже наверное не про GIN, хотя может и про него

предполагаем что пользователь вводит фразу

text1, text2, abc

сплитим фразу по запятым,
все кроме последней части считаем точными совпадениями, а вот
последнюю часть считаем частью ввода.

то есть хочу чтобы индекс отвечал на вопрос

"все поля, содержащие в себе text1 и text2 и плюс к этому любое поле,
начинающееся (или содержащее в себе) с букв abc"

Можно ли последнее упихать как-то в ОДИН индекс?

--

. ''`. 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

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Oleg Bartunov 2014-09-29 17:21:55 Re: [pgsql-ru-general] GIN индекс: сортировка
Previous Message Dmitry E. Oboukhov 2014-09-24 19:52:40 Re: Анонс: PostgreSQL-сообщество, Москва, Россия