【问题标题】:Do a property must be indexed for associated composite indexes to be updated on put()?是否必须为要在 put() 上更新的关联复合索引编制索引?
【发布时间】:2013-09-27 13:56:56
【问题描述】:

我有一个复合索引(prop0 asc,prop1 asc)。为了验证它是否在 prop0 和 prop1 没有被索引的情况下被更新,我做了一个测试。该测试有几个请求,如下面的 AppStats 屏幕截图所示。

请求 1:复合过滤器查询(与请求 4 相同)。

请求 2:创建与请求 5 相同的 DataStore,但所有属性均未编入索引。

请求 3:数据存储清理。

请求 4:复合过滤器查询。

请求 5:使用索引的所有属性创建数据存储。

请求 6:内存缓存清理。

请求 1 未返回任何结果,如果复合索引未在请求 2 中更新,这是预期的。我的问题是:是这样吗?

相关代码如下。

// DataStore creation.
public ReturnCodes operate() {
    DatastoreService dataStore = DatastoreServiceFactory.getDatastoreService();

    Entity testEntity = new Entity(ENTITY_NAME, ROOT_NAME);
    Key rootKey = KeyFactory.createKey(DataStoreCreation.ENTITY_NAME, ROOT_NAME);
    setProps(testEntity, 0);
    dataStore.put(testEntity);

    for(int i = 1; i < numEntities; ++i) {
        // Chave = nome da entidade + i
        testEntity = new Entity(ENTITY_NAME, ENTITY_NAME + i, rootKey);
        setProps(testEntity, i);
        dataStore.put(testEntity);
    }

    return ReturnCodes.SUCCESS;
}

private void setProps(Entity entity, int value) {
    for(int j = 0; j < numProps; ++j) {
        if(indexed) {
            entity.setProperty(PROPERTY_NAME_PREFIX + j, value);
        }
        else {
            entity.setUnindexedProperty(PROPERTY_NAME_PREFIX + j, value);
        }
    }
}

// DataStore cleanup.
private ReturnCodes clean() {
    Key rootKey = KeyFactory.createKey(DataStoreCreation.ENTITY_NAME, DataStoreCreation.ROOT_NAME);
    DatastoreService dataStore = DatastoreServiceFactory.getDatastoreService();

    Query query = new Query(DataStoreCreation.ENTITY_NAME).setKeysOnly();
    PreparedQuery prepQuery = dataStore.prepare(query);
    Iterable<Entity> entities = prepQuery.asIterable();
    ArrayList<Key> keys = new ArrayList<Key>();

    for(Entity entity : entities) {
        keys.add(entity.getKey());
    }
    dataStore.delete(keys);

    return ReturnCodes.SUCCESS;
}

// Composite filter query.
public ReturnCodes doQuery() {
    DatastoreService dataStore = DatastoreServiceFactory.getDatastoreService();

    for(int i = 0; i < numIters; ++i) {
        Query.FilterPredicate filter0 = new Query.FilterPredicate(DataStoreCreation.PROPERTY_NAME_PREFIX + 0,
                Query.FilterOperator.NOT_EQUAL, 0);
        Query.FilterPredicate filter1 = new Query.FilterPredicate(DataStoreCreation.PROPERTY_NAME_PREFIX + 0,
                Query.FilterOperator.GREATER_THAN_OR_EQUAL, 0);
        CompositeFilter finalFilter = Query.CompositeFilterOperator.or(filter0, filter1);
        Query query = new Query(DataStoreCreation.ENTITY_NAME/*, key*/).setFilter(finalFilter);
        query.addProjection(new PropertyProjection(DataStoreCreation.PROPERTY_NAME_PREFIX + 0, Integer.class));
        query.addProjection(new PropertyProjection(DataStoreCreation.PROPERTY_NAME_PREFIX + 1, Integer.class));
        PreparedQuery prepQuery = dataStore.prepare(query);
        Iterable<Entity> results = prepQuery.asIterable();

        if(!results.iterator().hasNext()) {
            return ReturnCodes.ERROR;
        }

        for(Entity result : results) {
            //log.info(result.toString());
        }
    }

    return ReturnCodes.SUCCESS;
}

【问题讨论】:

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


    【解决方案1】:

    您是对的——如果 put 包含您已明确设置为在实体中未编制索引的属性,则不会为复合索引填充复合索引。

    有关支持该功能的信息,请参阅this discussion。它还提供了一些有用的解决方法提示。

    【讨论】:

      猜你喜欢
      • 2019-01-27
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      相关资源
      最近更新 更多