Будет ли это использование вложенных полей в масштабе ElasticSearch или возникнут какие-либо неожиданные ошибки?

#elasticsearch #lucene #elasticsearch-nested

Вопрос:

Мы ищем рекомендации по любым подводным камням с точки зрения масштаба / производительности, с которыми мы можем столкнуться при использовании вложенного типа поля в ElasticSearch. У нас есть пример использования, в котором у нас есть более 100 тыс. различных схем клиентов, с которыми мы работаем, с некоторыми из которых может быть связано более 1 млн документов, и мы хотели бы поддерживать широкий спектр запросов клиентов к этим наборам данных.

Например, у нас может быть клиент, который хранит контракты с нами, и в их контрактах есть контрагент (строка), Сумма (номер), Срок действия (дата). Мы хотели бы поддержать такие запросы, как «контракты с суммой > 100000 и датой истечения срока действия >> 2020-01-01, заказанные контрагентом».

Мы бы хотели, чтобы эти запросы оставались интерактивными (т. е. Мы провели некоторое внутреннее тестирование, но я хотел опубликовать это, чтобы помочь нам обнаружить любые риски, которые мы пропустили.

Мы планировали использовать следующую модель данных для поддержки большого количества схем, не вызывая взрыва отображения:

 {
    "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" } }
              ]
            }
          }
        }
      }
    }
  ]
}
 

Любые рекомендации, которые вы могли бы дать о вещах, на которые нам нужно было бы обратить внимание в такой модели, как эта… Особенно в том, что касается производительности сортировки в масштабе, разбивки по страницам этих результатов, заметных ограничений функций, это было бы очень полезно, и мы были бы вам глубоко признательны.

Комментарии:

1. Также опубликовано по адресу: discuss.elastic.co/t/…