Повторное использование составного индекса Google App Engine - PullRequest
3 голосов
/ 25 февраля 2011

У меня есть приложение Google App Engine с определенной моделью, назовем его Game. Это относится к футбольной игре, ее дате, рефери (ссылка), списку из 2 клубов (ссылки), счету, его фазе (ссылка), соревнованию (ссылка) и сезону (ссылка). Другими словами, в нем есть несколько полей, которые я собираюсь сделать доступными для поиска на странице расширенного поиска.

Например, если кто-то хочет найти все игры по сезону (скажем, 2008/2009) и по дате (скажем, после 01.01.2009), я должен проанализировать переменные GET и получить что-то вроде:

games = Game.all()   
// parse GET variables. 
if (variables.hasFilter("season")    
games.filter("game_season = ", season)
if (variables.hasFilter("after_date")    
games.filter("game_date > ", after_date)

Требуется специальный составной индекс:

- kind: Game
  properties:
  - name: game_season
  - name: game_date

Теперь, если кто-то хочет найти Сезон и Клуб, он будет таким же, как указано выше, за исключением того, что для него требуется другой составной индекс:

- kind: Game
  properties:
  - name: game_season
  - name: game_club

Теперь, если кто-то хочет найти сезон, дату и клуб, ему нужен даже другой составной индекс:

- kind: Game
  properties:
  - name: game_season
  - name: game_date
  - name: game_club

У меня вопрос: если у меня есть третий готовый индекс и который обслуживает запросы, могу ли я удалить два первых индекса, так как он может быть использован для обслуживания трех вышеупомянутых расширенных поисков, или Google App Engine сгенерирует NeedIndexError, поскольку Не знаете, как повторно использовать третий индекс для обслуживания первых двух расширенных поисков?

Проблема в том, что я хотел бы создать расширенный поиск по нескольким полям (скажем, 6 - дата, сезон, соревнование, клуб, фаза, счет). Для этого потребуется комбинация индексов с двумя сущностями, комбинация индексов с 3 сущностями и т. Д. До окончательного индекса, объединяющего все сущности.

Вопросы:

  • Может ли GAE действительно повторно использовать составные индексы, чтобы при создании, скажем, составного индекса для 6 сущностей мне не приходилось генерировать более простые версии этого индекса для 5, 4, 3 и 2 сущностей?

  • Если нет, есть ли лучший способ решения этой проблемы? Единственное, что я планирую сделать, это вставить «пустые» фильтры, например, при поиске игр в определенном сезоне и клубе:

    games = Game.all ()
    // анализируем переменные GET if (variables.hasFilter ("season")
    games.filter ("game_season =", сезон) еще games.filter ("game_season =" *)

    if (variables.hasFilter ("date")
    games.filter ("game_date =", date) еще games.filter ("game_date =" *)

    if (variables.hasFilter ("club")
    games.filter ("game_club =", club) еще games.filter ("game_club =" *)

Я не реализовал этот обходной путь, потому что считаю его уродливым, а это значит, что это не лучший способ справиться с этой проблемой. (также, я все еще не знаю, как реализовать подстановочные знаки).

Спасибо за любой вклад по этой проблеме.

1 Ответ

4 голосов
/ 28 февраля 2011

Поскольку хранилище данных App Engine не имеет схемы, последний индекс нельзя использовать для удовлетворения запросов к первым, поскольку он индексирует только те объекты, для которых определены все три свойства.

Вставка «пустых» фильтров также не будет работать, поскольку она будет возвращать только сущности, для которых установлены пустые строки для этих свойств, а не будет возвращать сущности с любым значением (что, как вам кажется).

Один из вариантов - полагаться на стратегию объединения слиянием - App Engine может выполнить запрос с любым количеством фильтров равенства, если нет фильтров неравенства или порядков сортировки без пользовательского индекса. Другой вариант - использовать StringListProperty, заполненный всеми «флагами», которые применяются к объекту, и выполнять запросы в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...