如何使用Spring数据mongo和Spring数据弹性搜索进行建模?

时间:2014-06-29 01:03:08

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

我想在我的项目中使用mongo和ElasticSearch,我也喜欢采用Spring Data Mongo和Spring Data ElasticSearch,但两者都有他们的Repository和model规范,如何一起使用它们?

有一些选择:

  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模型复制数据状态​​并创建索引。

  3. 这里有什么建议吗?

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

    1. 正常保存mongo文档。
    2. 通过JMS / AMQP / Reactor触发事件以将数据同步到Elasticsearch,并为ElasticSearch文档中的每个字段选择索引策略。
    3. 所有搜索操作都基于ElasticSearch。
    4. 于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);
            }
        
        }
        
      3. 在生产环境中,发布者和接收者可以通过JMA / AMQP而不是内置的ApplicationEvent放置在不同的应用程序中。

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

1 个答案:

答案 0 :(得分:0)

您是否可以使用完全限定的域名来处理不同的文档注释?

这就是我们在这里尝试的东西。

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