1

是否可以使用主键和辅助键。我想根据主键获取所有记录,然后对其应用二级索引?这是正确的方法还是应该使用其他方法?

我有一个带主键的垃圾箱。一旦我使用主键获取记录,我只想获取记录的子集。下面是记录示例。还有没有更好的方法来组织记录?比如以经理、主管等人员为key,然后查询。

 {
    "name" : "test",
    "companyName" : "company1",
    "details" : [{
           "salary" : 1000,
           "designation" : "manager"
         },
         {
           "salary" : 2000,
           "designation" : "supervisor"
         },
         {
           "staff" : 500,
           "designation" : "otherStaff"
         }]
} 
4

2 回答 2

1

在包含主要搜索数据的 bin 上使用二级索引查询,然后使用谓词过滤器进一步选择返回的记录。示例构造 - 记录在命名空间测试中具有国家和城市箱,设置测试集,二级索引 = 国家/地区的相等字符串。

// 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)
);
于 2020-06-15T05:51:33.787 回答
1

如果您可以先按主键查询,那绝对是有益的。这将非常有效,因为请求将落在单个节点上(而不是在二级索引查询的情况下的所有节点)。在那个节点上,主键索引查找会很快。

当您说二级索引时,看起来您的要求是对数据进行额外的过滤。如果我的理解是正确的,您可以使用Map API来获取您明确查找的键(或值)。为此,您可能需要相应地调整数据模型。在您的示例中,如果您要获取不同的薪水,可能您应该创建薪水地图(而不是“薪水”作为地图中的键)。像这样的东西:

{
    "name" : "test",
    "companyName" : "company1",
    "salaries" : {
           "manager" : 1000,
           "supervisor" : 2000,
           "otherStaff" : 500
    }
}  

然后,您可以使用getByKeyList()地图 API 通过指定您感兴趣的键(在地图中)(例如“经理”和“其他员工”)来获取多个值。

于 2020-06-16T13:01:20.203 回答