В приложении Google App Engine (GAE / Java) у меня есть такой класс:
public class Person{
private int born;
private String sex;
private List<String> likes;
//some other fields
...
}
Мне нужно, чтобы пользователь приложения мог выполнять поиск в разных полях.Например, пользователь может запросить поиск:
- Все люди, которые родились после 1975 года и любят картофель и рыбу
- Все женщины, которые родились до 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 подзапросов.
Как мне разработать решение, которое решает эту проблему?
Спасибо