У меня есть список контактов в хранилище данных, в котором хранятся свойства givenName и familyName. Я могу найти список контактов, для которых «givenName» начинается с заданного параметра запроса. Я делаю это так с 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' с лимитом 200;
Запрос для familyName, начинающийся с 'ab' с лимитом 200;
Объединить оба результата в одном отсортированном списке результатов
Offset в комбинированном результате найти 150-200.
Последующий запрос на тот же поисковый запрос, но смещение 200-250 потребует повторить весь поиск, но с лимитом 250 по обоим запросам.
Это чувствует себя ужасно неэффективно (и дорого)
Хорошо, я должен попробовать это ... Итак, я создаю свойство списка List, которое я заполняю заглавными значениями givenName и familyName каждый раз, когда я храню/обновляю контакт. Как бы выглядел запрос, если я хочу искать «startsWith» в любом значении списка? Спасибо !! –
koma
@koma Исправить. Запрос будет выглядеть так же, как ваш существующий запрос диапазона для данного имени. –
работает как шарм :-) – koma