弹性搜索存储分层数据并查询

时间:2018-10-04 08:14:02

标签: elasticsearch

让我分解一下这个问题需要花费一些时间。

请考虑您在系统中有一个实体A, B, C

  • A是一切的父母
  • BA的孩子
  • C可以是AB的子代,请注意还有更多的实体,例如D,E,FC相同。因此,让我们暂时只考虑C

所以基本上它是像树一样的结构

   ```
     A
    / \
   /   \
  B     C(there are similar elements like D, E, F)
  |
  |
  C
   ```

现在,我们需要使用Elastic Search作为辅助数据库来存储它。在数据库中,由于A, B, C具有动态字段,因此结构是完全不同的,因此它们是不同的表,我们将它们结合起来以获取数据,但是从业务角度来看,这是设计。

现在,当我们尝试将其放平并存储在es中时,

  • 我们有一个实体A1,它有2个孩子C1和B1,B1还有其他孩子C2

    A B C

    1 A1空null 2 A1空C1 3 A1 B1空 4 A1 B1 C2

现在您可以查询什么

  • use说他想要A,B,C的所有列,其中A列的值是A1,因此添加一些null删除规则,我们可以给他第2、3、4行
  • 现在是问题集,现在用户说他想要所有A,其中A的值为A1,因此基本上我们将向他返回所有行1,2,3,4或2,3,4,所以我们将看到类似

    的值

    A

    A1 A1 A1

但是从逻辑上讲,他应该只看到一列A1,因为那只是唯一的值。由于ES没有能力group by

那么我们如何解决问题。

  • 我们通过创建多个索引和一个嵌套索引来解决此问题
  • 因此,当我们需要按索引分组时,我们转到嵌套索引,其他索引作为平面索引工作
  • 所以我们有不同的索引,例如A and BA or B and C的索引。但是我们有更多元素,因此可以创建5个索引。
  • 随着数据开始增加,维护5个索引变得困难,而从头开始对其进行索引将花费太多时间。

因此,为解决此问题,我们开始寻找其他选项,并且正在测试cratedb。但是首先,我们仍在尝试找出ES中是否可以执行此操作,因为需要使用ES的许多功能,例如percolationwatcher等。对此有任何线索吗?

也请注意,我们也需要应用分页。这就是为什么单个嵌套索引不起作用

0 个答案:

没有答案