Space Vatican

kun indeksoi dataa, maailma on harvoin yhtä yksinkertainen kuin jokainen dokumentti, joka on olemassa erikseen. Joskus on parempi denormalisoida kaikki tiedot lapsiasiakirjoiksi. Esimerkiksi jos mallintaisit kirjoja, tekijäkentän lisääminen kirjoihin voisi olla järkevä valinta (vaikka tietokannassa, joka on sinun arvovaltainen aineistolähteesi, tiedot on jaettu erillisiin authors ja books taulukkoon). Se on yksinkertainen ja voit helposti rakentaa kyselyitä sekä ominaisuuksia kirjan ja tekijän nimi.

se ei ole aina käytännöllistä – vanhemman dokumentissa saattaa olla liikaa tietoa, jotta se voitaisiin toistaa jokaisessa lapsiasiakirjassa. Jos sinulla oli tyypillinen blogi / kommentti app niin et halua toistaa koko sisältöä blogikirjoituksen jokaisessa kommentti, koska tämä merkittävästi lisätä määrää indeksoitujen tietojen useita. Silti ilman, että et voi helposti kirjoittaa kyselyitä löytää kommentteja viestit vastaavat tiettyjä kriteerejä (muu kuin tekemällä 2 vaihe prosessi ensin löytää vastaavat viestit ja sitten hakemalla kommentteja tietyn post_id, joka on usein kömpelö tai hidas (tai molemmat)).

toinen vaihtoehto on sijoittaa lapsiasiakirjat vanhemman dokumentin sisään, esimerkiksi lomakkeella voi olla dokumentteja

123456789101112
{ "name": "A. N Author", "biography": "A leading wordsmith", "books": }

yksi haittapuoli tässä on se, että lapsen lisääminen vaatii koko asiakirjan uudelleen tutkimista. Tietynlaisia kirjoja kirjoittaneiden kirjailijoiden löytäminen on helppoa, mutta Penguin-kustantamon julkaiseman tieteiskirjan tekijöiden löytäminen on vaikeampaa.

jos hakemistomme sisältää

, niin ilmeisin kysely

löytää molemmat kirjoittajat-et voi ilmaista, että published: n ja genre: n ehtojesi on vastattava samaa kirjaa.

ElasticSearch tarjoaa kaksi asiaa, jotka auttavat tässä. Ensimmäinen on sisäkkäisen asiakirjan/kyselyn käsite. Näin voit sanoa, että etsit kirjailijoita, joissa vähintään yksi kirja täyttää molemmat kriteerit.

ensin täytyy määrittää kartoitus, joka kertoo, että books-kenttä tullaan pesimään:

123456789
curl -XPOST localhost:9200/authors/nested_author/_mapping -d '{ "nested_author":{ "properties":{ "books": { "type": "nested" } } }}'

jos lisäämme tämän jälkeen samat tiedot kuin aiemmin tähän uuteen indeksiin, tämä kysely

tässä kohdassa nested suodin sallii sinun suorittaa kyselyn sisäkkäisiä asiakirjoja (ts.kirjoja) vastaan ja suodattaa kirjoittajat niiden mukaan, joilla on vähintään yksi kyselyyn vastaava sisäkkäinen asiakirja. Valinta path kertoo, mihin osaan tekijädokumenttia tämä kysely koskee, ja sitten valinta query on kysely, joka suoritetaan näitä sisäkkäisiä dokumentteja vastaan. Toisin kuin edellisessä kyselyssä tämä edellyttää, että yksittäinen kirja on löydettävissä täyttämään molemmat vaatimukset, joten vain Alaistair Reynolds palautetaan

vanhempi & lapsi

toinen elasticsearchin tarjoama käsite on vanhempien ja lasten suhde dokumenttien välillä. Edellinen esimerkki voidaan muokata tekijöiden kanssa vanhemman asiakirjoja ja kirjoja kuin lapsi asiakirjoja.

tällä kertaa indeksoi tekijät erikseen kirjoistaan:

määritä sitten kirjatyypin kartoitus ja sano, että sen päätyyppi on bare_author. Sinun täytyy tehdä tämä ennen kuin luot mitään kirjoja.

12345
curl -XPOST localhost:9200/authors/book/_mapping -d '{ "book":{ "_parent": {"type": "bare_author"} }}'

kun indeksoimme kirjoja, sinun täytyy sitten antaa niiden vanhemman tunnus (eli toimitamme jommankumman aiemmin luodun tekijän tunnuksen)

