弹性搜索深层树模型

时间:2017-02-16 09:22:38

标签: elasticsearch tree

我正在研究数据库工具,我不太确定Elastic如何能够满足我的要求。

我有一个树数据结构,一个家谱。

根是第一个男人亚当,后来他的孩子,还有孩子等等。

元素看起来像这样(不关心婚姻关系这个数据只是为了得到这个想法):

{
  id: 1
  name: “Adam”
  parentId: 0
}, {
  id: 2
  name: “Cain”
  parentId: 1
}, {
  id: 3
  name: “Abel”
  parentId: 1
}, {
  id: 4
  name: “johnny(Cain junior)”
  parentId: 2
}, … {
  id: 12324568
  name: “Cain b”
  parentId: 1434
}

我想要执行的查询:

  1. '全文'搜索元素名称,响应应包括文档及其路径。例如,搜索'该隐'应重播:

    一个。亚当/该隐

    湾../David/Danny/Cain b

  2. 按ID的CRUD人(Ids是唯一的)

  3. 通过id获取族树,将以“id”作为根响应层次树(嵌套JSON)

  4. 树约有20-30级深度,最多10,000个元素

  5. 最后,我的问题:

    1. elasticsearch能为我提供这个功能吗?

    2. 我应该使用父/子计划吗?

    3. 索引映射应该如何显示。

1 个答案:

答案 0 :(得分:2)

回答你的问题:

3)您的索引映射可能如下所示:

 {
  "mappings": {
    "my_index": {
      "properties": {
        "id": {
          "type": "integer",
          "fielddata": true <-- you need this if you're using this field for aggregations
        },
        "parentId": {
          "type": "integer"
        },
        "name": {
          "type": "text" <-- can be text/keyword depending on your requirement
        }
      }
    }
  }
}

2)我建议您使用parent-child映射,以便您可以拥有一对多关系。 Elasticsearch维护父母如何与子女对应的地图,并且由于此映射,查询时间连接很快。您可以阅读此SO以了解基于嵌套的父子映射的基准。

1)只要您将字段的类型映射为文本,就可以始终进行full text搜索。 This应该可以帮助您确定使用text类型而不是keyword的区别。您可以将单个文档添加到索引中,否则您可以使用包含多个文档的bulk添加。这与其他 CRUD 操作同时进行。当您通过父ID请求文档时,我仍然不知道层次结构树会如何响应。

希望这有帮助!