Есть ли лучший способ разработать структуру данных для хранения инвентаря для каждого магазина? - PullRequest
1 голос
/ 29 мая 2020

Столкнувшись с проблемой изменения способа хранения данных в 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 осколки. Планирование сглаживания сопоставления не могло найти способа сделать это. Любое предложение о том, как это сделать, было бы действительно полезно. Если потребуется дополнительная информация, дайте мне знать, я могу поделиться соответственно

...