如何使用 Spring 数据与弹性搜索别名交互
How to interact with elastic search Alias using Spring data
您好,我正在使用弹性搜索 Spring 数据。我的项目的域结构保持 changing.So 我必须删除索引才能每次更改映射。为了克服这个问题,我使用了别名。
我使用以下方法创建了别名:
elasticsearchTemplate.createIndex(Test.class);
elasticsearchTemplate.putMapping(Test.class);
String aliasName = "test-alias";
AliasQuery aliasQuery = new AliasBuilder()
.withIndexName("test")
.withAliasName(aliasName).build();
elasticsearchTemplate.addAlias(aliasQuery);
我有一个测试class:
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
}
测试库Class:
package com.as.core.repositories
import com.as.core.entities.Test
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository
interface TestRepository extends ElasticsearchRepository<Test, String>
{
}
我的问题是如何从别名而不是索引本身读取?
写操作是否也发生在别名上。
我查看了以下 link:
https://www.elastic.co/guide/en/elasticsearch/guide/current/index-aliases.html#index-aliases
它说我们将不得不使用别名而不是实际的 index.How 来实现这一点,使用 Elasticsearch Spring 数据 Java API.
我已经通过使用与对象关联的存储库 class 中的 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-data-elasticsearch 支持在别名中查找文档。我们能够制作 3.2 版。6.RELEASE 阅读带有
注释的文档
@Document(
indexName = "alias",
createIndex = false,
type = '_doc'
)
来自 Spring 由 ElasticsearchRestTemplate 支持的数据 ElasticsearchRepository
您好,我正在使用弹性搜索 Spring 数据。我的项目的域结构保持 changing.So 我必须删除索引才能每次更改映射。为了克服这个问题,我使用了别名。 我使用以下方法创建了别名:
elasticsearchTemplate.createIndex(Test.class);
elasticsearchTemplate.putMapping(Test.class);
String aliasName = "test-alias";
AliasQuery aliasQuery = new AliasBuilder()
.withIndexName("test")
.withAliasName(aliasName).build();
elasticsearchTemplate.addAlias(aliasQuery);
我有一个测试class:
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
}
测试库Class:
package com.as.core.repositories
import com.as.core.entities.Test
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository
interface TestRepository extends ElasticsearchRepository<Test, String>
{
}
我的问题是如何从别名而不是索引本身读取? 写操作是否也发生在别名上。 我查看了以下 link: https://www.elastic.co/guide/en/elasticsearch/guide/current/index-aliases.html#index-aliases 它说我们将不得不使用别名而不是实际的 index.How 来实现这一点,使用 Elasticsearch Spring 数据 Java API.
我已经通过使用与对象关联的存储库 class 中的 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-data-elasticsearch 支持在别名中查找文档。我们能够制作 3.2 版。6.RELEASE 阅读带有
注释的文档@Document(
indexName = "alias",
createIndex = false,
type = '_doc'
)
来自 Spring 由 ElasticsearchRestTemplate 支持的数据 ElasticsearchRepository