2013-05-31 5 views
1

У меня есть база данных Postgres, содержащая фотографии, и я хочу, чтобы люди искали их по цвету. У меня уже есть несколько цветов (1-5), определенных для каждой фотографии, и я использую LAB colours (перцептивное цветовое пространство, определенное в трех измерениях: легкость плюс два цветовых измерения).Пространственный индекс Postgres для цветов LAB?

Мой вопрос: что это лучший способ сделать это в Postgres? Это, по сути, трехмерный поиск, поэтому я должен использовать пространственный индекс?

Мои требования:

  • запустить поиск ограничивающего прямоугольника по цвету (найти фотографии с цветами в пределах расстояния X цвета Y).
  • рейтинг результатов по расстоянию от цвета X (возврат фотографий с цветами, ближайшими к цвету Y)
  • r-tree-like performance.

Я построил доказательство концепции с использованием индекса rtree в Python, и он работает очень хорошо. Я просто не уверен, как его реплицировать с помощью таблиц Postgres.

+0

... или, может быть, многомерный массив был бы более уместным? – Richard

+0

Вы ** пробовали **, используя функцию rtree postgres? Но обратите внимание, что Postgres rtree действительно транзакционный. Индекс только для чтения в памяти, скорее всего, будет быстрее, поэтому, если вам не нужны транзакции, вы можете заплатить высокую цену за то, что вам не нужно. –

+0

Интуитивно вы хотите сохранить и запросить 3D-очки. Но встроенные типы геометрии 2d ... Тем не менее, вы можете обойти ограничение, учитывая, что цветовой компонент в цветовом пространстве Lab фактически является частью (a, b) - точкой 2d. –

ответ

0

Я вижу несколько вариантов. PostGIS имеет многомерные типы геометрии, которые могут дать именно то, что вы ищете. Например, вы можете делать ограничивающие прямоугольники над трехмерными точками. Это было бы проще всего.

PostGIS - это Geospacial add-on, но его можно использовать и для большого количества других вещей. То, что вы ищете, является пространственным, даже если не ГИС, и это может быть лучшим инструментом для работы. PostGIS будет обрабатывать все ваши потребности в индексировании, включая поиск расстояния и т. П.

Если это неприемлемо, вы можете написать свои собственные типы. Вы, вероятно, захотите также написать GiST-операторы, и там есть довольно большая кривая обучения.

Смежные вопросы