ElastikSearch-da mürəkkəb relyativ məlumatların necə saxlanıldığını qısaca təsvir edin

Adi bazada məlumat əlaqələrinin təsviri üçdən, birdən-birə, birdən çoxa və çoxdan çoxuna olan münasibətlərdən başqa bir şey deyildir. Məlumat əlaqələr ilə əlaqəli olduqda, cədvəl yaratarkən ümumiyyətlə əsas xarici açarı əlavə edirik. Məlumat əlaqələrini yaradın, sorğu və ya statistikadakı bağlantılar vasitəsilə məlumatları bərpa edin və ya onları tamamlayın. Sonra tələb olunan nəticə məlumatlarını əldə edin və ElastikSearch-da bu əlaqəli məlumatlarla necə və ya necə məşğul olmağınıza çevirin.

Hamımız bilirik ki, ElasticSearch, əlaqəni emalını zəiflədən NoSQL verilənlər bazasıdır, çünki lucene, es və solr kimi tam mətnli axtarış çərçivələri daha yüksək performans tələblərinə malikdir. Birləşmə əməliyyatı edildikdən sonra performans çox zəifdir. Axtarış çərçivəsini istifadə edərkən artıq axtarış sistemini relyativ verilənlər bazası kimi istifadə etməməlisiniz.

Əlbətdə, həqiqi tarixlər mütləq əlaqəlidir. Bəs bu əlaqəli məlumatlarla necə münasibət qurursunuz və onu necə idarə edirsiniz?

Hər kəs bilir ki, standart JSON məlumat quruluşu nə qədər mürəkkəb olursa olsun, neçə səviyyəyə yuva qoyulmağından asılı olmayaraq ES-də saxlanıla bilər və sonra sorğulanıb təhlil edilərək alınar. Bu mexanizm münasibətləri idarə etmək və idarə etmək üçün üç əsas metoda malikdir:

Əvvəlcə çoxsaylı quruluşun JSON məlumatlarını avtomatik olaraq saxlamaq üçün sahə tipləri objcet və array [object] istifadə edin.

Bu standart bir mexanizmdir, yəni xəritəni təyin etməmişik, mürəkkəb JSON məlumatlarını birbaşa ES serverinə daxil etmişik, uğurla daxil edə və axtarış apara bilər (bu, standart olaraq dinamik bir xəritə olduğu üçün mümkündür) Standart JSON quruluşu avtomatik olaraq çevrildiyi müddətdə, əlbəttə ki, xəritəçəkmə növünə də nəzarət edə bilərik. Dinamik xəritəçəkmə və statik xəritəçəkmə daxilində statik xəritəçəkmə də sərt tipə, zəif tipə, ümumi tipə bölünür və artıq genişləndirilmir.Maraqlanan tərəflər rəsmi saytdan aşağıdakı məlumatlardan biri kimi tapa bilərsiniz:

{"name": "Zach", "Auto": [{"etmək": "Saturn", model: SL}, {"etmək": "Subaru", "model": "Imprezza"}]}

Yaranan yaddaş quruluşu aşağıdakı kimidir.

{"name": "Zach", "car.make": ["Saturn", "Subaru"] "car.model": ["SL", "Imprezza"]}

Əsas Lucene çox dəyərli saxlama üçün təbii bir dəstək olduğundan, bunun üstündəki bir sıra quruluşa bənzəyir. Əslində, bu sahədə çox dəyərli bir sahə olaraq saxlanılır.

Axtarış zamanı simvol uyğun məzmunu axtara bilər. Belə bir məlumat elementi həqiqətən məlumatları və əlaqələri ehtiva edir. Bir-çox əlaqəyə bənzəyir. Bir şəxs bir neçə maşına sahibdir. Əslində, sərt bir əlaqə deyil, çünki alt Lucene təbəqəsi düzdür, buna görə də çox avtomobildən olan məlumatlar qarışıqdır. Yalnız bu şəxsdən maşın ala bilməzsiniz. Verilənlər, bütün məlumatlar bütöv olduğundan, hansı əməliyyatdan asılı olmayaraq bütün məlumatlar qaytarılır.

İkincisi, çox səviyyəli əlaqələri olan məlumatları saxlamaq üçün iç içə tip [obyekt] istifadə edin

Ssenari 1-də qeyd etdik ki, serialda saxlanılan serial obyektləri bir-biri ilə sıx bağlı deyildir, çünki ikinci səviyyəli məlumatlar ayrılmır. Ayrılmaq istəsəniz, məlumat quruluşunu dəqiq müəyyənləşdirmək üçün iç içə tipdən istifadə etməlisiniz. Bu ikinci növbədəki çox avtomobil məlumatlarının bir-birindən müstəqil olmasının yeganə yoldur, yəni müəyyən bir avtomobilin məlumatlarını ayrıca almaq və ya soruşmaq olar.

Eyni JSON məlumatları:

{"name": "Zach", "Auto": [{"etmək": "Saturn", model: SL}, {"etmək": "Subaru", "model": "Imprezza"}]}

