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

Elasticsearch store user input as JSON document

我有一个架构问题 - 我的应用程序 back-end 写在 Java 上,客户端写在 AngularJS 上。现在我需要将用户输入存储在页面上,以便能够共享和收藏我的应用程序 urls 并通过此 url.

恢复状态

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

http://example.com/some-page

根据来自服务器的密钥,我会将此 url 更新为以下内容:

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

其中 234532453455 是 ES 中文档的键。

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

会成功吗?

另外,我现在很疑惑如何防止ES中的文件重复。现在我没有使用 ES 的经验,所以不知道 ES 的哪些方法可以开箱即用地用于此目的。

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

对我来说,您尝试实施缓存。

是的,你可以这样做,但如果你只将 ES 用于此解决方案,那么我认为你最好看看 redis or memcached

我不能说 ES 是不好的解决方案,但 ES 有一些你必须记住的技巧,例如它 near realtime search. After you index data they are not immediately available to search it takes few seconds depends on configuration(But you can also call _refresh 但如果你经常索引数据,我不确定性能)。

哈希:我看不出有什么理由使用 has 我最好创建正确的 ID。因此,如果每个用户的报告类型比 id 可能 "reporttype_{userid}",因为如果您将哈希用作 ID,那么每个新对象都会有新的 id 而不是重写您最终会为该用户拥有许多旧数据副本。如果您使用模式 reporttype_{userid} 那么每次用户使用新数据重新生成报告时,您都会覆盖它。

作为一个选项,您可以添加到该选项字段 useridexpireat 以供将来清理,例如您可以有工作清除过期报告,但这仅在使用 ES 时有效,因为在 redis 和 memcached 中,保存数据时可以选择设置过期