2017-02-16 58 views
1

我正在研究数据库工具,而且我不太确定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. “全文'搜索元素名称,响应应包含文档和路径。例如,搜索“该隐”应该重播:

    a。 Adam/Cain

    b。通过ID ../David/Danny/Cain b

  2. CRUD人(ID是唯一的)

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

  4. 树大约是20-30〜级深,高达10000元

最后,我的问题:

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

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

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

回答

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)你总是可以做一个full text搜索,只要你有你的映射为您现场为文本This应该帮助您识别使用类型text而不是keyword的区别。您可以将单个文档添加到索引中,否则您可以添加包含多个文档的bulk。这与其他CRUD操作同时进行。我仍然不知道当您通过父ID请求文档时,分层树会如何响应。

希望这会有所帮助!

+0

感谢@Darth_Vader,它是阅读你的答案后,帮助 我有跟进的问题: 我怎么可以在这里使用父/子, 如果我理解正确的,它不会允许创建同一类型的N级树“my_index”? 可能的力量(黑暗的一面)与你:) – Ilan