рдкреВрд░реНрдг рдкрд╛рда рдЦреЛрдЬ: рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрд▓рд┐рд╕реНрдЯрд┐рдХреНрд╕-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ

рдЫрд╡рд┐

рд╣рд╛рдп рд╕рдм, рдореЗрд░рд╛ рдирд╛рдо рдПрдВрдбреНрд░реА рд╣реИ, рдФрд░ рдореИрдВ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВред рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдкрд┐рдЫрд▓реЗ рд╢реБрдХреНрд░рд╡рд╛рд░ - рд╣рдорд╛рд░реА рдЯреАрдо рдХреЗ рдкрд╛рд╕ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдереА рдЬрд╣рд╛рдВ рдЙрдиреНрд╣реЗрдВ рдЙрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВред рдЪрд▓реЛ рд╕реЙрд╕реЗрдЬ рдХреА рд░рдЪрдирд╛ рдХрд╣рддреЗ рд╣реИрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЦреЛрдЬ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдерд╛: рд╕рднреА рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдШрдЯрдХ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ; рдПрди рдЕрд╡рдпрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░рд╛рдПрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЙрддреНрдкрд╛рджреЛрдВ рдФрд░ рдЕрд╡рдпрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡реГрджреНрдзрд┐ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рдереА, рдФрд░ рдЦреЛрдЬ рдХреЛ рди рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреА рдмрдврд╝рддреА рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдк рднреА рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдкреНрд░рдЪрд▓рд┐рдд рдЕрд╡рдпрд╡реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрддреНрдкрд╛рдж рд╡рд┐рд╡рд░рдг рдХрд╛ рд╕реНрд╡рдд: рд╕рдВрдХрд▓рдиред

рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ

  • рдХрдо рд╕реЗ рдХрдо 50,000 рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Elacsticsearch рдкрд░ рдПрдХ рдЦреЛрдЬ рдмрдирд╛рдПрдБред
  • рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЙрдЪреНрдЪ рдЧрддрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ - 300 рдПрдордПрд╕ рд╕реЗ рдХрдоред
  • рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЕрдиреБрд░реЛрдз рдЫреЛрдЯреЗ рдереЗ, рдФрд░ рд╕реЗрд╡рд╛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдореЛрдмрд╛рдЗрд▓ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рдереАред
  • UX рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рдЦреЛрдЬ рддрд░реНрдХ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд╣рдЬ рдмрдирд╛рдПрдВред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдерд╛ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЦреЛрдЬ рддрд░реНрдХ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдЧрд╛ - рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред
  • рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдХрдо рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдЗрдВрдЯрд░рд▓реЗрдпрд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░реЗрдВред
  • рдХрд┐рд╕реА рднреА рд╕рдордп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдирдИ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрд╛рдж рд╡рд┐рд╡рд░рдг рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреАрдврд╝реА)ред
  • рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЦреЛрдЬ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рд╕рдорд░реНрдерди рдХрд░реЗрдВред

