我有两个班级。
class A {
String aName;
B b;
public A(String aName, B b) {
this.aName = aName;
this.b = b;
}
public String getaName() {
return aName;
}
public B getB() {
return b;
}
}
class B {
String bName;
public B(String bName) {
this.bName = bName;
}
public String getbName() {
return bName;
}
}
我将A作为一组存储在Aerospike中,并且 A.aName 是主键。我想要 A.b。上的辅助键。我已经在A.b属性上创建了索引,并且还可以持久保存。但是从索引中搜索不会返回任何内容。据我了解,Aerospike仅支持三种类型的索引:字符串,数字和地理索引。自定义对象是否有任何选项。
答案 0 :(得分:1)
实际上,您还可以在不同的源类型中索引字符串,数字和地理位置 -基本(意味着带有标量数据的bin),列表(以便您可以索引包含在其中的字符串或数字数据)列表),地图键和地图值。
请参阅:https://www.aerospike.com/docs/guide/query.html#secondary-index-key-source-type
您可以通过以下几种方式对此进行建模:
作为映射。假设您将A的值存储在类型为映射的bin中,它可能具有两个映射键-aName和bName。您可以为映射值上的字符串数据构建二级索引。现在,如果您搜索特定的bName,则会显示该记录。
更合理地将以下做为单独的垃圾箱。
假设您使用了多个垃圾箱,其中两个垃圾箱用于存放aname和bname。它们的值是字符串。现在,您可以为字符串值和基本索引类型(字符串数据不包含在列表或映射等复杂数据类型中)构建二级索引。您将查询谓词为bname = foo的所有记录。
对于更复杂的情况,一个或多个bname值映射到单个名称,您实际上可以将此建模为查找表。
假设一个名为 users 的集合(表)保存记录,记录中的键是用户名。单个键值操作(例如读取或向上插入)可在类A的特定实例上工作,该实例由给定的 aname 标识。每个A实例在Aerospike中有一条记录。
您还有另一组(表)作为查找表,其中为每个唯一的 bname 创建一条记录。特定的 bname 是此记录的密钥。值为 aname 。因此,要在 users 集中查找记录,您首先要在 bname 的查找表中查找该记录。您可以将此记录的值用作该 aname 的 users 记录的键。这是对这种类型的用例进行建模的最常见方法,没有二级索引。
答案 1 :(得分:0)
这是Aerospike论坛上的答案。
Binary blobs can be anything, there’s definitely no way to index that. If there is a particular field in your class you can pull out and set as a separate bin with a string/long type then that would work
https://discuss.aerospike.com/t/secondary-index-on-custom-java-object/6485