弹簧数据气钉'findByAttribute'操作神秘地工作



链接已跟踪:- 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;

}

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

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

失败,未找到 201 个错误 INNDEX。List<Customer> findByMobileNumberAndCustType (String mobileNumber, String customerType);

事实/观察:-

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

2.( 当我们使用 AQL 查询(从 test.cust 中选择 *,其中手机号码 = '981XXXXXXXX'(以获取同一记录时,它失败了,给我们一个找不到索引的错误。

关注点/问题 :-

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

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

任何回应将不胜感激!!

为了使用spring-datafindBy**方法,您应该具有查询字段的索引(在您的情况下,为binmobileNumber的索引(,否则,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;
}
}

您可以在InitializingBean afterPropertiesSet()@PostConstructspring-boot应用程序中createIndex调用此方法:

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

尽管如此,这样的索引只会通过单个字段mobileNumber获取记录,并且您需要在 Java 代码中过滤掉返回的结果customerType

相关内容

  • 没有找到相关文章