рд╣рдордиреЗ рдЬрд▓реНрджрдмрд╛рдЬрд╝реА рдирд╣реАрдВ рдХреА рдФрд░ рд╕рд░рд▓ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рд░ 10,000 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрддреНрдкрд╛рдж рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рднреА рдЕрд╡рдпрд╡реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдЖрдХрд╛рд░ рдкрд░ рднреА, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдЦреЛрдЬ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬреЙрдЗрди-рдПрд╕ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ред рдФрд░ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ 50,000 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧреНрд░рд╛рд╣рдХ рдиреЗ рдПрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕рд░реНрдЪ (рдЗрд╕рдХреЗ рдмрд╛рдж - рдИрдПрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЗрд╕ рдЙрдкрдХрд░рдг рдореЗрдВ рдЖрдпрд╛ рдерд╛ рдФрд░, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдЧрд░реНрдо рднрд╛рд╡рдирд╛рдПрдВ рдереАрдВред рд╣рдордиреЗ рдкрд╣рд▓реЗ рдИрдПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рдереЗ рдФрд░ рдЗрд╕ рдкрд╕рдВрдж рд╕реЗ рд╕рд╣рдордд рдереЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рдереА рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдХреНрд╕рд░ рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреА (рдкреНрд░рддрд┐ рджрд┐рди 50 рд╕реЗ 500 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдорд╛рдиреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░), рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧреА рддреБрд░рдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрд╛рд╣рд░ рджреЗред

рд╣рдордиреЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЗрдВрдЯрд░рд▓реЗрдпрд░реНрд╕ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдФрд░ рдмрд╕ рд░реАрд╕реНрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗрд╡рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рдФрд░ рдлрд╛рдпрджрд╛ рдерд╛ - рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ ES рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред

рд╣рдордиреЗ рдкрд╣рд▓реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдордиреЗ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ (PostgreSQL) рд╕реЗ ES рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛:

{"mappings" : { "recipe" : { "_source" : { "enabled" : true }, "properties" : { "recipe_id" : {"type" : "integer"}, "recipe_name" : {"type" : "text"}, "ingredients" : { "type" : "nested", "properties": { "ingredient_id": "integer", "ingredient_name": "string", "manufacturer_id": "integer", "manufacturer_name": "string", "percent": "float" } } } } }} 

рдЗрд╕ рдореИрдкрд┐рдВрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдореЗрдВ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬ рдорд┐рд▓рддреЗ рд╣реИрдВ (рд╣рдо рдПрдирдбреАрдП рдХреЗ рдХрд╛рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╢реНрд░рдорд┐рдХ рдХреЛ рдирд╣реАрдВ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ):

 { "recipe_id": 1, "recipe_name": "AAA & BBB", "ingredients": [ { "ingredient_id": 1, "ingredient_name": "AAA", "manufacturer_id": 3, "manufacturer_name": "Manufacturer 3", "percent": 1 }, { "ingredient_id": 2, "ingredient_name": "BBB", "manufacturer_id": 4, "manufacturer_name": "Manufacturer 4", "percent": 3 } ] } 

рдпрд╣ рд╕рдм Elasticsearch PHP рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓рд╛рд░рд╡реЗрд▓ (рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреЗрдВрдЯ, рд▓рд╛рд░рд╛рд╡реЗрд▓ рд╕реНрдХрд╛рдЙрдЯ, рдЗрддреНрдпрд╛рджрд┐) рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреНрд╕ рдиреЗ рдЗрд╕реЗ рдПрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдмрд┐рдВрджреБ рддрдХ рдХрд┐ "рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП 300 рдПрдордПрд╕ рдмрд╣реБрдд рд╣реИред" рдФрд░ рд▓рд╛рд░рд╡реЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреИрдХреЗрдЬреЛрдВ рдиреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ред рдпрд╣ рд╕реАрдзреЗ рдЧреБрдЬрд╝рд▓реЗ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЪрд░рдо рд╕реАрдорд╛рдУрдВ рдкрд░ рди рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЦреЛрдЬ рд╕реАрдзреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рдХреА рдЧрдИ рдереАред рд╣рд╛рдВ, рдпрд╣ рд╕рдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕рднреА рд╕рдорд╛рди рдЕрдиреБрд░реЛрдз рдмрд╣реБрдд рдмрдбрд╝реЗ рд╣реЛ рдЧрдПред рдЦреЛрдЬ рд╕рдВрд▓рдЧреНрди рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ (рд╕рдорд╛рди рд╕рд╛рдордЧреНрд░реА) рдкрд░, "рдЪрд╛рд╣рд┐рдП" рдФрд░ "рдЪрд╛рд╣рд┐рдП" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреБрд▓рд┐рдпрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдкрд░ рд╣реБрдИ, рд╕рдВрд▓рдЧреНрди рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдкрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢ рднреА рдерд╛ - рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЕрдиреБрд░реЛрдз рдПрдХ рд╕реМ рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рдХреА рдорд╛рддреНрд░рд╛ рддреАрди рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рд╕реЗ рдереАред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЧрддрд┐ рдФрд░ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ - рдЙрд╕ рд╕рдордп рддрдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдЙрддреНрддрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд┐рдП рдЧрдП рдереЗ рдХрд┐ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛ: рдкреНрд░рддреНрдпреЗрдХ рдЬрд╕рди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдПрдХ рдЕрдХреНрд╖рд░ рддрдХ рдХрдо рд╣реЛ рдЧрдИ рдереАрдВред рдЗрд╕рд▓рд┐рдП, рдХреБрдЫ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХреЗ рдИрдПрд╕ рдореЗрдВ рдкреНрд░рд╢реНрди рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд▓рдХреНрдЬрд░реА рдмрди рдЧрдПред

рдФрд░ рдЙрд╕ рдкрд▓ рдореЗрдВ, рд╣рдордиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ PHP рдореЗрдВ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢рд╛рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рднрдпрдВрдХрд░ рд╡реНрдпрд╕рди рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рдпрдВрддреНрд░рдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдардиреАрдп рд╣реЛ рдЧрдП рд╣реИрдВ, рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ:

 public function searchSimilar() { /*...*/ $conditions[] = [ "nested" => [ "path" => "ingredients", "score_mode" => "max", "query" => [ "bool" => [ "must" => [ ["term" => ["ingredients.ingredient_id" => $ingredient_id]], ["range" => ["ingredients.percent"=>[ "lte"=>$percent + 5, "gte"=>$percent - 5 ]]] ] ] ] ] ]; $parameters['body']['query']['bool']['should'][0]['bool']['should'] = $conditions; /*...*/ $equal_conditions[] = [ "nested" => [ "path" => "flavors", "query" => [ "bool" => [ "must" => [ ["term" => ["ingredients.percent" => $percent]] ] ] ] ] ]; $parameters['body']['query']['bool']['should'][1]['bool']['must'] = $equal_conditions; /*...*/ return $this->client->search($parameters); } 

рдЧреАрддрд╛рддреНрдордХ рд╡рд┐рд╖рдпрд╛рдВрддрд░: рдЬрдм рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдо рдлрд╝реЙрд░реНрдо рдХреА рдПрдХ рдХреНрд╡реЗрд░реА рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 "query": { "bool": { "nested": { "bool": { "should": [ ... ] } } } } 

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП - рдЖрдк рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдмрд╣реБ-рдЦреЛрдЬ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдпрд╣ рдХрд░рдирд╛ рдкрдбрд╝рд╛:

 "query": { "bool": { "should": [ {"nested": { "path": "flavors", "score_mode": "max", "query": { "bool": { ... } } }} ] } } 

рдпрд╛рдиреА рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢рд░реНрддреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рдереА, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдВрджрд░ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХреА рдЧрдИ рдереАред рдПрд▓реАрдЯреЗрд╕рд░реНрдЪ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╣реА рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдордиреЗ рд╕реНрд╡рдпрдВ рджреЗрдЦрд╛ рдХрд┐ рдЬрдм рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЦреЛрдЬ рд╢рдмреНрдж рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рдерд╛ред

рдФрд░ рдпрд╣рд╛рдБ рд╣рдордиреЗ ES рдореЗрдВ рдирд┐рд░реНрдорд┐рдд Google рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдЦреЛрдЬ рдХреАред рдкрд╕рдВрдж рдореВрдВрдЫ рдкрд░ рдЧрд┐рд░ рдЧрдИ - рдПрдХ рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реНрдХ-рдХрдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрдиред рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдФрд░ рд╕рднреА рд╕рдВрдЪрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдмрд┐рдирд╛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ рдбрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рдерд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдВрддрд┐рдо рдЕрдиреБрд░реЛрдз рдиреЗ рд░реВрдк рд▓рд┐рдпрд╛:

 { "template": "template1", "params": params{} } 

рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд╢рд░реАрд░ рдХреЗрд╡рд▓ рдорд╛рдореВрд▓реА рдФрд░ рдкрдардиреАрдп рдирд┐рдХрд▓рд╛ - рдХреЗрд╡рд▓ JSON рдФрд░ рд╕реНрд╡рдпрдВ рдореВрдВрдЫреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢ред рдЯреЗрдореНрдкрд▓реЗрдЯ Elasticsearch рдореЗрдВ рд╣реА рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ рдФрд░ рдирд╛рдо рд╕реЗ рдкреБрдХрд╛рд░рд╛ рдЬрд╛рддрд╛ рд╣реИред

 /* search_similar.mustache */ { "query": { "bool": { "should": [ {"bool": { "minimum_should_match": {{ minimumShouldMatch }}, "should": [ {{#ingredientsList}} // mustache         ingredientsList {{#ingredients}} //         ingredients {"nested": { "path": "ingredients", "score_mode": "max", "query": { "bool": { "must": [ {"term": {"ingredients.flavor_id": {{ id }} }}, {"range": {"ingredients.percent" : { "lte": {{ lte }}, "gte": {{ gte }} }}} ] } } }} {{^isLast}},{{/isLast}} //    {{/ingredients}} {{/ingredientsList}} ] }} ] } } } /*  */ { "template": "search_similar", "params": { "minimumShouldMatch": 1, "ingredientsList": { "ingredients": [ {"id": 1, "lte": 10, "gte": 5, "isLast": true } ] } } } 

рдирддреАрдЬрддрди, рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдореЗрдВ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд┐рд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдордиреЗ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдЕрд╡рдпрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдкрд╛рд░рд┐рдд рдХреАред рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ, рдЕрдиреБрд░реЛрдз, рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗ рдмрд╣реБрдд рднрд┐рдиреНрди рдирд╣реАрдВ рдерд╛:

 SELECT * FROM ingredients LEFT JOIN recipes ON recipes.id = ingredient.recipe_id WHERE ingredients.id in (1,2,3) AND ingredients.id not in (4,5,6) AND ingredients.percent BETWEEN 10.0 AND 20.0 

рд▓реЗрдХрд┐рди рдЙрд╕рдиреЗ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рдЖрдЧреЗ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдЖрдзрд╛рд░ рдерд╛ред

рдпрд╣рд╛рдВ, рдкреНрд░рддрд┐рд╢рдд рдЦреЛрдЬ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдХрдИ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА: рд╕рд╛рдордЧреНрд░реА, рд╕рдореВрд╣реЛрдВ рдФрд░ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЦреЛрдЬ; рдиреБрд╕реНрдЦрд╛ рдореЗрдВ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рд╕рд╣рдирд╢реАрд▓рддрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд╕рдВрдШрдЯрдХ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ; рдПрдХ рд╣реА рдХреНрд╡реЗрд░реА, рд▓реЗрдХрд┐рди рдЪрд╛рд░ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде (рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛), рд╕рд╛рде рд╣реА рдЕрдВрддрд┐рдо рдХреНрд╡реЗрд░реА рднреАред

рдЕрдиреБрд░реЛрдз рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдЪ рдЯреИрдЧ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдореВрд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдореНрдореЗрд▓рди рджреНрд╡рд╛рд░рд╛, рд╕реВрдЕрд░ рдХрд╛ рдорд╛рдВрд╕ рдФрд░ рдмреАрдл рдорд╛рдВрд╕ рд╣реИрдВ, рдФрд░ рдЪрд┐рдХрди рдФрд░ рдЯрд░реНрдХреА рдореБрд░реНрдЧреА рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЯреИрдЧ рдЕрдкрдиреЗ рд╕реНрддрд░ рдкрд░ рд╕реНрдерд┐рдд рд╣реИред рдЗрди рдЯреИрдЧреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдиреБрд╕реНрдЦрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╢рд░реНрдд рд╡рд┐рд╡рд░рдг рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЦреЛрдЬ рдЯреНрд░реА рдФрд░ / рдпрд╛ рд╡рд┐рд╡рд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╕рд╛рд▓реЗ, рдЬрд┐рдЧрд░ рдФрд░ рд╕реЛрдпрд╛, рдЪрд┐рдХрди рд╣рд▓рд╛рд▓ рдХреЗ рд╕рд╛рде рд╕реЙрд╕реЗрдЬ рдорд╛рдВрд╕ рдФрд░ рджреВрдзред рдПрдХ рдПрдХрд▓ рдиреБрд╕реНрдЦрд╛ рдореЗрдВ рдПрдХ рд╣реА рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдХрдИ рд╕рд╛рдордЧреНрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рдиреЗ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЯреИрдЧ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рднрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА - рдиреБрд╕реНрдЦрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрд▓рдЧреНрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд╕рдВрд░рдЪрдирд╛ рднреА рдмрджрд▓ рдЧрдИ рд╣реИ:

 { "ingredient_id": 1, "ingredient_name": "AAA", "manufacturer_id": 3, "manufacturer_name": "Manufacturer 3", "percent": 1, "level_1": 2, "level_2": 4, "level_3": 6, "level_4": 7, "level_5": 12 } 

рдиреБрд╕реНрдЦрд╛ рдХреА "рд╢реБрджреНрдзрддрд╛" рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдПрдХ рдЦреЛрдЬ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рднреА рдереАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдРрд╕реА рд░реЗрд╕рд┐рдкреА рдХреА рдЬрд╝рд░реВрд░рдд рдереА рдЬрд╣рд╛рдБ рдмреАрдл, рдирдордХ рдФрд░ рдХрд╛рд▓реА рдорд┐рд░реНрдЪ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рди рд╣реЛред рдлрд┐рд░ рд╣рдореЗрдВ рдРрд╕реЗ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХрд╛ рд╡рдЬрд╝рди рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬрд╣рд╛рдБ рдкрд╣рд▓реЗ рд╕реНрддрд░ рдкрд░ рдХреЗрд╡рд▓ рдЧреЛрдорд╛рдВрд╕ рдерд╛ рдФрд░ рджреВрд╕рд░реЗ рдкрд░ рдХреЗрд╡рд▓ рдорд╕рд╛рд▓реЗ рдереЗ (рдорд╕рд╛рд▓реЛрдВ рдХрд╛ рдкрд╣рд▓рд╛ рдЯреИрдЧ рд╢реВрдиреНрдп рдерд╛)ред рдпрд╣рд╛рдВ рдореБрдЭреЗ рдзреЛрдЦрд╛ рджреЗрдирд╛ рдкрдбрд╝рд╛: рдЪреВрдВрдХрд┐ рдореВрдВрдЫреЗрдВ рддрд░реНрдХ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЧрдгрдирд╛ рдХреА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ; рдпрд╣рд╛рдБ ES рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рднрд╛рдЧ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ - Plessред рдЗрд╕рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬрд╛рд╡рд╛ рдХреЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрд░реАрдм рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреЛрдИ рдХрдард┐рдирд╛рдИ рдирд╣реАрдВ рдереАред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ JSON рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдореВрдВрдЫ-рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдЧрдгрдирд╛ рдХреЗ рдХреБрдЫ рднрд╛рдЧ, рдЬреИрд╕реЗ рдЫрдБрдЯрд╛рдИ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ, рдХреЛ рдкреАрд╕рд▓ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

 "filter": [ {{#levelsList}} {{#levels}} {"script": { "script": " int total=0; for (ingredient in params._source.ingredients){ if ([0,{{tag}}].contains(ingredient.level_{{id}})) total+=1; } return (total==params._source.ingredients.length); " }} {{^isLast}},{{/isLast}} {{/levels}} {{/levelsList}} ] 

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╢рд░реАрд░ рдХреЛ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрд╕ рд╕рдордп рддрдХ, рд╣рдордиреЗ рд╕рдВрдШрдЯрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рдПрдХ рдЕрдбрд╝рдЪрди рдкрд╛рдИ - рд╣рдо рдЧреЛрдорд╛рдВрд╕ рд╕реЙрд╕реЗрдЬ рдкрд░ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдШрдЯрдХ рд╡рд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдордиреЗ рдЬреЛрдбрд╝рд╛ - рд╕рднреА рдПрдХ рд╣реА рджрд░реНрдж рд░рд╣рд┐рдд рд▓рд┐рдкрд┐рдпреЛрдВ рдкрд░ - рдЗрд╕ рд╢рд░реНрдд рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдХрд┐ рдпрд╣ рдШрдЯрдХ рд░рдЪрдирд╛ рдореЗрдВ рдкреНрд░рдмрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 "filter": [ {"script":{ "script": " double nest=0,rest=0; for (ingredient in params._source.ingredients){ if([{{#tags}}{{tagId}}{{^isLast}},{{/isLast}}{{/tags}}].contains(flavor.level_{{tags.0.levelId}})){ nest+= ingredient.percent; }else{ if (ingredient.percent>rest){rest = ingredient.percent} } } return(nest>=rest); " }} ] 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрд▓рд┐рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдореЗрдВ рдХрдИ рдЪреАрдЬреЛрдВ рдХрд╛ рдЕрднрд╛рд╡ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ "рдЙрдкрд▓рдмреНрдз рд╕рд╛рдзрдиреЛрдВ" рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ - рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реНрдг-рдкрд╛рда рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреАрдЬрд╝реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА: рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕рдореВрд╣реЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдкрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред рдкреНрд░рдЪрд▓рд┐рдд рдкреНрд░рд╢реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣рд╛рдБ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╕рд╛рдордиреЗ рдЖрдИ: 10,000 рд╡реНрдпрдВрдЬрдиреЛрдВ рдореЗрдВ рд╕реЗ, рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рдЧрднрдЧ 10 рд╕рдореВрд╣ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдереЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрди рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рд▓рдЧрднрдЧ 40,000 рд╡реНрдпрдВрдЬрди рдмрдиреЗ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рдереЗред рдлрд┐рд░ рд╣рдордиреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдУрд░ рдЦреБрджрд╛рдИ рд╢реБрд░реВ рдХреАред

рдкрд╣рд▓рд╛ рдЕрдиреБрд░реЛрдз рд╣рдореЗрдВ рдЙрди рд╕рднреА рд╕рдореВрд╣реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдЬреЛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ рдкрд╣рд▓реЗ рд╕реНрддрд░ рдкрд░ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдмрд╣реБ-рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрдиреНрди рд╣реБрдЖ: рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдЪрд▓рд┐рдд рдкреНрд░рддрд┐рд╢рдд рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрди рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдПрд▓рд┐рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рд╕рдмрд╕реЗ рдзреАрдореА рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рдХреЗ рдмрд░рд╛рдмрд░ рдерд╛ред рдереЛрдХ рдПрдХрддреНрд░реАрдХрд░рдг рдиреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджрд┐рдпрд╛ред рдПрд╕рдХреНрдпреВрдПрд▓ рдореЗрдВ рдЗрд╕реА рддрд░рд╣ рдХреЗ рддрд░реНрдХ (рдмрд╕ рдПрдХ рдХреНрд╡реЗрд░реА рдореЗрдВ рд╢рд░реНрдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдХреЗ) рдиреЗ рд▓рдЧрднрдЧ 15 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╕рдордп рд▓рд┐рдпрд╛ред

 /*   */ $params = config('elastic.params'); $params['body'] = config('elastic.top_list'); return (Elastic::getClient()->search($params))['aggregations']['tags']['buckets']; /*   */ 

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. рд╡рд░реНрддрдорд╛рди рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рд╡реНрдпрдВрдЬрди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ;
  2. рд░рдЪрдирд╛ рдореЗрдВ рд╣рдо рдХреМрди рд╕реА рдЕрдиреНрдп рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдХрднреА-рдХрднреА рд╣рдордиреЗ рдШрдЯрдХ рдЬреЛрдбрд╝рд╛ рдФрд░ рдПрдХ рдЦрд╛рд▓реА рдирдореВрдирд╛ рдорд┐рд▓рд╛);
  3. рдЪрдпрдирд┐рдд рдореЗрдВ рд╕реЗ рдХреМрди рд╕реА рд╕рд╛рдордЧреНрд░реА рд╣рдо рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдХреЗрд╡рд▓ рд▓реЛрдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдХрд╛рд░реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдордиреЗ рд░реЗрд╕рд┐рдкреА рд▓рд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдЕрдВрддрд┐рдо рдЕрдиреБрд░реЛрдз рдХреЗ рддрд░реНрдХ рдФрд░ рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рд╕рдВрдпреБрдХреНрдд рдХрд┐рдпрд╛:

 /*  */ "aggs" : { //      "tags" :{ //    "terms" :{ "field" : "ingredients.level_{{ level }}", "order" : {"_term" : "asc"}, "exclude" : [ {{#exclude}}{{ id }},{{/exclude}} 0] }, "aggs": { "reverse_nested": {} } //    ,    } } /*   */ foreach ($not_only as $element) { $parameters['body'][] = config('elastic.params'); $parameters['body'][] = self::getParamsBody( $body, collect($only->all())->push($element), $max_level, 0, 0 ); } /*   */ $parameters['body'][] = config('elastic.params'); $parameters['body'][] = self::getParamsBody( $body, $only, $max_level, $from, $size') ); /*     */ $parameters['max_concurrent_searches'] = 1 + $not_only->count(); return (Elastic::getClient()->msearchTemplate($parameters))['responses']; 

рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рдорд┐рд▓рд╛ рдЬреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╡реНрдпрдВрдЬрдиреЛрдВ рдФрд░ рдЙрдирдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ (рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ ["рд╣рд┐рдЯ"] ["рдХреБрд▓"] рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдкрд╛рддрд╛ рд╣реИред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдиреБрд░реЛрдз рд╕реВрдЪреА рдореЗрдВ рдЕрдВрддрд┐рдо рд╕реНрдерд╛рди рдкрд░ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╣рдореЗрдВ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрдИрдбреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рд╣реБрдИрдВред рдЙрди рд╕рднреА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ "рдЕрджреНрд╡рд┐рддреАрдп" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рдордиреЗ рдПрдХ рдХреНрд╡реЗрд░реА рдмрдирд╛рдИ, рдЬрд╣рд╛рдВ рд╣рдордиреЗ рдЗрд╕реЗ рддрджрдиреБрд╕рд╛рд░ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рдмрд╕ рдорд┐рд▓реЗ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рдирд╛ред рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рдерд╛, рддреЛ рдШрдЯрдХ рдХреЛ "рдПрдХрд▓" рдХреБрдВрдЬреА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЖрдк рдореЗрд░реЗ рдмрд┐рдирд╛ рдкреВрд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдорд┐рд▓рд╛ рдерд╛:

 { "from": {{ from }}, "size": {{ size }}, "query": { "bool": { "must": [ {{#ingredientTags}} {{#tagList}} {"bool": { "should": [ {"term": {"level_{{ levelId }}": {{ tagId }} }} ] }} {{^isLast}},{{/isLast}} {{/tagList}} {{/ingredientTags}} ], "filter": [ {"script":{ "script": " double nest=0,rest=0; for(ingredient in params._source. ingredients){ if([{{#tags}}{{tagId}}{{^isLast}},{{/isLast}}{{/tags}}].contains(ingredient.level_{{tags.0.levelId}})){ nest+= ingredient.percent; }else{ if (ingredient.percent>rest){ rest= ingredient.percent } } } return(nest>=rest); " }} {{#levelsList}}, {{#levels}} {"script": { "script": " int total=0; for(ingredient in params._source.ingredients){ if ([0,{{tag}}].contains(ingredient.level_{{id}})) total+=1; } return (total==params._source.ingredients.length); " }} {{^isLast}},{{/isLast}} {{/levels}} {{/levelsList}} ] } }, "aggs" : { "tags" :{ "terms" :{ "field" : "ingredients.level_{{ level }}", "order" : {"_term" : "asc"}, "exclude" : [ {{#exclude}}{{ id }},{{/exclude}} 0] }, "aggs": { "reverse_nested": {} } } }, "sort": [ {"_score": {"order": "desc"}} ] } 

рдмреЗрд╢рдХ, рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдФрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЗрд╕ рдвреЗрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреИрд╢ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдЙрдкрд▓рдмреНрдз рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕рдореВрд╣реЛрдВ рдХрд╛ рдкреГрд╖реНрда), рдЬреЛ рд╣рдореЗрдВ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкреНрд░рджрд░реНрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕ рдирд┐рд░реНрдгрдп рд╕реЗ рдореБрдЦреНрдп рдбреЗрдЯрд╛ рдХреЛ 50 рдПрдордПрд╕ рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо

рд╣рдордиреЗ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдкрд░ рдХрдо рд╕реЗ рдХрдо 50,000 рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЦреЛрдЬ рдХреА, рдЬреЛ рдЖрдкрдХреЛ рдЙрддреНрдкрд╛рджреЛрдВ рдореЗрдВ рдЕрд╡рдпрд╡реЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рдЕрд╡рдпрд╡реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрд╛рдж рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬрд▓реНрдж рд╣реА рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рд▓рдЧрднрдЧ рдЫрд╣ рдЧреБрдирд╛ рдмрдврд╝ рдЬрд╛рдПрдЧрд╛ (рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдЦреЛрдЬ рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдФрд░ рдПрд▓реАрд╕реНрдЯреИрдЪрд░реНрдЪ рд╕реЗ рдХрд╛рдлреА рдЦреБрд╢ рд╣реИрдВред

рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЗ рдкрд░, рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЦреБрдж рдкреНрд░рд╕рдиреНрди рд╣реИрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдФрд╕рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп 250-300 рдПрдордПрд╕ рд╣реИред

рдЗрд▓рд╛рд╕реНрдЯрд┐рд╕рд░реНрдЪ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рддреАрди рдорд╣реАрдиреЗ рдмрд╛рдж, рдпрд╣ рдЕрдм рдЗрддрдирд╛ рднреНрд░рдорд┐рдд рдФрд░ рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд┐рдВрдЧ рдХреЗ рдлрд╛рдпрджреЗ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ: рдпрджрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рдлрд┐рд░ рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд▓рдЧрднрдЧ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХреЗ рд╕рд╛рде рдореВрд▓ рдЕрдиреБрд░реЛрдз рд╕рд░реНрд╡рд░ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВред

"рд╕рднреА рдмреЗрд╣рддрд░реАрди рдФрд░ рдордЫрд▓реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!" (рд╕реА)

PS рдЕрдВрддрд┐рдо рд╕рдордп рдореЗрдВ рд╣рдореЗрдВ рд░реВрд╕реА рдкрд╛рддреНрд░реЛрдВ рдХреЗ рдирд╛рдо рдореЗрдВ рдЫрдВрдЯрд╛рдИ рдХреА рднреА рдЬрд░реВрд░рдд рдереАред рдФрд░ рдлрд┐рд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдПрд▓рд┐рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рд░реВрд╕реА рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд╕рд╢рд░реНрдд рд╕реЙрд╕реЗрдЬ "рдЕрд▓реНрдЯреНрд░рд╛ рдореЗрдЧрд╛ рдкреЛрд░реНрдХ 9000 рдХреИрд▓реЛрд░реА" рдЫрдБрдЯрд╛рдИ рдХреЗ рдЕрдВрджрд░ рдмрд╕ "9000" рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рдФрд░ рд╕реВрдЪреА рдХреЗ рдЕрдВрдд рдореЗрдВ рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ u042B рдкреНрд░рдкрддреНрд░ рдХреЗ рдпреВрдирд┐рдХреЛрдб рд╕рдВрдХреЗрддрди рдХреЗ рд▓рд┐рдП рд░реВрд╕реА рдкрд╛рддреНрд░реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi413075/


All Articles