#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/…