Re: Создание GIST индексам для сравнения картинок (intarray)

Поиск
Список
Период
Сортировка
От Oleg Bartunov
Тема Re: Создание GIST индексам для сравнения картинок (intarray)
Дата
Msg-id Pine.LNX.4.64.1102061552100.31836@sn.sai.msu.ru
обсуждение исходный текст
Ответ на Создание GIST индексам для сравнения картинок (intarray)  ("leopard_ne@inbox.ru" <leopard_ne@inbox.ru>)
Ответы Re: [pgsql-ru-general] Создание GIST индексам для сравнения картинок (intarray)  (Sergey Konoplev <gray.ru@gmail.com>)
Re: Создание GIST индексам для сравнения картинок (intarray)  ("leopard_ne@inbox.ru" <leopard_ne@inbox.ru>)
Список pgsql-ru-general
Можно попробовать использовать GIN индекс по полю diff_array, который
ускоряет операцию &&

CREATE OR REPLACE FUNCTION intersection(anyarray, anyarray) RETURNS anyarray as
$$
SELECT ARRAY(
    SELECT $1[i]
    FROM generate_series( array_lower($1, 1), array_upper($1, 1) ) WHERE ARRAY[$1[i]] && $2 );
$$ language sql;


Олег

On Sun, 6 Feb 2011, leopard_ne@inbox.ru wrote:

> Добрый день. Прошу совета у сообщества.
> Есть простой метод сравнения картинок -
> http://leopard.in.ua/2010/12/09/bystroe-sravnenie-izobrazhenij-s-pomoshhyu-rubyphp-i-postgresql/
>
> В таблицу записывается в поле типа integer[] масив с числами (пусть поле
> будет "diff_array" в таблице "some_table"). Далее происходит такой метод
> поиска похожих картинок (пусть есть массив картинки "{1,3,4,5,...}"
> размером 225, как в статье)
>
> Select some_table.*, round((icount(some_table.diff_array::int[] &
> '{1,3,4,5,...}'::int[])::numeric / (225)::numeric) * 100, 2) as
> simillar_percentes FROM some_table WHERE
> round((icount(some_table.diff_array::int[] &
> '{1,3,4,5,...}'::int[])::numeric / (225)::numeric) * 100, 2) >= 60 AND
> id != img_id ORDER BY round((icount(some_table.diff_array::int[] &
> '{1,3,4,5,...}'::int[])::numeric / (225)::numeric) * 100, 2) DESC LIMIT 10
>
> Проблемный кусок, который используется 3 раза тут в запросе:
>
> round((icount(some_table.diff_array::int[] &
> '{1,3,4,5,...}'::int[])::numeric / (225)::numeric) * 100, 2)
>
> Хотелось бы как то по такому условию создать индекс, поскольку скорость
> падает (индекс gist__intbig_ops добавлял, скорость все равно не
> увеличивается).
> Для простоты вычисления размера массива (чтобы не задать 225 = 15*15
> матрица), можно сделать так функцию:
>
> round((icount(some_table.diff_array::int[] &
> '{1,3,4,5,...}'::int[])::numeric /
> ((icount(some_table.diff_array::int[]) + icount('{1,3,4,5,...}'::int[]))
> / 2)::numeric) * 100, 2)
>
> Документацию
> http://www.sai.msu.su/~megera/postgres/talks/gist_tutorial.html
> <http://www.sai.msu.su/%7Emegera/postgres/talks/gist_tutorial.html> я
> прочитал, но не работаю на C, и поэтому, возникло еще больше вопросов,
> как все таки мне можно создать индекс на подобное условие. Буду
> благодарен за любые советы или помощь.
>
>

     Regards,
         Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83

В списке pgsql-ru-general по дате отправления:

Предыдущее
От: "leopard_ne@inbox.ru"
Дата:
Сообщение: Создание GIST индексам для сравнения картинок (intarray)
Следующее
От: Sergey Konoplev
Дата:
Сообщение: Re: [pgsql-ru-general] Создание GIST индексам для сравнения картинок (intarray)