通过对多个属性的不等式查询进行分页

时间:2012-03-29 10:25:36

标签: google-app-engine google-cloud-datastore objectify

我在数据存储区中有一个包含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个限制。

这感觉非常低效(且成本高昂)

1 个答案:

答案 0 :(得分:3)

更简单的解决方案是将给定的名称和姓氏都放入list属性中,然后对其进行不等式比较。这将返回列表属性中的任何项目满足您的条件的任何条目。