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

将 Elasticsearch 添加到 “Spring Data MongoDB Project”

赵光赫
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;

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

Spring Boot应用程序

@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);
    }

}

Kafka消费者服务:

@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());
    }
}

Kafka 配置:

@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不提供的搜索?数据中没有文本字段,只有数值和日期。

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

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

至于 Elasticsearch 部分:您显然使用的是过时的 Spring Data Elasticsearch,在 4.1 版中删除了 @Document 的类型参数。注解 @org.springframework.format.annotation.DateTimeFormat 在 SDE 中不起作用,您需要向该属性添加具有适当的 Elasticsearch 支持的日期时间格式的@Field注解。

如错误所示,您需要提供一个用< code>@Id注释或命名为< code>id的属性,该属性包含该对象的唯一标识符(它可能为空,然后Elasticsearch将为此创建一个唯一的字符串值)。

 类似资料:
  • 我目前正在研究将多台机器中的节点添加到集群中。主节点应该是x. x. x.246,我要添加的数据节点是x. x. x.99。运行最新的elasticsearch 7.6。我已经确定这两个弹性是相同的版本。 代码有什么问题?我想我遵循了这个指示 新主节点配置的错误日志: 任何帮助或指示将不胜感激。谢谢你。

  • 问题内容: 我有一个现有的Elasticsearch索引,我想添加一个分析器,但是当我执行此命令时 我得到一个错误 {“错误”:“ IndexAlreadyExistsException [[nuxeo]已经存在]”,“状态”:400} 所以我必须在添加或刷新同义词文件之前删除索引不是很聪明。添加分析器的简单方法是吗?还是至少要刷新它?谢谢 问题答案: 您需要先关闭索引,更新分析器设置,然后再打开

  • 问题内容: RelativeLayout layout = new RelativeLayout(this); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); View gameView = initializeForView(new MainGame(), config); 什么也没显

  • 问题内容: 现在,我正在通过jquery加载iframe: 我有一个自定义样式表,希望将其应用于该页面。iframe中的页面不在同一域中,这就是为什么它很棘手的原因。我找到了允许您添加单个标签但不能添加整个样式表的解决方案。 编辑: 有问题的页面通过Mobile Safari 加载,因此跨域策略不适用。 问题答案: 基于解决方案您已经找到了如何将CSS应用于iframe?: 或更多jqueryis

  • 问题内容: 我有一个gui,它的Panel包含一系列标签和TextField,并使用spring布局(这是mainPanel),而另一个Panel仅包含button(buttonPanel)。我正在尝试使我的mainPanel也具有垂直滚动条。我想实现我的GUI,以便在JFrame中有2个面板。mainPanel出现在框架的顶部,而buttonPanel出现在mainPanel的下方。 我的问题是

  • 问题内容: 我正在尝试使用standard共享图像,可以使用以下代码在 Facebook , Twitter 和 Save Image 上 共享: 我还需要一件事, Instagram : 这两个代码分别工作正常,如何将 Instagram 添加到?有可能吗? 问题答案: 我认为将其他社交共享添加到您为Instagram编写的代码中会更加容易。“ .igo”扩展名是Instagram专有的,因此其