Re: hstore - релевантн
От | Teodor Sigaev |
---|---|
Тема | Re: hstore - релевантн |
Дата | |
Msg-id | 436F6CC0.4080009@sigaev.ru обсуждение исходный текст |
Ответ на | hstore - релевантность ("Ilia Kantor" <ilia@obnovlenie.ru>) |
Ответы |
RE: [pgsql-ru-general] hstore - релевантность
|
Список | pgsql-ru-general |
> Можно ли на основе текущего кода реализовать такой поиск 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/
В списке pgsql-ru-general по дате отправления: