链接已跟踪:- 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-data
findBy**
方法,您应该具有查询字段的索引(在您的情况下,为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()
或@PostConstruct
spring-boot
应用程序中createIndex
调用此方法:
createIndex(customerRepository, Customer.class, "customer_mobileNumber_index", "mobileNumber", IndexType.STRING);
尽管如此,这样的索引只会通过单个字段mobileNumber
获取记录,并且您需要在 Java 代码中过滤掉返回的结果customerType