Intr-o baza de date relationala, un tabel copil face referire la parintele cu o cheie straina si aceasta relatie se numeste Join . Proiectarea implica de obicei normalizarea datelor.
ElasticSearch nu este o baza de date relationala, este vorba despre eficienta cautarii si nu despre eficienta stocarii. Datele stocate sunt denormalizate si sunt destul de plate. Ceea ce inseamna asta este ca imbinarile nu pot fi intre indexuri , ElasticSearch se refera la viteza, iar imbinarile traditionale ar functiona prea lent. Deci, atat documentele copilului, cat si documentele parinte trebuie sa se afle pe acelasi index si in acelasi fragment .
Array
Sa luam in considerare arborele genealogic de mai jos prezentat in imaginea 1. Arborele are 3 parinti si 9 copii. Fiecare personaj are un „ gen” si un statut „isAlive” .
Cu exemplul de mai sus, exploram scenariile de mai jos:
- Relatiile dintre parinti si copii
- Avand mai multi copii pe parinte
- Niveluri multiple de relatii dintre parinti si copii
Crearea indexului „Family_Tree”
Codul de mai jos ajuta la crearea unui index pentru relatia de mai sus. (Ghid de configurare pentru Cautare Elastica). Incepand cu ElasticSearch 7, un „ tip ” nu mai este necesar pentru indexuri, spre deosebire de versiunile anterioare.
Array
createIndex.sh – Creati indexul family_tree
Linia 23 : relatia_tip, este un nume pentru asociere ..
Linia 24 : Unirea de tip este un camp special care creeaza relatia parinte / copil in cadrul documentelor cu acelasi index.
Linia 25 : Parintele-copil foloseste Ordinalii Globali pentru a accelera imbinarile.
Linia 26-28 : Sectiunea relatii defineste un set de relatii posibile in cadrul documentelor, fiecare relatie fiind un nume parinte si un nume copil.
Array
Inserarea datelor parinte
Sa parcurgem codul pentru insertia unui parinte inainte de a rula un script pentru a insera ceilalti parinti descrisi in imaginea 1.
Creeaza-l pe Darren Ford
Codul de mai sus creeaza un nou document pentru Darren Ford si il marcheaza ca document parinte folosind campul relatie_tip. Numelui relatiei i se atribuie o valoare „ parinte ”. Impreuna cu relatiile, adauga si campuri necesare, cum ar fi „ prenume ”, „ prenume ”, „ sex ” si „ isAlive ”.
Un lucru cheie de observat aici este parametrul de interogare de rutare . Fiecare parinte atribuie propriul nume parametrului.
- lingerie porno ffcl.privatetutornetwork.com
- porno perf www.psychologicalscience.net
- douche porno www.desertclassic.com
- porno suedois etnaland.com
- porno drole www.kiriko.com
- your porno sexy secular.argose.com
- harry potter porno www.smallfoundation.org
- minecraft porno www.solutionpartners.biz
- photo mature porno www.oberweissfunds.biz
- porno culotte technologies.bigmedia.com
- porno hut www.heifermorocco.org
- porno femme noir www.e-hartford.biz
- twerk porno www.hotelsiesta.com
- absolute porno www.fittstimmet.com
- porno mature français buzzairlines.net
- femme de menage porno www.interactingwithcomputers.com
- jeune porno silverleafclub.biz
- webchoc porno www.mahaloliquor.com
- mapouka porno www.937starhd.com
- porno argent www.utdpatientinformation.com
- porno sado www.e-presidents-choice.com
- porno 80 www.filmfestdcmedia.org
Campul de rutare ne ajuta sa controlam pe ce bucata va fi indexat documentul. Fragmentul este identificat folosind ecuatia de mai jos:
shard = hash (routing_value)% number_of_primary_shards
Putem insera parintii ramasi folosind scriptul aici .
Introducerea datelor copiilor
In mod similar, sa trecem printr-o insertie pentru copii inainte de a rula o insertie in bloc a celor 9 copii descrisi in imaginea 1.
Creeaza Pearl Ford
In exemplul nostru „Pearl Ford” este un copil al „Darren Ford”, observati ca folosim acelasi parametru de interogare de rutare pe care l-am folosit pentru a crea o inregistrare pentru Darren. Acest lucru se datoreaza restrictiei in care atat documentele copilului, cat si documentele parinte trebuie sa fie pe acelasi fragment.
Unirea dintre aceasta inregistrare si cea a lui Darren se face prin campul relatie_tip, unde adaugam numele relatiei ca „ copil ” facand din Pearl Ford un copil al parintelui al carui ID este „1” (acelasi ID pe care l-am creat parintele Darren cu).
Putem insera copiii ramasi folosind scriptul aici .
Interogarea datelor noastre
Acum partea distractiva a executarii si intelegerii, interogarile pe care le putem rula in legatura cu relatia pe care tocmai am creat-o.
Cautarea si filtrarea anumitor parinti
- Obtineti toti copiii Sienna Evans : interogarea parent_id poate fi utilizata pentru a gasi documente copil care apartin unui anumit parinte.
Obtineti toti copiii lui Sienna Evans
Executarea interogarii de mai sus obtine documentul „Ralph Evans”.
{
“took”: 2,
…
“hits”: [
{
“_index”: “family_tree”,
“_type”: “_doc”,
“_id”: “9”,
“_routing”: “Sienna”,
“_source “: {
” name “:” Ralph “,
” house “:” Evans “,
” gender “:” Male “,
” isAlive “: true,
” relation_type “: {
” name “:” child “,
” parent “: „2”
}
}
}
]
…
}
- Obtineti toti copiii lui Darren Ford care sunt in viata : cuvintele cheie de interogare bool si must, pot fi folosite pentru a prelua inregistrarile.
Obtineti toti copiii lui Darren Ford care sunt in viata
Executarea interogarii de mai sus va obtine inregistrarile pentru „Pearl”, „Ava”, „Tyler” si „Xavier” Ford.
Are intrebari despre copil si are parinte
Cuvintele cheie de interogare has_child si has_parent , ajuta la interogarea datelor cu relatiile parinte-copil.
- Obtineti Toti parintii care au fiice moarte : cuvantul cheie has_child ne ajuta sa aducem toate inregistrarile parintilor, unde copiii au filtre.
Obtineti toti parintii care au fiice moarte
Executand interogarea de mai sus, obtine evidenta „Ryan Turner”, care este singurul parinte cu o fiica moarta „Scarlet Turner”.
- Obtineti toti copiii care sunt parinti care au genul ca „Femeie” : cuvantul cheie has_parent ne ajuta sa preluam toate inregistrarile copilului, unde parintii au filtre.
Obtineti toti copiii care sunt parinti cu genul „Feminin”
Executand interogarea de mai sus, obtine evidenta „Ralph Evans”, care este parintele „Sienna Evans”, toti ceilalti parinti fiind barbati.
Sa adaugam „Melissa Ford” ca sotie la „Darren Ford”, care este descris in imaginea de mai jos 2. „Darren” are acum documente despre copii si sotie atasate.
Indexul poate fi modificat folosind codul de mai jos:
Modificati indexul adaugand un nou copil la Parinte – Sotie.
Linia 9 : Acum avem o serie de relatii asociate cu parintele care sunt „copil” si „sotie”.
Inserarea unui document „Melissa Ford”, este similar cu inregistrarea copil pe care am creat-o mai devreme, aceasta va folosi acelasi parametru de rutare pe care l-am folosit la rutare parinte = Darren si se va folosi „sotia” ca nume relatie_tip.
Crearea Melissa Ford Record
Interogati datele sotiei:
- Obtineti parintii care au o sotie : interogarea foloseste cuvantul cheie has_child si filtreaza dupa tipul de „sotie”
Obtineti parintii care au o sotie
Executand interogarea de mai sus, obtine inregistrarea „Darren Ford”.
Sa adaugam GrandChildren in arborele genealogic asa cum este descris in imaginea 3 de mai jos.
Indexul trebuie sa fie recreat aici! acest lucru se datoreaza unei alte restrictii, in care este posibil sa adaugati un copil la un element existent numai daca elementul este deja parinte. Deoarece tipul „copil” nu era parinte cand am creat indexul mai devreme, trebuie sa renuntam la indexul anterior, sa cream unul nou cu codul de mai jos si sa reintroducem toate datele.
Recreati indexul
Randul 16 : „Copilul” este facut aici si parinte de tipul „nepotului”. Acest lucru ne permite sa avem relatia PARINTE → COPIL → BUNI.
Inserarea documentelor Grand Children este foarte asemanatoare cu inserarea inregistrarilor copilului.
Introduceti copilul mare
In exemplul nostru „Douglas Ford” este un copil al „Pearl Ford” si un nepot al „Darren Ford”, observati ca folosim acelasi parametru de interogare de rutare pe care l-am folosit pentru a crea o inregistrare pentru Darren. Acest lucru se asigura ca toti copiii asociati cu super-parintele „Darren” sunt indexati pe acelasi ciob.
Unirea dintre aceasta inregistrare si „Pearl Ford” se face prin campul relatie_tip, unde adaugam numele relatiei ca „ nepot ” facand din „Douglas Ford” un nepot al parintelui al carui cod este „5” (acelasi cod am creat Pearl Ford cu).
Putem insera copiii buni ramasi folosind scriptul in bloc aici .
Interogarea datelor GrandParent
- Obtineti toti bunicii care au nepoate :
Executand aceasta interogare, ne obtine recordul „Ryan Turner”, deoarece este singurul bunic cu o nepoata „Eleanor Turner”, asa cum este descris in imaginea 3.
Nu este recomandata utilizarea mai multor niveluri de relatii pentru a reproduce un model relational. Fiecare nivel de relatie adauga o cheltuiala la momentul interogarii in ceea ce priveste memoria si calculul. Ar trebui sa va deznormalizati datele daca va pasa de performanta. – elastic.co
Acum ca am vazut functia de alaturare in actiune, sa trecem peste restrictiile observate mai sus.
- Documentele parinte si copil trebuie sa fie indexate pe acelasi fragment.
- Este permisa o singura cartografiere a campului de unire pentru fiecare index.
- Un element poate avea mai multi copii, dar numai un parinte.
- Este posibil sa adaugati o noua relatie la un camp de unire existent.
- De asemenea, este posibil sa adaugati un copil la un element existent, dar numai daca elementul este deja parinte.
Alaturarile parinte-copil pot fi o tehnica utila pentru gestionarea relatiilor atunci cand performanta index-timp este mai importanta decat performanta timpului de cautare, dar are un cost semnificativ. Trebuie sa fiti constienti de compromisurile, cum ar fi constrangerea fizica de stocare a documentului parinte si copil si complexitatea adaugata. O alta masura de precautie este de a evita relatia parinte-copil cu mai multe straturi, deoarece aceasta va consuma mai multa memorie si calcul.








