Запросы без дополнительного индекса в GAE - PullRequest
1 голос
/ 13 апреля 2011

В приложении Google App Engine (GAE / Java) у меня есть такой класс:

public class Person{
    private int born;
    private String sex;
    private List<String> likes;
    //some other fields
    ...
}

Мне нужно, чтобы пользователь приложения мог выполнять поиск в разных полях.Например, пользователь может запросить поиск:

  1. Все люди, которые родились после 1975 года и любят картофель и рыбу
  2. Все женщины, которые родились до 1980 года и любят морковь

Я имею в виду, что запросы могут иметь различное количество фильтров. Очень важно, чтобы запрос не нуждался в дополнительном индексе , поэтому я прочитал документацию и там говорится, что запросы, использующие только равенство, не нуждаются в дополнительном индексе.

Поэтому я подумал об использовании оператора IN (потому что он покрывается оператором равенства) следующим образом:

select from Person where 
likes IN ("potatoes", "fish") AND
born IN (1975,1976....2011)

select from Person where 
sex = 'female' AND
likes = "carrots" AND
born IN (1900,1901....1980)

Проблема в том, что, как указано в документации:

Оператор IN также выполняет несколько запросов, по одному для каждого элемента в предоставленном значении списка, где все остальные фильтры одинаковы, а фильтр IN заменяется фильтром, равным равному.Результаты объединяются в порядке пунктов в списке.Если запрос имеет более одного фильтра IN, запрос выполняется как несколько запросов, по одному для каждой комбинации значений в фильтрах IN.

Один запрос, содержащий операторы NOT_EQUAL или IN , ограничен 30подзапросы.

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

Как мне разработать решение, которое решает эту проблему?

Спасибо

1 Ответ

2 голосов
/ 14 апреля 2011

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

, который изменится в будущем из-за полнотекстового поиска (в дорожной карте ), размещенные базы данных SQL ( в App Engine для бизнеса ) и улучшения механизма запросов , описанные Альфредом Фуллером .если вы не можете ждать их, вам нужно искать в другом месте.

...