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

使用Spring-Data Elasticsearch在Elasticsearch中动态创建索引名称

张翰音
2023-03-14
问题内容

我有一个用例,需要每月在Elasticsearch中创建索引。这个想法是在月度基础上创建索引,以便它们易于维护并且可以在过期时删除。为此,我使用了spring-
batch并有一个月度工作,它将按月基础创建索引以供Elasticsearch使用-Java集成我已经使用了Spring-Data
Elasticsearch实现。我现在面临的问题是,我无法弄清楚如何使用Entity对象为索引和映射提供动态名称。我当前的实现已牢记单个索引。请找到以下我用来创建索引的代码

elasticsearchTemplate.createIndex(SingleChat.class);
elasticsearchTemplate.putMapping(SingleChat.class);
elasticsearchTemplate.refresh(SingleChat.class, true);

而SingleChat是我的实体类

@Document(indexName="singlemsgtemp_#{jobParameters['MONTH']}",type="singlechat")
public class SingleChat {
    @org.springframework.data.annotation.Id
    String Id;
    @Field(type = FieldType.String)
    String conservationId;
    @Field(type = FieldType.String)
    String from;
    @Field(type = FieldType.String)
    String to;
    @Field(type = FieldType.String)
    String msgContent; 
    @Field(type = FieldType.String)
    String sessionId;
    @Field(type = FieldType.Date, index = FieldIndex.not_analyzed, store = true, format = DateFormat.date_hour_minute_second_millis)
    Date postedDate;
    @Field(type = FieldType.Date, index = FieldIndex.not_analyzed, store = true, format = DateFormat.date_hour_minute_second_millis)
    Date expireDate;
}

但这没有按预期工作。我也在尝试其他一些东西。但我愿意提出建议。也可以对我当前的方法发表评论,不管它是否有效。请让我知道是否需要更多详细信息。


问题答案:

我在应用程序上执行的操作是使用ElasticSearchTemplate创建动态索引名称,然后将别名指向已创建的新索引,然后删除旧索引。

esTemplate.createIndex(newIndexName, loadfromFromFile(settingsFileName));
esTemplate.putMapping(newIndexName, "MYTYPE", loadfromFromFile(mappingFileName));

我没有使用班级中的映射和设置,因为我需要它是动态的。

    protected String loadFromFile(String fileName) throws IllegalStateException {
       StringBuilder buffer = new StringBuilder(2048);
       try {
           InputStream is = getClass().getResourceAsStream(fileName);
           LineNumberReader reader = new LineNumberReader(new InputStreamReader(is));
           while (reader.ready()) {
               buffer.append(reader.readLine());
               buffer.append(' ');
           }
       } catch (Exception e) {
           throw new IllegalStateException("couldn't load file " + fileName, e);
       }
       return buffer.toString();
   }


 类似资料:
  • 问题内容: 我需要为索引禁用自动索引创建,但需要允许另一个索引。如何仅通过Elasticsearch禁用特定索引的自动索引创建?我试过了 在elasticsearch.yml文件中,但似乎禁用了所有的所有自动索引。有人可以帮我吗? 问题答案: 除了true / false值之外,“ action.auto_create_index”有点复杂。我们可以使用索引名称中出现的模式进行识别,并可以指定是否

  • 问题内容: 我正在努力完成索引创建这一简单任务,目标是使用分析器和字段映射创建索引。当我使用分析器创建索引时,我可以通过分析api调用与分析器通信,但是当我添加映射信息时,创建索引调用失败,并显示“字段[$ field]]找不到Analyzer [analyzer1]”,我创建了一个脚本来显示问题: 问题答案: 我相信您的问题是这些设置需要嵌套在JSON的一个节点内,而不是您所拥有的嵌套在一个节点

  • 我正在阅读文档,碰巧阅读了多个索引的创建和在多个索引上搜索的能力,以及在Elasticsearch中搜索特定搜索的可能性。 例如,我有两个索引,如释放区和工作区。我可以通过给http://localhost:9200/_search?pretty=true搜索,这将在所有索引中搜索 我可以专门搜索http://localhost:9200/releasedArea,工作区/\u搜索?漂亮=真。 因

  • 我正在设置Filebeat将日志发送到Elasticsearch。这是我的: 我有这个文件: 我期待着这份日志被发送到Elasticsearch。Elasticsearch在localhost的Docker容器中运行,地址为9200。 当我运行filebeat(Docker)时,Elasticsearch中不会创建索引。所以,在基巴纳,我没有看到任何数据。 为什么?Filebeat不应该自动创建索

  • 我已经在Ubuntu14.04中安装了ElasticSearch5.1。我在Elasticsearch中执行了一些操作,如创建索引,删除索引等,然后我安装了Kibana5.1。现在我想使用postman(localhost:9200/my_index with PUT)在elasticsearch中创建新的索引。但我遇到了这个错误。 我记得我曾使用作为索引或类型。但我已经清除了elasticsea

  • 问题内容: 我正在尝试仅针对特定索引而不是对所有索引禁用动态映射创建。由于某种原因,我无法将 默认 映射与’dynamic’:’false’ 放在一起。因此,在这里我看到了两个选项: 指定属性 “index.mapper.dynamic” 文件 elasticsearch.yml 。 将 “ index.mapper.dynamic” 放在索引创建时,如此处https://www.elastic.