Elastics uurige dokumendi väärtuste ja väljaandmete põhjalikku mõistmist

Elasticsearch Depth Understanding Doc Values



DocValues

Mis on DocValues

Selgitage lühidalt, et DocValues ​​on mingi veeruline andmete salvestamise struktuur (docid, termvalues).
Pööratud indeksi eeliseks on teatud elementi sisaldavate dokumentide leidmine, see tähendab vastava docidi leidmine Termi kaudu.

  • Välja inversioon
Väli Dok_1 Dokum_2 Doc_3
pruun X X
koer X
  • Väli2 tagurpidi
2. väli Dok_1 Dokum_2 Doc_3
pruun2 X X
koer2 X

Sellega saab kiiresti leida dokumendid doc1 ja doc2 sisaldavad pruunid dokumendid.



Kuid see ei ole efektiivne vastupidises toimingus teisest suunast, st leida dokumendi määratud välja (Field2) väärtus vastavalt docid-le. Kuid seda tüüpi pääsurežiimi on vaja liitmise, sortimise ja üksikasjaliku päringu jaoks.
deklareerib, et indeksi ületamine pole soovitav. See on aeglane ja seda on raske skaleerida: terminite ja dokumentide arvu suurenemisega suureneb ka täitmisaeg. Ülaltoodud probleemi lahendamiseks kasutame selle probleemi lahendamiseks Doc-väärtusi, võttes nende kahe vahelise suhte üle.
(Pange tähele, et string doc_value ei saa olla tekstitüüp, vaid ainult märksõna)



  • Väljadokumentide väärtused
Dok Väli
Dok_1 pruun
Dokum_2 pruun
Doc_3 koer
  • Välja 2 väärtused
Dok 2. väli
Dok_1 pruun2
Dokum_2 pruun2
Doc_3 koer2

näiteks:



valige Field2, loendage (1) tabelist, kus Field = grupib välja Field2

Ülaltoodud sql-ga sarnase koondpäringu täitmiseks tehke järgmist.

  1. Andmete vahemiku asetamine. Leidke docid (doc1, doc2) väljal = ‘pruun’ ja kasutage ümberpööratud indeksit
  2. Tehke koondarvutused. Vastavalt doc1 ja doc2 on väljale 2 asuvad väljad pruunid2 ja arvutustulemus saadakse liitmise teel. browm2 arv (1) = 2.

Otsing ja liitmine on omavahel tihedalt seotud. Otsing kasutab dokumentide leidmiseks pööratud indeksit, liitmisoperatsioon kogub ja koondab andmeid doc-väärtustes.



Kuidas DocValues ​​töötab

DocValues'i ametlik dokumenditutvustus on kiire, tõhus ja mälusõbralik.

  • 1. DocValues ​​genereeritakse indekseerimisel samaaegselt ümberpööratud indeksiga ja need on muutumatud. Sama mis tagurpidi reas, salvestatud lutseenifaili (jadatud kettale).
    Lucene-faili toimingud tuginevad JVM-i virnas olevate elanike andmete asemel haldamiseks operatsioonisüsteemi vahemälule. See funktsioon määrab, et es-de kasutamisel tuleks failide töötlemise jõudluse tagamiseks eraldada osadele piisavalt mälu. Üksikasjalikud seaded leiate aadressilt Tootekeskkonnas elasticsearchi seadistamise soovitused

  • 2. DocValues ​​kasutab veerulist tihendamist
    Kaasaegsete protsessorite töötlemiskiirus on suurusjärkude võrra kiirem kui ketastel, mis tähendab, et kettadelt loetavate andmete hulga vähendamine on alati kasulik, ehkki dekompressiooniks on vaja täiendavaid protsessori toiminguid.

DocValues ​​kasutab palju tihendusmeetodeid. See tuvastab järjestikku järgmised tihendusrežiimid:

  • Kui kõik väärtused on erinevad (või puuduvad), määrake lipp ja registreerige need väärtused
  • Kui need väärtused on väiksemad kui 256, kasutatakse lihtsat kodeerimistabelit
  • Kui need väärtused on suuremad kui 256, kontrollige, kas on olemas suurim ühine jagaja
  • Kui suurimat ühisjagurit pole, arvutage kodeerimise nihe ühtlaselt, alustades väikseimast väärtusest
    Need tihendusrežiimid ei ole traditsioonilised üldised tihendusmeetodid, näiteks DEFLATE või LZ4. Kuna sammasmälu struktuur on rangelt ja täpselt määratletud, saame erirežiimi abil saavutada suurema tihendusefekti kui üldised tihendusalgoritmid (näiteks LZ4).

, Märgitüüp kodeeritakse sarnaselt järjestustabeli abil. Märgitüüp salvestatakse järjestustabelisse pärast deduplikatsiooni, määrates ID ja seejärel kasutatakse neid ID-sid sama, mis numbritüübi dokumendi väärtus. Teisisõnu, tähemärkide tüüpidel on samad tihendusomadused kui numbril.
Jaotustabelis endas on ka palju tihendusmeetodeid, nagu fikseeritud pikkus, muutuva pikkusega või eesliidete märkide kodeerimine.

  • 3. DocValues ​​toetab keelamist
    See väärtus on vaikimisi aktiveeritud. Kui see pole vajalik, saate selle keelamiseks määrata doc_values: false.

DocValues ​​ei toeta

