【问题标题】:Elastic search deep tree model弹性搜索深度树模型
【发布时间】:2017-02-16 18:54:10
【问题描述】:

我正在研究数据库工具,但我不太确定 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. 对元素名称进行“全文”搜索,响应应包括文档及其路径。例如,搜索“Cain”应该重播:

    一个。亚当/该隐

    b. ../大卫/丹尼/凯恩 b

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

  3. 通过id获取家谱,将响应分层树(嵌套JSON),从'id'作为根

  4. 树的深度约为 20-30 级,最多可包含 10,000 个元素

最后,我的问题:

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

  2. 我应该使用父/子方案吗?

  3. 索引映射的外观应该如何。

【问题讨论】:

    标签: elasticsearch tree


    【解决方案1】:

    回答您的问题:

    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) 只要您将字段的映射type 设置为text,您就可以随时进行full text 搜索。 This 应该可以帮助您识别使用类型 textkeyword 的区别。您可以将单个文档添加到索引中,或者您可以使用 bulk 添加包含多个文档。这也与其他 CRUD 操作密切相关。当您通过父 ID 请求文档时,我仍然不知道分层树将如何响应。

    希望这会有所帮助!

    【讨论】:

    • 感谢@Darth_Vader,在阅读您的回答后,我有后续问题:我如何在此处使用父/子,如果我理解正确,它不允许创建 n 级树相同类型的“my_index”?愿原力的(黑暗面)与你同在:)
    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2021-03-23
    • 2010-12-24
    相关资源
    最近更新 更多