0

我们正在寻找有关在 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" } }
              ]
            }
          }
        }
      }
    }
  ]
}

您可以提供的任何关于我们在这样的模型中需要注意的事情的指导......尤其是在大规模排序性能、对这些结果的分页、显着的功能限制方面将非常有帮助,我们将非常感激。

4

0 回答 0