Eespool toodud sissejuhatuse kohaselt Dokumendi väärtused ei toeta analüüsitud stringivälju Jah, kujutage ette, et kui analüüsitakse välja, näiteks esimest, siis dokumendiväärtused salvestatakse analüüsi faasis kahe (ja esimese) väärtusena ning saate

Väli loendama
1
kõigepealt 1

Selle asemel

Väli loendama
esimene 1

Kuidas soovite saavutada soovitud tulemusi? väljaandmed.

Väljaandmed

doc-väärtused ei genereeri analüüsitud stringe. Neid välju saab siiski koondada, kuna kasutatakse väljaandmete andmestruktuuri. Erinevalt doc-väärtustest on väljaandmed ehitatud ja hallatud 100% mälus ning asuvad JVM-i mäluhunnikus. fielddata on kõigi väljade vaikeseade.

Pöörake tähelepanu mälukasutusele
Mõned funktsioonid:

    1. fielddata on laisalt laaditud. Kui te pole kunagi analüüsistringi liitnud, ei laadita väliandmeid mällu, need koostatakse päringu ajal.
    1. Väljaandmed laaditakse väljade põhjal ja ainult nende aktiivne kasutamine suurendab väljaandmete koormust.
    1. fielddata laadib kõik indeksis olevad dokumendid (selle konkreetse välja jaoks), olenemata sellest, kas päring on tabatud või mitte. Loogika on järgmine: kui päring pääseb juurde dokumentidele X, Y ja Z, pääseb tõenäoliselt järgmises päringus teistele dokumentidele juurde.
    1. Kui ruumi pole piisavalt, kasutage väliandmete eemaldamiseks LRU algoritmi.

Seetõttu tuleks väljaandmeid JVM-is mõistlikult kasutada, vastasel juhul mõjutab see es jõudlust.
saame kasutada indices.fielddata.cache.size piirangut fielddata Mälukasutus, võib olla kindla suurusega (näiteks 2G), see võib olla ka hõivatud mälu protsent (näiteks 20%).
Jälgimiseks võite kasutada ka järgmisi käske.

GET /_stats/fielddata

Ja mis juhtub siis, kui ühekordne koormusväli ületab otseselt mälu väärtust? Katkestada? Seetõttu kasutab es selle olukorra vältimiseks kaitselülitit (kaitsmemehhanismi).
See hindab päringu jaoks vajalikku mälu sisekontrollide abil (tüüp, kardinaalsus, suurus jne). Seejärel kontrollib see, kas väljaandmiseks taotletud väljaandmed põhjustavad väljaandmete koguarvu hunniku konfigureeritud osa ületamist. Kui hinnanguline päringu suurus ületab piiri, käivitatakse kaitselüliti, päring katkestatakse ja tagastatakse erand.

indices.breaker.fielddata.limit fielddata level limit, the default is 60% of the heap indices.breaker.request.limit request level request limit, the default is 40% of the heap indices.breaker.total.limit guarantees the limit combined with the above two, the default heap is 70%

Väljaandmete filtreerimine

Mälu säästmiseks seadistades saate laadida ainult osa väljaandmetest.

“frequency”: { “min”: 0.01, “min_segment_size”: 500 }

Laadige ainult üksusi, mis ilmuvad vähemalt 1% sellest dokumendist.
Eirake paragrahve, mille dokumendid on alla 500.
Lisateavet leiate ametlikust veebisaidilt.

Väljaandmete eellaadimine

Väljaandmete laadimine on vaikimisi laisk laadimine. Kui Elasticsearch päringut esimest korda väljaga täidab, laadib see pööratud indeksid selle väli kõigis segmentides täielikult mällu, et tulevased päringud saaksid parema jõudluse.
Väikeste indekssegmentide puhul võib selle protsessi jaoks vajalikku aega eirata. Kuid kui indeks on paar GB, võib see protsess võtta mitu sekundit. Kasutajate jaoks, kes on harjunud sekundi all reageerimisega, on raske leppida mitme sekundilise pausiga.
Selle viivituse tipu lahendamiseks on kolm võimalust:

1. Eeltäidke väljaandmed, seadistage need eelnevalt laadima.
2. Laadige globaalne seerianumber uuesti sisse. Laadimise optimeerimise meetod mälukasutuse vähendamiseks, sarnane globaalse sõnaraamatuga (salvestage stringiväljad ja neile vastavad globaalselt ainulaadsed int-väärtused), nii et laaditakse ainult int-väärtused ja seejärel otsitakse sõnastiku vastavaid stringivälju.
3. Vahemälu soojendamine. On iganenud.

Kokkuvõtteks

Võrreldes DocValues FieldData
Loomise aeg Indeks luuakse kooskõlas ümberpööratud indeksi loomise ajastusega Looge otsimisel õigeaegselt, laisk laadimine
Loo asukoht Ketas. Sama mis tagurpidi reas, salvestatud lutseenifaili (jadatud kettale).
Lucene-failitoimingud põhinevad haldamisel operatsioonisüsteemi vahemälul JVM Hunnik
eelis Ei hõivata kuhja mälu Ei võta täiendavaid kettaressursse
Puudus Aeglustage indeksi kiirust, hõivake täiendavaid kettaressursse Kui dokumente on liiga palju, võtab kohene loomine liiga palju aega ja võtab liiga palju kuhja
Toetusandmete tüüp Tutvuge analüüsimata väljadega Analüüsitava välja string (sõnade segmentimine)