spring - 使用Spring data mongo和Spring data elasticsearch时如何建模?

标签 spring mongodb spring-data spring-data-mongodb spring-data-elasticsearch

我想在我的项目中使用mongo和ElasticSearch,我也喜欢采用Spring Data Mongo和Spring Data ElasticSearch,但是两者都有各自的Repository和model specs,如何搭配使用?

有一些选项:

  1. 对 Mongo 和 ElasticSearch 使用相同的模型类?

    @Document//from Spring Data Mongo
    @Document// from Spring Data ElasticSearch
    public class Book{
        @Id//Spring Data Commons
        private String id;
    }
    

    但是Spring Data Mongo和Spring Data ElasticSearch存在一些不匹配的地方,比如Geo字段类型。

  2. 为 Mongo 和 ElasticSearch 定义不同的模型,并在创建新模型时从 Mongo 模型复制数据状态​​并创建索引。

这里有什么建议吗?

我想在项目中使用选项 2。

  1. 正常保存 mongo 文档。
  2. 通过 JMS/AMQP/Reactor 触发事件将数据同步到 Elasticsearch,并为 ElasticSearch Document 中的每个字段选择索引策略。
  3. 所有搜索操作均基于 ElasticSearch。

更新于 2016 年 5 月 15 日

我创建了一个示例来演示这种方法。

Sample codes

我使用 Spring 内置的 ApplicationEvent 来演示这种方法。

  1. 事件发布者端,Mongo 保存帖子并发布事件。

    @Component
    public class Publisher implements ApplicationEventPublisherAware {
    
        private static final Logger LOG = LoggerFactory.getLogger(Publisher.class);
    
        @Autowired
        PostRepository repository;
    
        private ApplicationEventPublisher publisher;
    
        public Publisher() {
        }
    
    
        public void savePost(Post post) {
            Post saved = repository.save(post);
            this.publisher.publishEvent(saved);
    
            LOG.debug("saved post data in mongo@" + saved);
        }
    
        @Override
        public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
            this.publisher = publisher;
        }
    
    }
    
  2. 事件接收方,接收数据并将其同步到 ElasticSearch 存储中。

        @Component
    public class Receiver {
    
        private static final Logger LOG = LoggerFactory.getLogger(Receiver.class);
    
        @Autowired
        ESPostRepository repository;
    
        @EventListener
        public void onPostSaved(Post savedPost) {
            LOG.debug("=================received post data============== @\r\n"+ savedPost);
    
            ESPost doc=new ESPost();
            doc.setId("1");
            doc.setTitle(savedPost.getTitle());
            doc.setContent(savedPost.getContent());
            repository.save(doc);
        }
    
    }
    

在生产环境中,发布者和接收者可以通过JMA/AMQP放置在不同的应用程序中,而不是内置的ApplicationEvent。

mongo 用作主存储,ElasticSearch 用作索引/搜索服务器。

最佳答案

您可以只为不同的文档注释使用完全限定的域名吗?

这就是我们在这里要做的。

  @Document(collection = "SPECTRUM")
  @org.springframework.data.elasticsearch.annotations.Document(indexName = "spectrum", `type` = "spectra", shards = 1, replicas = 0, refreshInterval = "-1")
  case class Spectrum(
                  ...
  )

关于spring - 使用Spring data mongo和Spring data elasticsearch时如何建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24472296/

相关文章:

java - 如果身份验证失败,则关闭 HTTP 连接

MongoDB到Java的集成

mongodb - 将常规 MongoDB 查询运算符与 $or 运算符相结合

PHP 启动 : unable to initialize module

java - 有没有办法在 Spring Data @Query 注释值中使用常量?

spring - 如何从 PageRequest 禁用计数查询以获取总页数?

spring 配置服务器不刷新属性

spring - Geronimo.out增加太快

java - 在Docker中将Java War部署到Tomcat,错误No Spring WebApplicationInitializer types detected on classpath

java - 为什么 Spring Data 给我这个反射异常?