是否可以在 Aerospike 中使用主键和辅助键来获取记录?
Is it possible to use primary key along with secondary key in Aerospike for fetching a record?
是否可以同时使用主键和辅助键。我想在主键的基础上获取所有记录,然后在其上应用二级索引?这是正确的方法还是应该使用其他方法?
我有一个带主键的垃圾箱。使用主键获取记录后,我只想获取记录的子集。
下面是记录示例。还有没有更好的方法来组织记录?比如把manager,supervisor,otherStaff作为key然后查询。
{
"name" : "test",
"companyName" : "company1",
"details" : [{
"salary" : 1000,
"designation" : "manager"
},
{
"salary" : 2000,
"designation" : "supervisor"
},
{
"staff" : 500,
"designation" : "otherStaff"
}]
}
对包含主要搜索数据的容器使用二级索引查询,然后使用谓词过滤器进一步 select 返回的记录。
示例构造 - 记录在命名空间测试中有国家和城市箱,设置测试集,二级索引 = 国家上的平等字符串。
// Java statement
Record record = null;
Statement stmt = new Statement();
stmt.setSetName("testset");
stmt.setNamespace("test");
stmt.setIndexName("country_idx");
stmt.setFilter(Filter.equal("country","USA"));
//Additional Predicate Filtering
stmt.setPredExp(
PredExp.stringBin("city"),
PredExp.stringValue(".*Diego"),
//prefix-suffix match: prefix.*suffix, ignore case or newline
PredExp.stringRegex(RegexFlag.ICASE | RegexFlag.NEWLINE)
);
如果能先按主键查询肯定是有好处的。这将非常有效,因为请求将登陆单个节点(而不是在二级索引查询的情况下的所有节点)。在该节点上,主键索引查找将会很快。
当你说二级索引时,看起来你的要求是对数据进行额外的过滤。如果我的理解是正确的,您可以使用 Map API 来获取您明确查找的键(或值)。为此,您可能需要相应地调整数据模型。在您的示例中,如果您要获取不同的薪水,您可能应该创建薪水地图(而不是 "salary" 作为地图中的键)。像这样:
{
"name" : "test",
"companyName" : "company1",
"salaries" : {
"manager" : 1000,
"supervisor" : 2000,
"otherStaff" : 500
}
}
然后您可以使用 getByKeyList()
映射 API 通过指定您感兴趣的键(在映射中)来获取多个值(比如 'manager' 和 'otherStaff').
是否可以同时使用主键和辅助键。我想在主键的基础上获取所有记录,然后在其上应用二级索引?这是正确的方法还是应该使用其他方法?
我有一个带主键的垃圾箱。使用主键获取记录后,我只想获取记录的子集。 下面是记录示例。还有没有更好的方法来组织记录?比如把manager,supervisor,otherStaff作为key然后查询。
{
"name" : "test",
"companyName" : "company1",
"details" : [{
"salary" : 1000,
"designation" : "manager"
},
{
"salary" : 2000,
"designation" : "supervisor"
},
{
"staff" : 500,
"designation" : "otherStaff"
}]
}
对包含主要搜索数据的容器使用二级索引查询,然后使用谓词过滤器进一步 select 返回的记录。 示例构造 - 记录在命名空间测试中有国家和城市箱,设置测试集,二级索引 = 国家上的平等字符串。
// Java statement
Record record = null;
Statement stmt = new Statement();
stmt.setSetName("testset");
stmt.setNamespace("test");
stmt.setIndexName("country_idx");
stmt.setFilter(Filter.equal("country","USA"));
//Additional Predicate Filtering
stmt.setPredExp(
PredExp.stringBin("city"),
PredExp.stringValue(".*Diego"),
//prefix-suffix match: prefix.*suffix, ignore case or newline
PredExp.stringRegex(RegexFlag.ICASE | RegexFlag.NEWLINE)
);
如果能先按主键查询肯定是有好处的。这将非常有效,因为请求将登陆单个节点(而不是在二级索引查询的情况下的所有节点)。在该节点上,主键索引查找将会很快。
当你说二级索引时,看起来你的要求是对数据进行额外的过滤。如果我的理解是正确的,您可以使用 Map API 来获取您明确查找的键(或值)。为此,您可能需要相应地调整数据模型。在您的示例中,如果您要获取不同的薪水,您可能应该创建薪水地图(而不是 "salary" 作为地图中的键)。像这样:
{
"name" : "test",
"companyName" : "company1",
"salaries" : {
"manager" : 1000,
"supervisor" : 2000,
"otherStaff" : 500
}
}
然后您可以使用 getByKeyList()
映射 API 通过指定您感兴趣的键(在映射中)来获取多个值(比如 'manager' 和 'otherStaff').