当前位置: 首页 > 面试题库 >

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

曹振
2023-03-14
问题内容

嗨,我正在使用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查询都将正常工作。



 类似资料:
  • 我在ES上运行查询,但参数的数量正在增加(由于业务原因)。 根据Spring数据弹性搜索中的文档,您可以使用和有序参数,如,等,用于方法签名中给出的参数,但这种方法似乎有点不舒服 是否可以进行类似于的查询,换句话说,使用SpEL访问参数属性? 而不是以一系列参数的方法结束,比如 更像jpa使用的spring数据 或者是否有其他方法可以在不离开spring数据接口的情况下进行查询?

  • 我正试图通过Amazon Lambda访问托管在Amazon RDS上的MySQL数据库。我有. js文件,我可以通过windows上的cmd行运行,但是当我传输到Lambda时,我无法连接到数据库。我彻底研究了这个问题,甚至在遵循本指南之后:红钉AWS,我收到了“完成请求前退出进程”错误消息。 我的代码,从上面的教程复制 从Amazon Lambda收到的错误消息 响应:{“errorMessa

  • 问题内容: 我想使用ElasticSearch搜索文件名(而不是文件的内容)。因此,我需要找到文件名的一部分(完全匹配,没有模糊搜索)。 示例: 我有以下名称的文件: 现在,我要搜索以获取前两个文件。 搜索或应返回除最后一个文件名以外的所有文件名。 如何使用ElasticSearch做到这一点? 这是我测试过的,但始终返回零结果: 问题答案: 您粘贴的内容存在各种问题: 1)不正确的映射 创建索引

  • 我已经实现了Spring社会Spring安全,如Spring安全示例(以及Spring安全java配置)中所述。我当时报告了几个问题(请参阅 https://jira.springsource.org/browse/SEC-2204),所有这些问题都已解决,并且我的安全性工作正常。 但是,我想更改我的安全实现并使用RESTful身份验证。Spring oauth/oauth2(http://pro

  • 我创建了一个索引(house),其类型为“公寓”,包含20个文档。我使用postman将Json作为二进制文件上传到elasticsearch。我有一个Spring Boot项目,它有以下几个类: > 埃斯孔菲格。java-我已经配置了clustername,它是应用程序中的默认名称。属性文件。 partments.java-这是我的数据模型。这些文档在elasticsearch中有以下字段。 A

  • 我正在使用Spring boot和AWS elasticsearch服务。AWS Elasticsearch服务,仅提供REST接口。 Elasticsearch Rest客户端在这里。 简单地说,是否可以将REST客户端与Spring Data Elasticsearch一起使用? 换句话说,Spring Data Elasticsearch是否与Elasticsearch Rest客户端配合使