我们可以通过替换Postgres将弹性搜索用作后端数据存储吗?

时间:2017-10-09 20:36:30

标签: database spring postgresql elasticsearch full-text-search

我们正在使用Postgres存储和处理应用数据,应用数据主要包含:

  1. 我们需要在处理之后存储传入的请求json。
  2. 我们需要使用Identifier字段搜索特定的JSON,我们为表中的每一行创建一个单独的列
  3. 对于客户端,他们可能需要搜索JSON列,我的意思是客户端希望根据json中的某个键值来显示一个json
  4. 目前所有这些东西都适用于Postgres,当我正在阅读一些博客文章时,他们提到我们也可以使用ElasticSearch作为后端数据存储,而不仅仅是作为搜索服务器,如果我们可以这样使用,可以我们用ElasticSearch取代Postgres?我能做到这一点有什么好处,与我的情况相比,与ElasticSearch相比,postgres的优点是什么?

    请有人给出一些建议吗。

2 个答案:

答案 0 :(得分:2)

逐一回答问题:

  
      
  1. 我们需要在处理之后存储传入的请求json。
  2.   

是和否.ElasticSearch允许store JSON objects。如果JSON结构事先已知和/或稳定(即JSON中的相同键始终具有相同类型),则此方法有效。

默认情况下,映射(即集合的架构)为dynamic,表示它允许根据插入的值推断架构。假设我们插入此文档:

{"amount": 1.5}  <-- insert succeeds

在尝试插入这个之后立即:

{"amount": {"value" 1.5, "currency": "EUR"]} <-- insert fails

ES将回复并显示错误消息:

Current token (START_OBJECT) not numeric, can not use numeric value accessors\n at [Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@757a68a8; line: 1, column: 13]

如果您拥有结构未知的JSON对象,您仍然可以将它们存储在ES中,可以使用类型objectsetting property enabled: false完成;但是,这不允许您对此类字段的内容进行任何类型的查询。

  
      
  1. 我们需要使用Identifier字段搜索特定的JSON,我们为表中的每一行创建一个单独的列
  2.   

是。如果标识符是任意字符串,则可以使用类型keyword的字段完成此操作,如果是整数,则可以使用integer

  
      
  1. 对于客户端,他们可能需要搜索JSON列,我的意思是客户端希望根据json中的某个键值来获取一个json。
  2.   

按照1),是和否。如果JSON模式是已知且严格的,则可以完成。如果JSON结构是任意的,则可以存储但不可查询。

虽然我会说ElasticSearch不适合你的情况,但是有一些人为ElasticSearch制作了JDBCODBC个驱动程序,显然在某些情况下ElasticSearch可以用作关系数据库。 / p>

答案 1 :(得分:1)

elasticsearch是Apache Lucene的HTTP包装器。 Apache Lucene以列式方式存储对象以加速搜索(Lucene段)。

我正在完成非常好的尼古拉回答:

好处:

坏事:

我的观点是使用elasticsearch作为数据库的一种视图,具有只读访问权限。