我们正在寻找有关在 ElasticSearch 中使用嵌套字段类型时可能遇到的规模/性能方面的任何陷阱的指导。我们有一个用例,我们正在使用 100k+ 个不同的客户模式,其中一些可能有 1m+ 个文档与之关联,我们希望支持对这些数据集的广泛客户查询。
例如,我们可能有一个客户与我们存储合同,他们的合同有 CounterParty(字符串)、Amount(数字)、Expiration(日期)。我们希望支持诸如“交易对手订购的金额> 100000且ExpirationDate> 2020-01-01的合同”之类的查询。
我们希望这些查询保持交互性(即 < 1 秒,从 10k 到 100 的数百万个文档)。我们已经进行了一些内部测试,但我想发布此内容以帮助我们发现我们遗漏的任何风险。
我们计划使用以下数据模型来支持大量模式,而不会导致映射爆炸:
{
"id": "12345",
"parent": "item_4567",
"stringFields": [
{
"typeKey": "contracts",
"fieldKey": "counterParty",
"value": "ACME Inc."
}, ...
],
"numberFields": [
{
"typeKey": "contracts",
"fieldKey": "amount",
"value": 100001
}, ...
],
"dateFields": [
{
"typeKey": "contracts",
"fieldKey": "expiration",
"value": "2020-01-24"
}, ...
],
}
映射将是:
{
"mappings": {
"_doc": {
"properties": {
"stringFields": {
"type": "nested",
"properties": {
"type": "string"
}
},
"numberFields": {
"type": "nested",
"properties": {
"type": "long"
}
},
"dateFields": {
"type": "nested",
"properties": {
"type": "date"
}
},
...
}
}
}
}
查询看起来像:
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "numberFields",
"query": {
"bool": {
"must": [
{ "match": { "numberFields.typeKey": "contract" } },
{ "match": { "numberFields.fieldKey": "amount" } },
{ "range": { "numberFields.value": { "gte": 100000 } } }
]
}
}
}
},
{
"nested": {
"path": "dateFields",
"query": {
"bool": {
"must": [
{ "match": { "numberFields.typeKey": "contract" } },
{ "match": { "numberFields.fieldKey": "expiration" } },
{ "range": { "numberFields.value": { "gte": "2020-01-01" } } }
]
}
}
}
}
]
}
},
"sort": [
{
"stringFields.value" : {
"order" : "asc",
"nested": {
"path": "stringFields",
"filter": {
"bool": {
"must": [
{ "match": { "stringFields.typeKey": "contract" } },
{ "match": { "numberFields.fieldKey": "counterParty" } }
]
}
}
}
}
}
]
}
您可以提供的任何关于我们在这样的模型中需要注意的事情的指导......尤其是在大规模排序性能、对这些结果的分页、显着的功能限制方面将非常有帮助,我们将非常感激。