> Можно ли на основе текущего кода реализовать такой поиск hstore, который
> возвращал бы значения, отсортированные
> по степени близости к искомому?
>
> Т.е, например, при поиске хэша { ‘k1’=>’v1’, ‘k2’=>’v2’, ‘k3’=>’v3’ },
> возвращались бы сначала точные совпадения,
> потом – совпадения по 2м ключам, потом по 1му ключу..
>
> Или использовалась бы какая-нибудь другая функция, определяющая
> релевантность.
>
> При этом, естественно, хочется избежать варианта, когда выбираются все
> записи, считается релевантность и выдается результат..
Написать ф-цию ранжирования не сложно, но избежать выборки всего честным образом
невозможно... Дело в том, что ф-ция ранжирования будет вызываться для всех
найденных значений.
Можно сделать так (образец есть в contrib/pg_trgm):
Создать ф-цию "похожести" двух hstore, возвращающую float от 0(нет ничего
общего) до 1 (тождественность) и операцию похожести, возвращающую true, если
аргументы похожи и false в противном случае. Операция базируется на ф-ци
измерения похожести и "уровне отсечения", хранимом в статической переменной в
сошке. Т.е. если похожесть меньше уровня - возвращаем false. Индекс также можно
обучить использовать этот уровень. Недостаток такого решения: априори не
известна величина "уровня отсечения" - если он мал, находиться будет практически
все и всегда, если велик - велика вероятность вообще не найти хотя бы
сколько-нибудь похожих записей.
--
Teodor Sigaev E-mail: teodor@sigaev.ru
WWW: http://www.sigaev.ru/