mka*_*lsi 4 elasticsearch elasticsearch-mapping
在 elasticsearch 中存储关系数据有哪些选项。我知道以下方法
嵌套对象:- 我不想以嵌套格式存储数据,因为我想在不更改另一个文档的情况下更新一个文档,如果我使用嵌套对象,那么父文档中将出现重复的子数据。
父子:- 我不想将数据存储在单个索引中,但是为了使用父子数据需要存在于一个索引(不同类型)中。我知道这个限制将在https://github.com/elastic/elasticsearch/issues/15613问题中提到的未来版本中删除,但我想要一个应该适用于 5.5 版本的解决方案。
除了上面之外还有其他方法吗?
嵌套对象是一个完美的方法。如果正确更新子对象,父文档中将不会重复子对象。对于我需要维护主子一对多关系的关系数据的用例之一,我使用了相同的方法。我写了一个无痛脚本用于更新API来添加和更新现有的嵌套子,而无需创建副本或重复的条目对象中的父文件。
更新答案:
下面是带有嵌入嵌套类型文档“childs”的父子嵌套类型文档的结构。
{
"parent_id": 1,
"parent_name": "ABC",
"parent_number": 123,
"parent_addr": "123 6th St. Melbourne, FL 32904"
"childs": [
{
"child_id": 1,
"child_name": "PQR",
"child_number": 456,
"child_age": 10
},
{
"child_id": 2,
"child_name": "XYZ",
"child_number": 789,
"child_age": 12
},
{
"child_id": 3,
"child_name": "QWE",
"child_number": 234,
"child_age": 16
}
]
}
Run Code Online (Sandbox Code Playgroud)
映射如下:
PUT parent/
{
"parent": {
"mappings": {
"parent": {
"properties": {
"parent_id": {
"type": "long"
},
"parent_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"parent_number": {
"type": "long"
},
"parent_addr": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"child_tickets": {
"type": "nested",
"properties": {
"child_id": {
"type": "long"
},
"child_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"child_number": {
"type": "long"
},
"child_age": {
"type": "long"
}
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 RDMS 中,这两个实体(父、子)是两个不同的表,父 -> 子之间存在一对多关系。Parent 的 id 是 Child 行的外键。(两个表都必须有 id)
现在在 Elasticsearch 中,要索引父文档,我们必须有 id 来索引它,在这种情况下它是 parent_id。索引父文档查询(parent_id 是我正在谈论的 id,并使用 id(_id) = 1 索引文档):
POST parent/parent/1
{
"parent_id": 1,
"parent_name": "ABC",
"parent_number": 123,
"parent_addr": "123 6th St. Melbourne, FL 32904"
}
Run Code Online (Sandbox Code Playgroud)
现在,将孩子添加到父母。为此,您将需要应具有子 ID 和父 ID 的子文档。要添加子项,必须提供父 ID。以下是添加新子项或更新已存在子项的更新查询。
POST parent/parent/1/_update
{
"script":{
"lang":"painless",
"inline":"if (!ctx._source.containsKey(\"childs\")) {
ctx._source.childs = [];
ctx._source.childs.add(params.child);
} else {
int flag=0;
for(int i=0;i<ctx._source.childs.size();i++){
if(ctx._source.childs[i].child_id==params.child.child_id){
ctx._source.childs[i]=params.child;
flag++;
}
}
if(flag==0){
ctx._source.childs.add(params.child);
}
}",
"params":{
"child":{
"child_id": 1,
"child_name": "PQR",
"child_number": 456,
"child_age": 10
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
试一试。干杯!
需要帮助请叫我。
| 归档时间: |
|
| 查看次数: |
8176 次 |
| 最近记录: |