【问题标题】:Secondary Index on Custom Java Object in AerospikeAerospike 中自定义 Java 对象的二级索引
【发布时间】:2019-07-16 17:48:08
【问题描述】:

我有两节课。

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

【问题讨论】:

标签: aerospike


【解决方案1】:

实际上,您还可以索引字符串、数字和地理不同的源类型 - 基本(意味着只是一个带有标量数据的 bin)、列表(因此您可以索引包含在一个列表),映射键和映射值。

见:https://www.aerospike.com/docs/guide/query.html#secondary-index-key-source-type

您可以通过以下几种方式对此进行建模:

作为映射。假设您将 A 的值存储在类型为映射的 bin 中,它可能有两个映射键 - aName 和 bName。您可以为地图值上的字符串数据构建二级索引。现在,如果你搜索一个特定的 bName,你就会看到这条记录。

更合理的做法是,您将以下操作作为单独的垃圾箱

假设您使用多个 bin,其中两个 bin 用于保存 aname 和 bname。它们的值是字符串。您现在可以为字符串值和基本索引类型(不包含在复杂数据类型中的字符串数据,例如列表或映射)构建二级索引。您将查询谓词为 bname = foo 的所有记录。

对于更复杂的情况,一个或多个 bname 值映射到单个 aname,您实际上会将其建模为 查找表

假设一个名为 users 的集合(表)持有记录,其键为 aname。单个键值操作(例如读取或 upsert)作用于 A 类的特定实例,由给定的 aname 标识。 Aerospike 中的每个 A 实例都有一条记录。

您有另一个集合(表)作为查找表,您在其中为每个唯一的 bname 创建一条记录。具体的bname 是这条记录的关键。该值是名称。因此,要在 users 集中查找记录,您首先在查找表中按 bname 查找它。您将此记录的值用作该 anameusers 记录的键。这是对此类用例进行建模的最常用方法,没有二级索引

【讨论】:

    【解决方案2】:

    这是 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      相关资源
      最近更新 更多