21 Haziran 2018 Perşembe

HibernateSearch @Indexed Anotasyonu

Giriş
Şu satırı dahil ederiz.
import org.hibernate.search.annotations.Indexed;
Açıklaması şöyle
... the @Index annotation indicates to Hibernate Search that we want to index this entity in order to apply search operation on it.

Örnek
Şöyle yaparız
@Entity
@Indexed
@Table(name = "ApplicationTypeCreation")
public class ApplicationTypeCreation extends Application {
  ...
}
Örnek
Şöyle yaparız
import org.hibernate.annotations.NaturalId;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;

import javax.persistence.*;
import java.time.Instant;

@Indexed
@Entity
@Table(name = "plant")
@Getter
@Setter
@ToString
@EqualsAndHashCode
public class Plant {
  ...
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @FullTextField()
  @NaturalId()
  private String name;

  @FullTextField()
  @NaturalId()
  private String scientificName;

  @FullTextField()
  private String family;
} 
routingBinder Alanı - Conditional Index İçindir
Routing Bridges ile gerçekleştirilir

Örnek
Şöyle yaparız. Burada indeksleme koşulunu belirtiyoruz. Eğer name ismi rosaceae ise nesne indekslenmez. Burada RoutingBridge arayüzünden kalıtan sınıf nested kullanılıyor ama harici bir sınıf ta olabilir. RoutingBridge nesnesi RoutingBinder ile Hibernate'e tanıtılır. 
public class PlantRoutingBinder implements RoutingBinder {

  private static final String FIELD_TO_USE = "name";
  private static final List<String> FAMILIES_TO_IGNORE = Arrays.asList("rosaceae");

  @Override
  public void bind(RoutingBindingContext context) {
    context.dependencies().use(FIELD_TO_USE);

    context.bridge(Plant.class, new Bridge());
  }

  public static class Bridge implements RoutingBridge<Plant> {
    @Override
    public void route(
      DocumentRoutes routes,
      Object entityIdentifier,
      Plant indexedEntity,
      RoutingBridgeRouteContext context) {
      if (FAMILIES_TO_IGNORE.contains(indexedEntity.getFamily())) {
        routes.notIndexed();
      } else {
        routes.addRoute();
      }
    }

    @Override
    public void previousRoutes(
      DocumentRoutes routes,
      Object entityIdentifier,
      Plant indexedEntity,
      RoutingBridgeRouteContext context) {
        routes.addRoute();
    }
  }
}
ve kullanmak için şöyle yaparız
@Indexed(routingBinder = @RoutingBinderRef(type = PlantRoutingBinder.class))
@Entity
@Table(name = "plant")
@Getter
@Setter
@ToString
@EqualsAndHashCode
public class Plant {
   ...
}




Hiç yorum yok:

Yorum Gönder