17

私は spring-data-elasticsearch を使用していますが、最初はすべて正常に動作します。

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

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

私のモデルでは、製品を検索できます。

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

したがって、私の問題は、異なるインデックスに同じ Elasticsearch タイプがあり、すべてのクエリに同じドキュメントを使用したいということです。プールを介してより多くの接続を処理できますが、これを実装する方法がわかりません。

私はそのようなものを持ちたいです:

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

別のインデックスを使用して、実行時にリポジトリを作成することは可能ですか?

どうもありがとうマルセル

4

2 に答える 2

7

はい。春なら可能です。ただし、代わりにElasticsearchTemplateRepositoryを使用する必要があります。

例えば。私は2つの製品を持っています。それらは異なるインデックスに格納されます。

@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

}

それらが同じタイプを持っている場合、それらは同じフィールドを持っているとします。しかし、それは必要ではありません。2 つの製品がまったく異なるフィールドを持つことができます。

私は2つのリポジトリを持っています:

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


public interface ProductBRepository
    extends ElasticsearchRepository<ProductB, String> {


}

それも必要ありません。テスト専用です。ProductA「製品-a」インデックスにProductB格納され、「製品-b」インデックスに格納されるファクト。

同じタイプの2つ(10、ダース)のインデックスを照会する方法は?

このようにカスタムリポジトリを構築するだけです

@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 て、単一のリポジトリにカスタム動作を追加できます

2 番目の解決策は、インデックス エイリアスを使用することですが、カスタム モデルまたはカスタム リポジトリも作成する必要がありました。

于 2016-06-15T20:42:26.360 に答える