Re: hstore - релевантн

From: Teodor Sigaev <teodor(at)sigaev(dot)ru>
To: Ilia Kantor <ilia(at)obnovlenie(dot)ru>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: hstore - релевантн
Date: 2005-11-07 15:03:28
Message-ID: 436F6CC0.4080009@sigaev.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(at)sigaev(dot)ru
WWW: http://www.sigaev.ru/

In response to

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Teodor Sigaev 2005-11-07 16:59:59 ,
Previous Message Ilia Kantor 2005-11-07 13:54:58 hstore - релевантность