我正在研究数据库工具,我不太确定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
}
我想要执行的查询:
'全文'搜索元素名称,响应应包括文档及其路径。例如,搜索'该隐'应重播:
一个。亚当/该隐
湾../David/Danny/Cain b
按ID的CRUD人(Ids是唯一的)
通过id获取族树,将以“id”作为根响应层次树(嵌套JSON)
树约有20-30级深度,最多10,000个元素
最后,我的问题:
elasticsearch能为我提供这个功能吗?
我应该使用父/子计划吗?
索引映射应该如何显示。
答案 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请求文档时,我仍然不知道层次结构树会如何响应。
希望这有帮助!