当前位置: 首页 > 知识库问答 >
问题:

在“Spring data+mongodb项目”中添加elasticsearch

宦子琪
2023-03-14

第二个问题:当elastic和mongo都有@DocumNet注释时,如何注释模型类?现在我错误地认为它与这个问题有关:“没有为类找到id属性”

@Document(indexName = "gold", type = "article")
@Document
public class GoldSnapShot {
    public static final String TOPIC = "goldsnapshot";
    Double ons;
    Double gram18;
    Double irec;
    Double dollar;
    @org.springframework.format.annotation.DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private DateTime timestamp;

最后,我将感谢任何关于最佳实践和更干净的编码的指导。

SpringBootApplication:

@EnableMongoRepositories("com.sames.samesgoldconsumer.Repository")
@EnableElasticsearchRepositories(basePackages = "com.sames.samesgoldconsumer.elasticsearch.Repository")
@SpringBootApplication
public class SamesGoldConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SamesGoldConsumerApplication.class, args);
    }

}
@Component
public class KafkaConsumerService {
    private final GoldSnapShotMongoRepository goldSnapShotMongoRepository;
    private final GoldSnapShotElasticRepository goldSnapShotElasticRepository;

    private final Logger logger
            = LoggerFactory.getLogger(KafkaConsumerService.class);

    public KafkaConsumerService(GoldSnapShotMongoRepository goldSnapShotMongoRepository,
                                GoldSnapShotElasticRepository goldSnapShotElasticRepository) {
        this.goldSnapShotMongoRepository = goldSnapShotMongoRepository;
        this.goldSnapShotElasticRepository = goldSnapShotElasticRepository;
    }
    @KafkaListener(topics = "gold", groupId = AppConstants.GROUP_ID)
    public void processMessage(GoldSnapShot goldSnapShot) {
        logger.info(String.format("GoldSnapShot Received -> %s", goldSnapShot.toString()));
        goldSnapShotMongoRepository.save(goldSnapShot);
        goldSnapShotElasticRepository.save(goldSnapShot);
    }
}
@Configuration
public class ElasticConfig {

    @Bean
    public RestHighLevelClient client() {
        ClientConfiguration clientConfiguration
                = ClientConfiguration.builder()
                .connectedTo("localhost:9200")
                .build();

        return RestClients.create(clientConfiguration).rest();
    }

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() {
        return new ElasticsearchRestTemplate(client());
    }
}
@EnableKafka
@Configuration
public class KafkaConfig {
//    @Value("${spring.kafka.consumer.group-id}")
//    private String brokers;
    private final String brokers = "localhost:9092";
//    @Value("${spring.kafka.bootstrap-servers}")
//    private String groupId;
    private final String groupId = "group-id";
    @Bean
    public ConsumerFactory<String, GoldSnapShot> consumerFactory() {
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers);
        props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ErrorHandlingDeserializer.class);
        props.put(ErrorHandlingDeserializer.VALUE_DESERIALIZER_CLASS, JsonDeserializer.class);
        props.put(JsonDeserializer.VALUE_DEFAULT_TYPE, GoldSnapShot.class);
        return new DefaultKafkaConsumerFactory<>(props);
    }
    @Bean
    KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, GoldSnapShot>>
    kafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, GoldSnapShot> factory =
                new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory());
        return factory;
    }
}

共有1个答案

雍光远
2023-03-14

您真的需要将整个对象存储在ES中吗?我只是想知道在ES中有什么搜索是MongoDB没有提供的?数据中没有文本字段,只有数值和日期。

我强烈建议不要将同一个类用于三个目的:阅读Kafka,存储到MongoDB和ElasticSearch中。为Spring数据模块定义单独的类,并编写映射器将从Kafka读取的数据转换为单独的数据模型。

否则,您最终会在类上有两个不同的@document注释,其中一个需要完全限定。

 类似资料:
  • 问题内容: 我有填充我的JList的方法,有没有一种方法可以添加JList中的每个项目? 问题答案: 您可以重写JList的getToolTipText(..)方法。 我相信您也可以使用自定义渲染器来调用setToolTipText(…)方法。

  • 我是SpringMVC的新人。我试图将我的核心Maven项目添加到Spring MVC Maven项目中。它成功地构建了,我可以在“target\project.war\WEB-INF\lib”中看到相应的jar文件,但它在glassfish控制台上引发了错误。 严重:部署应用程序时出现异常 我不能添加任何maven项目或jar文件。极有可能我没有做正确的添加依赖关系。如果有人能帮我。提前谢了。

  • 我使用play框架创建了web应用程序。我正在尝试使用Play Ebean遵循这篇指南Java EBean-2.6.x-Play框架。因此,我将复制到plugins.sbt中,并修改了build.sbt 但在运行sbt时,它表示无法解析依赖项。 在阅读了很少其他stackoverflow发布链接1和链接2后,似乎是由于不匹配的版本。我尝试使用sbt-play-ebean 6.1.0,但没有效果。第

  • 我正在使用JSP,在添加JDBC驱动程序到我当前的项目中时遇到了一个问题。我试图构建一个到jdbc库的路径,并将jdbc jar直接复制粘贴到“lib”文件夹中,但没有任何效果,我不断得到“没有找到适合jdbc:mysql://localhost:3306/mydb的合适的驱动程序”错误。我做错什么了吗?还有其他添加JDBC的方法吗?

  • 目前,我有个问题。我可以在mongodb中使用聚合函数查询相应的数据,但是在使用springdatamongodb后,我发现lookup不能使用变量将string转换为objectid,那么该如何编写这个聚合函数呢 如何在spring data mogodb中将其写成mongodb表达式

  • 问题内容: 我想将一个项目添加到Python中的现有字典中。例如,这是我的字典: 我想添加一个新项目,例如: 我该如何实现? 问题答案: default_data[‘item3’] = 3 像py一样容易。 另一个可能的解决方案: 如果您想一次插入多个项目,这很好。

  • 问题内容: 我设法下载了Eclipse Helios的svn插件。然后,我设法将一个新的存储库添加到我选择的驱动器中。但是我看不到如何知道已经创建的项目?有人可以告诉我我该怎么做。 谢谢 问题答案: 就像是: 右键单击您的项目。 选择团队->共享项目。 该向导将指导您进行初始导入。 实际上,Initial Import不会将任何代码放入项目存储库中,而只是将项目详细信息放入仓库中。因此,您需要执行

  • 我正在使用flutter来研发App。我在我的项目中添加了fire base,之后当我运行应用程序时,调试控制台中出现了一些错误。我删除了fire base库,但其他库再次出现错误。 注意:我不使用Android X 建筑格拉德尔: bulild.gradle(app) > 运行Gradle: ProcessException: Process"E:\MehrdadyOmidi\Project\f