Elasticsearch将用户输入存储为JSON文档

时间:2017-02-12 17:22:25

标签: json elasticsearch architecture spring-data-elasticsearch

我有一个以下架构问题 - 我的应用程序后端是在Java和客户端编写的AngularJS。现在我需要在页面上存储用户输入,以便能够共享和标记我的应用程序URL并通过此URL恢复状态。

我将实现以下方法 - 每次用户通过选择页面上的数据和条件与我的应用程序交互时,我将在复杂的JSON文档中收集他的所有输入并存储此Elasticsearch的文件。来自ES的本文档的密钥我将发送回客户端应用程序(AngularJS),并根据此密钥更新页面URL。例如,原始网址如下:

http://example.com/some-page

根据服务器I的密钥更新此网址:

http://example.com/some-page/analysis/234532453455

其中234532453455是ES中文档的关键字。

每次用户尝试访问以下网址时,http://example.com/some-page/analysis/234532453455 AngularJS应用程序将尝试通过密钥(234532453455)通过Java后端REST端点获取保存状态。

它会起作用吗?

另外,我现在对如何防止ES中的文档重复表示怀疑。现在我没有使用ES的经验,所以不知道ES可以用什么方法开箱即用。

例如,计算每个JSON文档的一些哈希代码并将此哈希代码存储为文档的密钥是个好主意..因此,在存储新文档之前,我可以通过哈希代码检查旧文档。性能对我来说也很重要,所以请同时考虑这一点。

1 个答案:

答案 0 :(得分:1)

对我来说,听起来你试图实现缓存。

是的,您可以这样做,但如果您只将ES用于此解决方案,那么我认为您应该更好地关注redismemcached

我不能说ES是一个糟糕的解决方案,但ES有一些技巧,你必须记住它的near realtime search。索引数据后,它们无法立即搜索,只需几秒钟取决于配置(但您也可以调用_refresh但如果您经常索引数据,我不确定性能。)

哈希:我没有看到使用的理由,我最好创建正确的ID。因此,如果您有每个用户的报告类型而不是ID可能是“reporttype_ {userid}”,因为如果您将使用哈希作为ID,那么每个新对象将具有新的ID而不是重写您将最终为该用户提供了许多旧数据副本。如果您使用模式reporttype_ {userid},则每次用户使用新数据重新生成报告时,您只需覆盖它。

作为一个选项,您可以添加该选项字段用户ID expireat 以供将来清理,例如,您可以拥有清除过期报告的作业,但这是有效的只有当你使用ES时,因为在redis和memcached中可以选择在保存数据时设置过期