我正在使用 Elasticsearch 来存储实验数据,我想要一些关于如何最好地构建我的数据模型的建议。
我可以很容易地用 SQL 表、链接和联接来想象它;但我很难找到将 SQL 模式非规范化为良好 Elasticsearch 映射的好方法。
这是一个简化的示例。假设我有三个 SQL 表:
Experiment Table:
- experiment_ID (PK)
- experiement_name
- start_date
- lead_scientist
Plant Table:
- plant_id (PK)
- species
Follow Up Table:
- follow_up_id (PK)
- experiment_id (FK)
- plant_id (FK)
- date
- biomass
- temperature
这个想法是使用跟进表来跟踪实验的日常观察
ES 的非规范化文档可以是:
{
"follow_up_id": "f1",
"date": "2023-10-11T04:06:07",
"bioMass": 4.6,
"temperature": 23.6,
"experiment": {
"experiment_id": "e1",
"experiment_name": "...",
"start_date": "2023-10-01T00:00:00",
"lead_scientist": "John Doe"
},
"plant": {
"plant_id": "...",
"species": "..."
}
}
这对于大多数用例都适用(列出实验、实验的平均数据、列出实验的所有后续措施),但某些用例存在一些问题:
创建一个新实验:
当科学家想要开始新实验时,他们希望在有任何后续数据之前创建实验(基本上,您打开网络界面,单击“创建新实验”,填写实验详细信息,并且仅在他们完成第一个实验后的第二天跟进)
我可以在 SQL 中轻松做到这一点,在“实验表”中创建一个新行,稍后将在后续表中引用该行。
我如何使用 Elasticsearch 做到这一点?使用我建议的 json 文档,我需要创建一个“假”后续条目来创建实验,如果我对实验中的数据进行平均,则会损害结果,因为“后续”计数将产生 +1
在实验结束时更新实验数据(还不是必需的,但我期待客户的请求^^)。
例如,如果科学家想要添加总体观察或实验结果,我将需要更新该实验的所有“后续”文档,这看起来不太好
有没有更好的方法来对我的数据进行非规范化以处理这两个用例?
我尝试逐点回答。
experiments
和follow-up
。它们之间存在依赖关系,其中 experiment
在 follow-up
上具有等级优越性
。一个 experiment
可以独立于结果的存在而存在 follow-up
。所以我可以创建两个索引,每个索引对应实体:experiment```
could be:
"experiment": {
"experiment_id": "e1",
"experiment_name": "...",
"start_date": "2023-10-01T00:00:00",
"lead_scientist": "John Doe"
"plant_id": "aab"
"plant_species": "..."
}
还有
follow-up
可能:
{
"follow_up_id": "f1",
"date": "2023-10-11T04:06:07",
"bioMass": 4.6,
"temperature": 23.6,
"experiment_id": "e1",
"plant_id": "aab"
}
钥匙在哪里
"plant_id"
和 "experiment_id"
其值在两个指数之间共享。通过这种方式,我可以检索有关针对该字段进行“多索引查询”的特定实验的所有后续信息。如果绝对必要,请勿在我的文档中创建嵌套字段,这一点非常重要。
如果您的科学家想要更新所有 follow-ups
follow-up
上使用批量查询 updatebyquery
对与该特定匹配的所有文档建立索引 experiment_id