Сначала немного истории: GeoModel - это библиотека, которую я написал, которая добавляет базовые функции геопространственной индексации и запросов к приложениям App Engine. Это похоже на подход к геохашированию. Эквивалентный хэш местоположения в GeoModel называется «геоэлемент».
В настоящее время библиотека GeoModel добавляет 13 свойств (location_geocell__n_, n = 1..13) для каждого объекта, учитывающего местоположение. Например, сущность может иметь значения свойств, такие как:
location_geocell_1 = 'a'
location_geocell_2 = 'a3'
location_geocell_3 = 'a3f'
...
Это необходимо для того, чтобы не использовать фильтр неравенства во время пространственных запросов.
Проблема подхода с 13 свойствами заключается в том, что для любого гео-запроса, который приложение хотело бы запустить, необходимо определить и построить 13 новых индексов. Это определенно хлопот в обслуживании, как я только что болезненно осознал, переписывая демонстрационное приложение для проекта. Это приводит к моему первому вопросу:
ВОПРОС 1: Существуют ли какие-либо существенные издержки хранения на индекс? то есть, если у меня есть 13 индексов с n сущностями в каждом, по сравнению с 1 индексом с 13n сущностями в нем, намного ли хуже первый с точки зрения хранения?
Похоже, что ответ на (1) - нет, согласно этой статье , но я просто хотел бы посмотреть, имел ли кто-либо другой опыт.
Теперь я рассматриваю настройку библиотеки GeoModel, чтобы вместо 13 строковых свойств был только один StringListProperty с именем location_geocells, то есть::1024*
location_geocells = ['a', 'a3', 'a3f']
В результате получается намного чище index.yaml
. Но я ставлю под сомнение последствия для производительности:
ВОПРОС 2: Если я переключусь с 13 строковых свойств на 1 StringListProperty, это повлияет на производительность запроса; мой текущий фильтр выглядит так:
query.filter('location_geocell_%d =' % len(search_cell), search_cell)
и новый фильтр будет выглядеть так:
query.filter('location_geocells =', search_cell)
Обратите внимание, что первый запрос имеет пространство поиска _n_ сущностей, тогда как второй запрос имеет пространство поиска _13n_ сущностей.
Похоже, что ответ на вопрос (2) заключается в том, что оба результата приводят к одинаковой производительности запросов, за совет № 6 в этом сообщении в блоге , но, опять же, я хотел бы посмотреть, есть ли у кого-то отличающиеся опыт реального мира с этим.
Наконец, если у кого-то есть какие-либо другие предложения или советы, которые могут помочь улучшить использование хранилища, производительность запросов и / или простоту использования (в частности, w.r.t. index.yaml), пожалуйста, дайте мне знать! Источник можно найти здесь geomodel & geomodel.py