0

J'ai un document de données ressort recherche élastique comme suit:Puis-je utiliser un champ de combinaison unique dans Spring Data ElasticSearch?

@Document(indexName = "outlet") 
public class OutletIndex implements IESMapper{ 

    @Id 
    private String name; 
    private Long outletId; 
    private OutletType type; 
    private String address; 
    private String geoLocation; 
    private String city; 

    // getter and setter methods 

} 

Puis-je faire la combinaison de city et name champ unique? Dans les données de printemps jpa nous pouvons utiliser l'option @UniqueConstraint (How to introduce multi-column constraint with JPA annotations?). Y a-t-il un moyen de l'implémenter dans Spring ES de données?

Répondre

1

Il n'y a pas de concept d'unicité dans Elasticsearch à l'exception du champ _uid, qui est une concaténation du type de mappage et du document _id, par ex. outlet#someName

Au lieu d'utiliser le name comme document @Id, vous pouvez créer un autre champ appelé cityName qui serait la concaténation du city et les name champs. Cela seul garantit que deux documents n'auront pas les mêmes valeurs de champ city et name, c'est-à-dire une sorte de contrainte d'unicité légère. En outre, si vous voulez que l'opération d'indexation échoue si un deuxième document avec le même nom/ville est indexé, alors, lors de la création de nouveaux documents, au lieu de frapper l'API d'index PUT index/type/someNameSomeCity vous obtiendrez _create endpoint comme celui-ci

`PUT index/type/123/someNameSomeCity/_create` 
or 
`PUT index/type/123/someNameSomeCity?op_type=create` 

l'effet sera que si un document avec le même ID someNameSomeCity existe déjà, l'opération d'indexation échouera, ce qui garantit implicitement une sorte d'unicité.

+1

Heureux que ça a aidé! – Val