如何使用Spring数据与elasticsearch别名进行交互

嗨,我正在使用elasticsearchSpring数据。我项目的领域结构不断变化,因此我必须删除索引才能每次更改映射。为了克服这个问题,我使用了别名。我使用以下方法创建了别名:

elasticsearchTemplate.createIndex(Test.class);

elasticsearchTemplate.putMapping(Test.class);

String aliasName = "test-alias";

AliasQuery aliasQuery = new AliasBuilder()

.withIndexName("test")

.withAliasName(aliasName).build();

elasticsearchTemplate.addAlias(aliasQuery);

我有一个测试课:

import org.springframework.data.annotation.Id

import org.springframework.data.elasticsearch.annotations.Document

import org.springframework.data.elasticsearch.annotations.Field

import org.springframework.data.elasticsearch.annotations.FieldIndex

import org.springframework.data.elasticsearch.annotations.FieldType

import org.springframework.data.elasticsearch.annotations.Setting

@Document(indexName = "test", type = "test")

@Setting(settingPath = 'elasticSearchSettings/analyzer.json')

class Test extends BaseEntity{

@Id

@Field(type = FieldType.String, index = FieldIndex.not_analyzed)

String id

@Field(type = FieldType.String, index = FieldIndex.analyzed, indexAnalyzer = "generic_analyzer", searchAnalyzer = "generic_analyzer")

String firstName

}

TestRepository类:

package com.as.core.repositories

import com.as.core.entities.Test

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository

interface TestRepository extends ElasticsearchRepository<Test, String>

{

}

我的问题是如何从别名而不是索引本身读取?是否对别名也进行写操作。我看过以下链接:https :

//www.elastic.co/guide/en/elasticsearch/guide/current/index-

aliases.html#index-

aliases 它说我们将必须交互别名而不是实际别名index。如何使用Elasticsearch

Spring数据Java API实现此目标。

回答:

我通过在与对象相关联的存储库类中使用ElasticsearchTemplate来解决了这一限制(尽管如果有一种在实体本身上指定别名的方法会更好)。

它的工作方式是创建自定义存储库界面。在您的情况下,将为TestRepositoryCustom:

public interface TestRepositoryCustom

{

Test> findByCustom(...);

}

然后实现此接口,在基本存储库名称的末尾附加“ Impl”:

public class TestRepositoryImpl implements TestRepositoryCustom

{

Page<Test> findByCustom(Pageable pageable, ...)

{

BoolQueryBuilder boolQuery = new BoolQueryBuilder();

FilterBuilder filter = FilterBuilders.staticMethodsToBuildFilters;

/*

* Your code here to setup your query

*/

NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder().withQuery(boolQuery).withFilter(filter).withPageable(pageable);

//These two are the crucial elements that will allow the search to look up based on alias

builder.withIndices("test-alias");

builder.withTypes("test");

//Execute the query

SearchQuery searchQuery = builder.build();

return elasticSearchTemplate.queryForPage(searchQuery, Test.class);

}

}

最后,在基本的JPA代理接口TestRepository中,扩展TestRepositoryCustom接口,以从存储库bean访问自定义接口上的任何方法。

public interface TestRepository extends ElasticsearchRepository<Consultant, String>, TestRepositoryCustom

{

}

我真正想看到的是对实体的注释,例如:

@Document(aliasName="test-alias")

这只会在后台工作,以提供对这个索引的搜索,因此无论索引名如何,所有jpa查询都将正常工作。

以上是 如何使用Spring数据与elasticsearch别名进行交互 的全部内容, 来源链接: utcz.com/qa/433127.html

回到顶部