我在数据存储区中有一个包含givenName和familyName属性的联系人列表。 我可以搜索“给定名称”的联系人列表。以给定的查询参数开头。我用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());
但良好的用户体验需要同时搜索“给定名称”的联系人。或者&#39; familyName&#39;从搜索框中输入的文本开始。
我无法在一个数据存储区查询中合并此搜索(我认为)。因此,我将不得不使用偏移和限制执行两个查询。
到目前为止我唯一的想法:
假设搜索结果请求150-200 =&#39; ab%&#39;。
查询以&#39; ab&#39;开头的givenName限制200;
查询以&#39; ab&#39;开头的familyName限制200;
将两个结果合并到一个排序结果列表
抵消合并后的结果,找到150-200。
对相同搜索词但是偏移200-250的后续请求需要重复整个搜索,但两个查询都有250个限制。
这感觉非常低效(且成本高昂)
答案 0 :(得分:3)
更简单的解决方案是将给定的名称和姓氏都放入list属性中,然后对其进行不等式比较。这将返回列表属性中的任何项目满足您的条件的任何条目。