我想在我的项目中使用 mongodb 和 ElasticSearch,并且我也喜欢采用 Spring Data Mongo 和 Spring Data ElasticSearch,但是两者都有各自的存储库和模型规范,如何一起使用它们?
有一些选项:
-
Mongodb 和 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 字段类型。
为Mongodb和ElasticSearch定义不同的模型,并在创建新模型时从Mongo模型复制数据状态并创建索引。
这里有什么建议吗?
我想在项目中使用选项 2。
- 正常保存 mongo 文档。
- 通过 JMS/AMQP/Reactor 触发事件将数据同步到 Elasticsearch,并为 ElasticSearch 文档中的每个字段选择索引策略。
- 所有的搜索操作都是基于ElasticSearch。
更新于 2016 年 5 月 15 日
我创建了一个示例来演示这种方法。
示例代码 https://github.com/hantsy/spring4-sandbox/tree/master/event
我使用 Spring 内置的 ApplicationEvent 来演示这种方法。
-
事件发布方,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;
}
}
-
事件接收方,接收数据并将其同步到 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(
...
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)