10

Yaylı veri-elasticsearch kullanıyorum ve her şey için iyi çalışıyor.Yaylı Veri Elasticsearch: Aynı Belge ile Çoklu İndeks

@Document(type = "products", indexName = "empty") 
public class Product 
{ 
... 
} 

public interface ProductRepository extends ElasticsearchRepository<Product, String> 
{ 
... 
} 

Modelimde ürünlerimi arayabilirim.

@Autowired 
private ProductRepository repository; 
... 
repository.findByIdentifier("xxx").getCategory()); 

Yani benim sorundur - Farklı endekslerde aynı Elasticsearch tip ettik ve tüm sorgular için aynı belgeyi kullanmak istiyorum. Bir havuz aracılığıyla daha fazla bağlantı kurabilirim - ancak bunu nasıl uygulayabileceğime dair hiçbir fikrim yok.

ProductRepository customerRepo = ElasticsearchPool.getRepoByCustomer("abc", ProductRepository.class); 
repository.findByIdentifier("xxx").getCategory(); 

o, çalışma zamanında bir depo oluşturmak mümkün mü bir farklı indeksi:

Ben böyle bir şey istiyorum?

Çok teşekkürler Marcel

cevap

2

Evet. Bahar ile mümkün. Ancak Repository yerine ElasticsearchTemplate kullanmalısınız. Örneğin,

. İki ürünüm var. Farklı endekslerde saklanırlar. Aynı türü varsa

@Document(indexName = "product-a", type = "product") 
public class ProductA { 

    @Id 
    private String id; 

    private String name; 

    private int value; 

    //Getters and setters 
} 

@Document(indexName = "product-b", type = "product") 
public class ProductB { 

    @Id 
    private String id; 

    private String name; 

    //Getters and setters 

} 

varsayalım, aynısını alanlarına sahiptir. Ama gerekli değil. İki ürün tamamen farklı alanlara sahip olabilir.

public interface ProductARepository extends ElasticsearchRepository<ProductA, String> { 
} 


public interface ProductBRepository 
    extends ElasticsearchRepository<ProductB, String> { 


} 

Çok zorunlu değildir:

İki depoları var. Sadece test için. ProductA'un "ürün-a" dizininde saklanması ve ProductB "ürün-b" endeksinde saklanması gerçeği.

Aynı türdeki iki (on, düzine) dizin nasıl sorgulanır?

Sadece bu

@Repository 
public class CustomProductRepositoryImpl { 

    @Autowired 
    private ElasticsearchTemplate elasticsearchTemplate; 

    public List<ProductA> findProductByName(String name) { 
     MatchQueryBuilder queryBuilder = QueryBuilders.matchPhrasePrefixQuery("name", name); 

     //You can query as many indices as you want 
     IndicesQueryBuilder builder = QueryBuilders.indicesQuery(queryBuilder, "product-a", "product-b"); 

     SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); 

     return elasticsearchTemplate.query(searchQuery, response -> { 
      SearchHits hits = response.getHits(); 
      List<ProductA> result = new ArrayList<>(); 
      Arrays.stream(hits.getHits()).forEach(h -> { 
       Map<String, Object> source = h.getSource(); 
       //get only id just for test 
       ProductA productA = new ProductA() 
         .setId(String.valueOf(source.getOrDefault("id", null))); 
       result.add(productA); 
      }); 
      return result; 
     }); 
    } 

} 
istediğiniz kadar çok indeksleri arama yapabilirsiniz

gibi özel depo inşa etmek ve indices aliases kullanmaktır Eğer şeffaf ProductARepositoryadding custom behavior to single repositories

İkinci çözelti içine bu davranışı enjekte, ancak Özel model veya özel depo da oluşturmalıydı.

İlgili konular