Aerospike中的自定义Java对象的二级索引

时间:2019-07-16 17:48:08

标签: aerospike aerospike-index aerospike-seconday-index

我有两个班级。

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仅支持三种类型的索引:字符串,数字和地理索引。自定义对象是否有任何选项。

2 个答案:

答案 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