【发布时间】:2014-10-18 16:11:24
【问题描述】:
我的问题是,是否可以在关系数据库之上使用 ElasticSearch。 1、我在关系型数据库中插入或删除一条记录时,是否会反映在elasticsearch中? 2.如果我在弹性搜索中插入一个文档,它会被持久化到数据库中吗? 3. 它是使用缓存还是内存数据库来方便搜索?如果有,有什么用?
【问题讨论】:
标签: java sql json elasticsearch
我的问题是,是否可以在关系数据库之上使用 ElasticSearch。 1、我在关系型数据库中插入或删除一条记录时,是否会反映在elasticsearch中? 2.如果我在弹性搜索中插入一个文档,它会被持久化到数据库中吗? 3. 它是使用缓存还是内存数据库来方便搜索?如果有,有什么用?
【问题讨论】:
标签: java sql json elasticsearch
在寻找类似的东西时遇到了这个问题。以为要更新了。
我的发现:
我发现的另一个选项是 Scotas Push Connector,它将插入、更新和删除从 RDBMS 推送到 Elasticsearch。详情在这里:http://www.scotas.com/product-scotas-push-connector。
此处的示例实现:http://www.scotas.com/blog/?p=90
【讨论】:
Elasticsearch 和关系数据库之间没有直接联系 - ES 拥有自己的基于 Apache Lucene 的数据存储。
也就是说,正如其他人所说,您可以使用 Elasticsearch River JDBC 插件将数据从关系数据库加载到 Elasticsearch。请记住,这种方法有许多限制:
这只是一种方式 - 用于 ES 的 JDBC River 仅从源读取 数据库 - 它不会将数据从 ES 推送到源数据库中。
不处理删除 - 如果您删除源数据库中的数据 在它被索引到 ES 之后,将不会反映删除 在 ES。 ElasticSearch river JDBC MySQL not deleting records 和https://github.com/jprante/elasticsearch-river-jdbc/issues/213
它并非旨在作为生产、可扩展的解决方案 关系数据库和 Elasticsearch 集成。从 JDBC River 的作者在 2014 年 1 月的评论中,它被设计为“ 单节点(不可扩展)解决方案” “用于演示目的。” http://elasticsearch-users.115913.n3.nabble.com/Strategy-for-keeping-Elasticsearch-updated-with-MySQL-td4047253.html
直接回答您的问题(假设您使用 JDBC River):
新文档插入可由 JDBC River 处理,但现有 数据删除不是。
数据不会从 Elasticsearch 流入您的关系数据库。那需要定制开发工作。
Elasticsearch 构建在 Apache Lucene 之上。 Lucene 反过来 很大程度上取决于操作系统级别的文件系统缓存(其中 这就是 ES 建议将堆大小保持在不超过 50% 的原因 总内存,为文件系统缓存留下很多)。此外 ES/Lucene 堆栈利用了许多内部缓存(例如 Lucene 字段缓存和过滤器缓存) http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules-cache.html 和 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules-fielddata.html 在内部,过滤器缓存是使用 bitset 实现的: http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/
【讨论】:
1)您应该查看 ElasticSearch jdbc River here 以进行插入(我相信已删除的行不再被管理,请参阅 developper comment)。
2) 除非您手动执行,否则它不会由 ElasticSearch 本地管理。
3)确实,ElasticSearch 使用缓存来提高性能,尤其是在使用过滤器时。存储位集(0/1 的数组)。
【讨论】: