Столкнувшись с проблемой изменения способа хранения данных в elasticsearch (версия 6), текущая архитектура выглядит так: все основные продукты, элементы продуктов, категории и бренды хранятся в Postgresql. Затем добавьте инвентарь магазина из PostgreSQL в elasticsearch, каждый магазин имеет свой собственный инвентарь. с использованием гема elasticsearch-rails репозиторий сохраняемости имеет отображение, указанное ниже. Это была ошибка, которую мы сделали: для каждого индекса магазина шардов было три, чем больше магазинов мы добавляли, тем больше оно умножалось на 3, и наша кучная память (20 ГБ) была заполнена, и у нас был один сервер (еще одна ошибка).
class ShopInventoryRepository
include Elasticsearch::Persistence::Repository
include Elasticsearch::Persistence::Repository::DSL
client Elasticsearch::Client.new(url: ENV['ELASTICSEARCH_URL'], log: true)
index_name "#{Rails.env}_shop_inventory" … explicitly we provide index_name as #{Rails.env}_shop_inventory_#{shop.id}
document_type "shop_inventory"
klass ShopInventory
settings number_of_shards: 3,
mappings do
indexes :id, type: 'integer'
indexes :product_id, type: 'integer'
indexes :name, type: 'text', analyzer: 'gramAnalyzer', search_analyzer: 'whitespace_analyzer', fields: {raw: {type: "keyword"}}
indexes :product_sizes, type: 'nested' do
….
end
indexes :category do
….
end
indexes :sub_category do
….
end
indexes :brand do
…..
end
end
end
{
"took":0,
"timed_out":false,
"_shards":{
"total":3,
"successful":3,
"skipped":0,
"failed":0
},
"hits":{
"total":3202,
"max_score":1.0,
"hits":[
{
"_index":"staging_shop_inventory_552",
"_type":"shop_inventory",
"_id":"1",
"_score":1.0,
"_source":{
"id":1,
"name":"Product A",
"product_id":,
"image":",
"alternate_name":"",
"name_suggest":"Product A ",
"brand_suggest":"Product A",
"name_autocomplete":"Product A",
"brand_autocomplete":"Product A",
"is_deleted":false,
"deleted_at":null,
"created_at":"",
"product_sizes":[
{
"id":2,
"product_id":1,
"ean_code":null,
"uom":"ml",
"weight":180.0,
"price":295.0,
"is_deleted":false,
"deleted_at":null,
"product_update_on":"",
"product_update_status":0,
"in_stock":true,
"description":null
},
{
"id":3,
"product_id":2,
"ean_code":null,
"uom":"ml",
"weight":45.0,
"price":72.0,
"is_deleted":false,
"deleted_at":null,
"product_update_on":"",
"product_update_status":0,
"in_stock":true,
"description":null
}
],
"category":{
"id":3,
"name":"Category A",
"image":""
},
"sub_category":{
"id":11,
"name":"Sub Category A",
"image":"",
"is_selected":null,
"created_at":"",
"updated_at":""
},
"brand":{
"id":23,
"name":"Brand A",
"image":"",
"is_selected":null,
"created_at":"",
"updated_at":""
}
}
}
]
}
}
Что мы планируем сделать, так это вместо того, чтобы создавать каждый репозиторий / индекс для магазина, мы планируем сгруппировать магазин по n (500) номерам и создать новое репо для этого и добавить 5-10 осколки. Планирование сглаживания сопоставления не могло найти способа сделать это. Любое предложение о том, как это сделать, было бы действительно полезно. Если потребуется дополнительная информация, дайте мне знать, я могу поделиться соответственно