Elasticsearch tarjoaa has_child suodattimen, joka tekee aika paljon sen, mitä tinalla sanotaan.: se valitsee vanhemman asiakirjat, joissa vähintään yksi lapsi täyttää tietyn kyselyn. Tämän kyselyn mukaan vain Alastair Reynolds:

Solr 4.0 on ilmeisesti kyky tehdä liittymiä, vaikka sikäli kuin voin kertoa tämä tulee joitakin rajoituksia, erityisesti ei liittymiä, jos käytät hajautetussa ympäristössä. Rajoittamalla itsensä vanhemman ja lapsen tyyppisiin suhteisiin elasticsearch helpottaa omaa elämäänsä: lapsi indeksoidaan aina samaan sirpaleeseen kuin vanhempi, joten has_child ei tarvitse tehdä hankalia ristisirpaleoperaatioita.

Rakennusluettelot

voit käyttää tätä myös mallintamaan käyttäjäkohtaisia listoja jaetuista globaaleista kohteista – esimerkiksi jos halusit kohteita, jotka käyttäjä oli arvioinut. Tässä tapauksessa lapsesi asiakirjat edustaisivat sitä, että tietty käyttäjä oli arvioinut tietyn post-ne eivät ole mitään muuta kuin user_id, post_id ja luokitus: liity taulukko relaatiotietokanta lingo.

käyttämällä vanhemman ja lapsen suhteita ja has_child voit helposti löytää kaikki käyttäjän suosimat viestit samalla, kun käyttäjät voivat etsiä suosikkejaan julkaisun sisällön, päivämäärän tai minkä tahansa muun viestin attribuutin tai minkä tahansa lapsen kohteen ominaisuuksien perusteella. Kohteen lisääminen mitoitettujen kohteiden luetteloon on halpaa-se vaatii vain hyvin pienen rating kohteen indeksoinnin.

näillä asiakirjoilla

tämä kysely

löytää vain ”bolivia rated 4”: n, koska se on ainoa postaus, jossa mainitaan bolivia, joka on luokiteltu yli 3: n käyttäjältä, josta olemme kiinnostuneita. Otsikon ylätason kysely koskee julkaisuja, joissa has_child suodattimen sisällä oleva kysely kuvaa olosuhteet, jotka lasten on täytettävä (tässä tapauksessa heidän on kuuluttava tietylle käyttäjälle ja heillä on oltava vähintään tietty luokitus).

tilaaminen

se, mitä has_child ei anna sinun tehdä, on lasten attribuuttien tai lapsen attribuuttien palauttaminen. Jos haluat tilata käyttäjän mitoitettu virkaa perustuu milloin ne on mitoitettu tai vähentämällä luokitus sitten voit etsiä vastaan virkaa / luokitus suoraan, mutta saatat haluta soveltaa joitakin haku critera virkaa liian. Esimerkiksi haluat ehkä vain löytää rated virkaa tietyn aiheen (edelleen tilaus luokitus käyttäjä antoi). has_child: llä ei ole enää tuuria. Sisäkkäiset asiakirjatkaan eivät auta.

0.19.10 alkaen voit käyttää has_parent – suodatinta. Tämä toimii lähes täsmälleen sama kuin on lapsi, mutta voit määrittää kyselyn vastaan vanhempi kohteita sijaan. Tämä kysely palauttaa käyttäjän 1234 arviot viesteistä, joiden otsikko vastaa ”bolivia”, laskevassa pistejärjestyksessä

tämä palauttaa arvosteluobjektit – sinun on sitten noudettava vastaavat viestit erillisellä kyselyllä.

Faking it

jos on juuttunut elasticsearchin vanhempaan versioon, pääsee sinne suurimmaksi osaksi top_children. Dokumentaation mukaan top_children tiedustelee ensin lapsiasiakirjat ja kokoaa ne sitten vanhempiin asiakirjoihin. Esimerkissämme tämä tarkoittaa, että elasticsearch löytää ensin kyselyämme vastaavat luokitusasiakirjat. Sitten se vastaa kunkin luokituksen sen emoyhtiölle, yhdistäen päällekkäiset viestit, jos ne ovat olemassa.

top-lasten kanssa on se fiddly bitti, että elasticsearch ei tiedä etukäteen, kuinka monta dokumenttia se menettää, kun aggregaatio tapahtuu. Tässä nimenomaisessa tapauksessa se on helppoa, koska kaksi erillistä luokitukset saman käyttäjän aina vastaa kahta erillistä virkaa, joten meidän ei tarvitse vaivautua factor ja incremental_factor asetukset, koska aggregointivaihe ei koskaan tee mitään. Samoin score-moodillakaan ei ole väliä. Jos sinun täytyy antaa tarkka määrä kokonaismäärästä tuloksia sinun tarvitsee vain asettaa factor tarpeeksi suuri, että ensimmäinen lakaista elasticsearch tekee lapsi asiakirjoja löytää ne kaikki. Jos tiedät, että käyttäjällä on 500 arvosteltua kohdetta listallaan ja pyydät 10 ensimmäistä kohdetta, 50: n kertoimen pitäisi tepsiä. Tekijän tarvitsee olla vain yläraja – sinun ei tarvitse tietää tarkalleen, kuinka monta kohdetta käyttäjällä on listallaan (mikä voi olla hankalaa selvittää ilman erillistä joustavaa hakukyselyä, jos käyttäjä etsii tiettyä osajoukkoa luokituksistaan).

kaiken jälkeen tämä on luettelo vanhempien asiakirjoista (viroista), jotka on lajiteltu lasten dokumenttien kyselypisteiden (luokitusten) mukaan. Saavuttaaksemme alkuperäisen tavoitteen lajitella viestit lasten asiakirjojen ominaisuuksien perusteella meidän tarvitsee vain varmistaa, että tämä kyselyn pisteet on oikea arvo. Pyydä esimerkiksi top_children query wrap a custom_score – kysely, jotta voit itse päättää, mikä kunkin lapsen pistemäärä on.

samojen dokumenttien avulla tämä kysely palauttaa viestit, jotka käyttäjä 1234 on arvioinut, järjestettynä niiden luokituksen mukaan:

käynnissä on top_children kysely, joten ensimmäiseksi pitää sanoa, minkälaisia lapsia harkitsemme (luokitus). Sitten tarjoamme kyselyn, joka löytää ne lapset. Tämä on custom_score kysely, kääre filtered kysely. filtered – kysely varmistaa, että löydämme vain käyttäjän antamat luokitukset, joista olemme kiinnostuneita, ja sitten script – elementti tekee luokitusasiakirjan pistemäärästä itse luokituksen, jotta saamme viestimme järjestykseen luokituksen mukaan. Funkiness kanssa backslashes on vain, koska yritän sisällyttää kirjaimellinen yhden lainauksen komentotulkki ystävällinen merkkijono rajattu yhden lainausmerkit-todellinen json, että olemme lähettämässä on vain "script": "doc.value".

Ruby fun

valitettavasti rengaskirjasto ei tällä hetkellä tue mitään näistä hauskoista jutuista – tämänkaltaisen ominaisuuden lisäämistä on hieman lykätty, koska tällä hetkellä jokainen pieni kyselytyyppi ja-vaihtoehto päätyy erillisiksi menetelmiksi, jotka on siroteltu ympäri rengasta, mistä ylläpitäjä ei ymmärrettävästi pidä. Voit hakkeroida sen.

rengas ei salli dokumentin vanhemman tunnuksen asettamista indeksoinnin yhteydessä. Tämä on helppo lisätä, ja sitä viivyttää vain edellä mainittu lykkäys. Haarukkani lisää tämän kyvyn. Siihen päädytään

seuraava epäonni on, että Tiren autoindeksin luonti edellyttää yhtä tyyppiä per indeksi, mutta jotta vanhemman ja lapsen suhde olisi olemassa, molempien on oltava samassa indeksissä. Olen päätynyt tekemään jotain tällaista luodakseni indeksini.

, joka ei ole aivan yhtä kaunis, mutta hoitaa homman.

lopuksi sinun täytyy itse tehdä kysely. Koska top_children ei ole itse asiassa osa Tiren api: ta, voit fudgata sen näin

tämä pieni epämiellyttävyys rakentaa kyselyn hasikseksi ja työntää sen sitten renkaaseen, kun se katsoo toiseen suuntaan. Voit tietenkin jäsentää sen siten, että hakuun on helppo lisätä muita ehtoja (joko postitse tai luokituksen perusteella). Voit myös rakentaa JSONin manuaalisesti ja käyttää Post.search :payload => my_json (hyötykuorma-vaihtoehdossa on vika, joka on ristiriidassa tire-contribin metsurilaajennuksen kanssa)

Vastaa

Sähköpostiosoitettasi ei julkaista.