-1

链接如下:- https://www.aerospike.com/blog/spring-data-for-aerospike/

我们有以下示例实体:-

@Document(collection = "cust", expiration = 90, expirationUnit = TimeUnit.DAYS)
public class Customer {

   @Id
   @Field(value = "PK")
   private String custId;

   @Field(value = "mobileNumber")
   private String mobileNumber;

   @Field(value = "creationTime")
   private String creationTime;
 
@Field(value = "custType")
private String custType;
 
}

使用 Spring 存储库,我们使用以下方法:-

// 工作 List<Customer> findByMobileNumber (String mobileNumber);

// 失败,201 ERR INNDEX NOT FOUND。 List<Customer> findByMobileNumberAndCustType (String mobileNumber, String customerType);

事实/观察:-

1.) 我们没有在我们的 aerospike-set 上创建任何明确的二级索引。

2.) 当我们使用 AQL 查询(select * from test.cust where mobileNumber = '981XXXXXXX')相同的记录时,它失败给我们一个 Indices not found 的错误。

疑虑/问题:-

a.) 第一种方法是如何工作的?它执行的内部方式是什么?查询完成后是否有任何即时创建并被冲走的二级索引?

b.) 为什么第二个失败了?

任何回应都将受到高度赞赏!

4

1 回答 1

1

为了使用spring-data findBy**方法,您应该有查询字段的索引(在您的情况下,索引 bin mobileNumber),否则,aerospike 将需要对您集合中的所有文档进行全面扫描(是否进行全面扫描 - 取决于 aerospike 配置) . 不会自动创建索引。所以请创建索引(以编程方式或手动)。如果以编程方式,您可以使用以下方法:

public void createIndex(AerospikeRepository<?, ?> aerospikeRepository,
                        Class<?> entityClass,
                        String indexName,
                        String fieldName,
                        IndexType indexType) {
    var entityName = entityClass.getSimpleName();
    log.info("Creating Aerospike index [{}] for field [{}] of entity [{}]", indexName, fieldName, entityName);
    try {
        aerospikeRepository.createIndex(entityClass, indexName, fieldName, indexType);
        log.info("Aerospike index [{}] was successfully created for field [{}] of entity [{}]", indexName, fieldName, entityName);
    } catch (IndexAlreadyExistsException ex) {
        log.info("Aerospike index [{}] for field [{}] of entity [{}] already exists", indexName, fieldName, entityName);
    } catch (AerospikeException e) {
        if (e.getResultCode() == ResultCode.INDEX_ALREADY_EXISTS) {
            log.info("Aerospike index [{}] for field [{}] of entity [{}] already exists", indexName, fieldName, entityName);
            return;
        }
        throw e;
    }
}

您可以在应用程序中调用此方法createIndexin或 in :spring-bootInitializingBean afterPropertiesSet()@PostConstruct

createIndex(customerRepository, Customer.class, "customer_mobileNumber_index", "mobileNumber", IndexType.STRING);

仍然,这样的索引将仅通过单个字段获取记录mobileNumber,并且您需要通过以下方式过滤掉 java 代码中的返回结果customerType

于 2020-07-08T08:50:12.037 回答