У меня есть список контактов в хранилище данных, в котором хранятся свойства имени и фамилии.
Я могу искать список контактов, для которых заданное имя начинается с заданного параметра запроса. Я делаю это так с Objectify4:
Query<Contact> query = txn().consistency(Consistency.STRONG).load().type(Contact.class).ancestor(ancestor);
if (criteria.getSearchString() != null) {
query = query.filter(SEARCH_GIVEN_NAME + " >= ", criteria.getSearchString().toUpperCase());
query = query.filter(SEARCH_GIVEN_NAME + " <= ", criteria.getSearchString().toUpperCase() + SENTINEL);
}
query = query.limit(criteria.getPageSize()).offset(criteria.getStartIndex());
Но для хорошего взаимодействия с пользователем требуется одновременный поиск контактов по «GivenName» ИЛИ «FamilyName», начиная с текста, введенного в поле поиска.
Я не могу объединить этот поиск в одном запросе к хранилищу данных (я думаю). Поэтому мне придется выполнить два запроса как со смещением, так и с ограничением.
Моя единственная идея на данный момент:
Предположим, запрос на результаты 150-200 для поискового термина = 'ab%'.
Запрос для данного имени, начинающегося с 'ab' с ограничением 200;
Запрос для familyName, начинающийся с 'ab' с лимитом 200;
Объединить оба результата в один отсортированный список результатов
Смещение в комбинированный результат для нахождения 150-200.
Последующий запрос для того же поискового запроса, но со смещением 200-250, потребует повторения всего поиска, но с ограничением 250 для обоих запросов.
Это ужасно неэффективно (и дорого)