二次インデックス

二次インデックス (英語) は、ネイティブ Redis 構造に基づくルックアップ操作を有効にするために使用されます。値は保存のたびに対応するインデックスに書き込まれ、オブジェクトが削除されるか期限切れになると削除されます。

シンプルプロパティインデックス

前に示したサンプル Person エンティティを前提として、次の例に示すように、プロパティに @Indexed アノテーションを付けることで、firstname のインデックスを作成できます。

例 1: アノテーション駆動型インデックス作成
@RedisHash("people")
public class Person {

  @Id String id;
  @Indexed String firstname;
  String lastname;
  Address address;
}

インデックスは、実際のプロパティ値に対して作成されます。2 人(たとえば、"rand" と "aviendha" )を保存すると、次のようなインデックスが設定されます。

SADD people:firstname:rand e2c7dcee-b8cd-4424-883e-736ce564363e
SADD people:firstname:aviendha a9d4b3a0-50d3-4538-a2fc-f7fc2581ee56

ネストされた要素にインデックスを付けることもできます。Address には、@Indexed でアノテーションが付けられた city プロパティがあると想定します。その場合、person.address.city が null でない場合、次の例に示すように、各都市のセットがあります。

SADD people:address.city:tear e2c7dcee-b8cd-4424-883e-736ce564363e

さらに、プログラム設定では、次の例に示すように、マップキーとリストプロパティにインデックスを定義できます。

@RedisHash("people")
public class Person {

  // ... other properties omitted

  Map<String, String> attributes;     (1)
  Map<String, Person> relatives;      (2)
  List<Address> addresses;            (3)
}
1SADD people:attributes.map-key:map-value e2c7dcee-b8cd-4424-883e-736ce564363e
2SADD people:relatives.map-key.firstname:tam e2c7dcee-b8cd-4424-883e-736ce564363e
3SADD people:addresses.city:tear e2c7dcee-b8cd-4424-883e-736ce564363e
参照ではインデックスを解決できません。

キースペースと同様に、次の例に示すように、実際のドメイン型にアノテーションを付けることなくインデックスを構成できます。

例 2: @EnableRedisRepositories を使用したインデックス設定
@Configuration
@EnableRedisRepositories(indexConfiguration = MyIndexConfiguration.class)
public class ApplicationConfig {

  //... RedisConnectionFactory and RedisTemplate Bean definitions omitted

  public static class MyIndexConfiguration extends IndexConfiguration {

    @Override
    protected Iterable<IndexDefinition> initialConfiguration() {
      return Collections.singleton(new SimpleIndexDefinition("people", "firstname"));
    }
  }
}

ここでも、キースペースと同様に、次の例に示すように、プログラムでインデックスを構成できます。

例 3: プログラマティックインデックスの設定
@Configuration
@EnableRedisRepositories
public class ApplicationConfig {

  //... RedisConnectionFactory and RedisTemplate Bean definitions omitted

  @Bean
  public RedisMappingContext keyValueMappingContext() {
    return new RedisMappingContext(
      new MappingConfiguration(
        new KeyspaceConfiguration(), new MyIndexConfiguration()));
  }

  public static class MyIndexConfiguration extends IndexConfiguration {

    @Override
    protected Iterable<IndexDefinition> initialConfiguration() {
      return Collections.singleton(new SimpleIndexDefinition("people", "firstname"));
    }
  }
}

地理空間インデックス

Address 型に、特定のアドレスの地理座標を保持する型 Point の location プロパティが含まれていると想定します。次の例に示すように、プロパティに @GeoIndexed アノテーションを付けることにより、Spring Data Redis は Redis GEO コマンドを使用してこれらの値を追加します。

@RedisHash("people")
public class Person {

  Address address;

  // ... other properties omitted
}

public class Address {

  @GeoIndexed Point location;

  // ... other properties omitted
}

public interface PersonRepository extends CrudRepository<Person, String> {

  List<Person> findByAddressLocationNear(Point point, Distance distance);     (1)
  List<Person> findByAddressLocationWithin(Circle circle);                    (2)
}

Person rand = new Person("rand", "al'thor");
rand.setAddress(new Address(new Point(13.361389D, 38.115556D)));

repository.save(rand);                                                        (3)

repository.findByAddressLocationNear(new Point(15D, 37D), new Distance(200, Metrics.KILOMETERS)); (4)
1Point および Distance を使用して、ネストされたプロパティのメソッド宣言をクエリします。
2Circle を使用して内部を検索し、ネストされたプロパティのメソッド宣言をクエリします。
3GEOADD people:address:location 13.361389 38.115556 e2c7dcee-b8cd-4424-883e-736ce564363e
4GEORADIUS people:address:location 15.0 37.0 200.0 km

前の例では、経度と緯度の値は、オブジェクトの id をメンバーの名前として使用する GEOADD を使用して保存されています。ファインダーメソッドを使用すると、Circle または Point, Distance の組み合わせを使用してこれらの値を照会できます。

near と within を他の条件と組み合わせることはできません。