【问题标题】:Elasticsearch store user input as JSON documentElasticsearch 将用户输入存储为 JSON 文档
【发布时间】:2017-06-30 15:41:24
【问题描述】:

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

我将实现以下方法 - 每次用户通过选择页面上的数据和条件与我的应用程序交互时,我都会将他的所有输入收集到一个复杂的 JSON 文档中,并将该文档存储在 Elasticsearch 中。来自 ES 的此文档的密钥我将发送回客户端应用程序(AngularJS)并基于此密钥我将更新页面 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 后端 REST 端点按键 (234532453455) 获取保存的状态。

会有用吗?

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

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

【问题讨论】:

    标签: json elasticsearch architecture spring-data-elasticsearch


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的详细解答。我正在考虑使用 ES 以避免“技术动物园”.. 因为我还将使用 ES 作为我项目的搜索引擎。考虑到 ES 的“近实时搜索”特性,我认为 Redis 会更适合这种缓存。
    • 另外,由于数据和项目性质,我不能真正将“报告类型”或“用户 ID”作为数据键。我将使用 CRC32(针对 JSON 字符串计算)作为我的文档的键。
    • 现在的主要标准 - 我需要通过自己的(由我提供)ID 进行设置/获取操作的极快存储。我希望 Redis 应该是一个很好的选择。
    • @alexanoid 那么 Redis 是最好的选择
    • 我还有一个标准——这个缓存中的数据不应该丢失。换句话说——数据应该被持久化到磁盘并且应该在重启后可用。 Redis 仍然是一个不错的选择吗?
    猜你喜欢
    • 2017-09-02
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2022-07-22
    • 2020-11-07
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多