스프링 데이터 탄력적 검색: 동일한 문서가 있는 다중 인덱스
저는 스프링 데이터 탄력 검색을 사용하고 있으며 처음에는 모든 것이 잘 작동합니다.
@Document( type = "products", indexName = "empty" )
public class Product
{
...
}
public interface ProductRepository extends ElasticsearchRepository<Product, String>
{
...
}
내 모델에서 나는 제품을 검색할 수 있습니다.
@Autowired
private ProductRepository repository;
...
repository.findByIdentifier( "xxx" ).getCategory() );
그래서 제 문제는 - 다른 인덱스에 동일한 Elastic 검색 유형이 있으며 모든 쿼리에 동일한 문서를 사용하고 싶다는 것입니다.풀을 통해 더 많은 연결을 처리할 수 있지만 어떻게 구현할 수 있는지 모르겠습니다.
저는 그런 것을 갖고 싶습니다.
ProductRepository customerRepo = ElasticsearchPool.getRepoByCustomer("abc", ProductRepository.class);
repository.findByIdentifier( "xxx" ).getCategory();
런타임에 다른 인덱스로 저장소를 만드는 것이 가능합니까?
마르셀 감사합니다.
네. Spring으로 가능합니다.그러나 ElasticsearchTemplate를 사용해야 합니다.Repository
.
예를들면.저는 두 가지 제품을 가지고 있습니다.다른 인덱스에 저장됩니다.
@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
}
유형이 같고 필드가 같다고 가정합니다.하지만 그럴 필요는 없습니다.두 제품은 전혀 다른 분야를 가질 수 있습니다.
두 개의 저장소가 있습니다.
public interface ProductARepository extends ElasticsearchRepository<ProductA, String> {
}
public interface ProductBRepository
extends ElasticsearchRepository<ProductB, String> {
}
그럴 필요도 없습니다.테스트용으로만 제공됩니다.사실은ProductA
"product-a" 인덱스에 저장됩니다.ProductB
는 "product-b" 인덱스에 저장됩니다.
동일한 유형의 인덱스 두 개(10, 12개)를 쿼리하는 방법은 무엇입니까?
이와 같은 맞춤형 저장소를 구축하기만 하면 됩니다.
@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;
});
}
}
원하는 만큼의 인덱스를 검색할 수 있으며 이 동작을 다음에 투명하게 주입할 수 있습니다.ProductARepository
단일 리포지토리에 사용자 지정 동작 추가
두 번째 솔루션은 인덱스 별칭을 사용하는 것이지만 사용자 지정 모델이나 사용자 지정 저장소도 만들어야 했습니다.
필요한 경우 이 방법을 사용하여 인덱스를 전환할 수 있습니다.
NativeSearchQueryBuilder nativeSearchQueryBuilder = nativeSearchQueryBuilderConfig.getNativeSearchQueryBuilder();
// Assign the index explicitly.
nativeSearchQueryBuilder.withIndices("product-a");
// Then add query as usual.
nativeSearchQueryBuilder.withQuery(allQueries)
그@Document
엔티티의 주석은 특정 인덱스에 대해 쿼리하기 위해 매핑을 명확하게 할 뿐이며, 여전히 위의 방법을 사용해야 합니다.
@Document(indexName="product-a", type="_doc")
언급URL : https://stackoverflow.com/questions/28466200/spring-data-elasticsearch-multiple-index-with-same-document
'code' 카테고리의 다른 글
Spring Security oauth2 클라이언트 - Twitter 문제 (0) | 2023.07.22 |
---|---|
요구사항 사용 방법.txt: 파이썬 프로젝트에 모든 종속성을 설치합니다. (0) | 2023.07.22 |
한 줄에 try/except를 어떻게 넣어야 합니까? (0) | 2023.07.22 |
두 판다 기둥의 끈 연결 (0) | 2023.07.22 |
표 2에서 표 1 업데이트(새로 삽입, 업데이트만 변경, 누락 제거) (0) | 2023.07.22 |