Ssenari 1-də son olanlar ikinci növ məlumat elementini saxlayır. Avtomobil növü iç içə elan olunarsa, sonda qeyd olunan say 3-ü göstərir. 3-ü necə gələcəyini izah edin = 1 kök sənəd + 2 avtomobil sənədləri, içəriyə qoyulmuş bəyannamə növü, hər bir nümunə yeni bir sənəddir, ona görə soruşulduqda müstəqil olaraq soruşula bilər və performans pis deyil, çünki alt səhifədə eyni məlumatlar var . İşin mənfi tərəfi odur ki, yeniləmə xərcləri nisbətən yüksəkdir. Hər dəfə alt sənəd yeniləndikdə bütün quruluşun indeksi yenidən yaradılmalıdır. Buna görə iç-içə, tez-tez yenilənməyən, iç-içə qurulmuş çox səviyyəli münasibətləri olan ssenarilər üçün uyğundur.

Daxil edilmiş tipli məlumatlar effektiv olmaq üçün göstərilən sorğu və toplama üsulları ilə istifadə edilməlidir. Normal sorgular yalnız səviyyə 1 və ya kök səviyyə atributlarını tələb edə bilər. Daxil edilmiş atributlar yoxlanıla bilməz. Bunu yoxlamaq istəyirsinizsə, daxil edilmiş sorğu və ya toplama dəstini istifadə etməlisiniz.

Daxil edilmiş tətbiqetmələrin iki rejimi var:

  • Daxil edilmiş sorğu Hər bir sorğu, bir növ sənəd daxilində etibarlıdır
  • İçindəki yığma və ya süzgəc Eyni səviyyədə olan bütün sənədlər filtr çeşidlənməsi də daxil olmaqla qlobal miqyasda etibarlıdır

Üçüncüsü, valideyn / uşaq münasibətləri

Valideyn / uşaq nümunəsi iç içə naxışa çox oxşardır, lakin tətbiq fokusları fərqlidir.

Valideynlər / uşaqlar dərnəkləri idarə etmək üçün istifadə edildikdə, hər şardın yaddaşında bir əlaqə masası saxlayır. Alınarkən əlaqəli məlumatlar has_parent və has_child filtrləri ilə alınır. Ana sənəd və alt sənədlər bu rejimdə istifadə olunur. Asılı olmayaraq, sorğu performansı iç içə rejimdə olduğundan biraz daha azdır, çünki ana sənəd və alt sənəd eyni şardaya yapışdırıldıqda marşrut üzərində yayılmışdır, lakin eyni Lucene parametrləri indeksində olacağına heç bir zəmanət yoxdur. zəng performansı bir qədər aşağı. Ayrıca hər dəfə məlumat əldə etməyinizi saxlama əlaqələri cədvəlindən əldə etməlisiniz. Həm də vaxt lazımdır. Daxil edilmiş sənədlərin üstünlüyü ana sənədin və ya alt sənədin yenilənməsidir. Digər sənədlər təsirlənmir. Buna görə ümumi çox səviyyəli münasibətləri yeniləmək üçün valideyn / uşaq rejimindən istifadə etmək yaxşıdır.

Ana sənədin təyinat növü:

{"Birliklər": {"Şəxs": {"Ad": {"tip": "string"}}}}

Filial sənədinin tapşırıq növü:

{"Evlər": {"_parent": {"Növ": "Şəxs"}, "Vəziyyəti": {"tip": "string"}}}

Məlumat daxil edərkən əvvəlcə ana sənədi daxil etməlisiniz:

curl -XPUT localhost: 9200 / test / şəxs / zach / -d '{"name": "Zach"}

Sonra bir alt sənəd daxil edərkən, bir istiqamətləndirmə sahəsi əlavə etməlisiniz:

$ curl -XPOST localhost: 9200 / evlər? valideyn = zach -d '{"dövlət": "Ohio"} $ curl -XPOST localhost: 9200 / test / evlər? valideyn = zach -d '{"Dövlət": "Cənubi Karolina"}

Ümumiləşdirmək üçün:

Birinci üsul:

  1. Sadə, sürətli və güclü
  2. Tək-tək bir münasibət saxlamaqda yaxşıdır
  3. Xüsusi tələb tələb olunmur

Metod ikinci:

  1. Aşağıdakı təbəqə eyni Lucene bölgəsində saxlanıldığı üçün oxu və sorğu performansının müqayisə üsulu daha sürətli olur.
  2. Tək bir sənəd sənədinin yenilənməsi bütün məlumat quruluşunu yenidən yaradır ki, tez-tez içəri girən səhnələri yeniləmək üçün uyğun deyildir.
  3. birdən çoxa və birdən birə çoxdan çox əlaqə saxlaya bilər

Üçüncü metod:

  1. Birdən çox əlaqəli məlumatlar varsa, yaddaş tamamilə müstəqildir, lakin eyni tərzdədir, buna görə oxunan və sorğulanan performans ikinci üsula nisbətən bir qədər aşağıdır.
  2. Əlavə yaddaşa ehtiyacınız varsa, inzibati əlaqələrin siyahısını tutun
  3. Sənədin yenilənməsi digər alt sənədlərə təsir göstərmir, buna görə tez-tez istifadə olunan səhnələr yenilənə bilər.
  4. Çeşidləmə və qiymətləndirmə prosesləri çətindir və əlavə skript funksiyası dəstəyini tələb edir

Hər bir metodun öz uyğun tətbiqi ssenarisi var. Təcrübədə, faktiki iş ssenarisinə uyğun olaraq müvafiq saxlama metodunu seçməliyik