Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. MongoDB
Code

Volledige teks soek in MongoDB

by
Difficulty:IntermediateLength:LongLanguages:

Afrikaans (Afrikaans) translation by Uwais Al Qarni (you can also view the original English article)

MongoDB , een van die voorste NoSQL databasisse, is bekend vir sy vinnige uitvoering, buigsame skema, skaalbaarheid en groot indekseringsvermoëns. Die kern van hierdie vinnige vertoning lê MongoDB indekse, wat die doeltreffende uitvoering van navrae ondersteun deur volledige insameling te vermy skanderings en dus beperking van die aantal dokumente wat MongoDB soek.

Begin van weergawe 2.4, MongoDB begin met 'n eksperimentele funksie ondersteun Full-text Soek met behulp van teks indekse . Hierdie kenmerk het nou word 'n integrale deel van die produk (en is nie meer eksperimenteel nie potloodjie). In hierdie artikel gaan ons die volledige teks soek ondersoek funksies van MongoDB, reg van fundamentele aard.

As jy nuut is by MongoDB, beveel ek aan dat jy die volgende artikels oor Envato Tuts + wat u sal help om die basiese begrippe te verstaan van MongoDB:

Die basiese

Voordat ons enige inligting kry, laat ons kyk na 'n agtergrond. Volledige teks soek verwys na die tegniek om 'n volledige teks databasis te soek teen die soekkriteria wat deur die gebruiker gespesifiseer word. Dit is iets soortgelyk aan hoe ons enige inhoud op Google soek (of eintlik enige ander soektogtoepassing) deur sekere string sleutelwoorde / frases in te voer en om die relevante resultate terug te kry, gesorteer volgens hul posisie.

hier is 'n paar meer scenario's waar ons 'n volledige teks soek sou sien:

  • oorweeg soek jou gunsteling onderwerp op Wiki. Wanneer u 'n soek teks op Wiki invoer, die soekenjin bring resultate op van al die artikels wat verband hou met die sleutelwoorde / frase waarna u gesoek het (selfs al is daardie sleutelwoorde diep binne gebruik die artikel). Hierdie resultate word gesorteer volgens relevansie gebaseer op hul ooreenstemmende telling.
  • roteer Nog 'n voorbeeld, kyk na 'n sosiale netwerk-webwerf waar die gebruiker 'n kan maak soek om al die plasings te vind wat die navraagskatte in hulle bevat; van om meer kompleks te wees, al die poste wat kommentaar wat die woord katte bevat.

Voordat ons aangaan, is daar sekere algemene terme wat verband hou na voltekssoektog wat jy moet weet. Hierdie terme is van toepassing op enige volledige teks soek implementering (en nie MongoDB-spesifieke).

Stop woorde

Stop woorde is die irrelevante woorde wat gefiltreer moet word uit 'n teks. Byvoorbeeld: a, an, die, is, by, wat, ens.

spruit

Stemming is die proses om die woorde na hul stam te verminder. Byvoorbeeld: woorde soos staan, staan, staan, ens. Het 'n gemeenskaplike basis staan.

scoring

'N Relatiewe posisie om te meet watter van die resultate mees relevante.

Alternatiewe vir Volledige teks soek in MongoDB

Voordat MongoDB die konsep van teksindekse opgedoen het, het ons sou ons ons data ondersteun om soektogte te gebruik of gebruik reëlmatige uitdrukkings vir die implementering van so 'n soektog functionalities. Die gebruik van enige van hierdie benaderings het egter sy eie beperkings gehad:

  • In die eerste plek, Nie een van hierdie benaderings ondersteun funksies soos stemming, stop woorde nie, posisie, ens.
  • Die gebruik van navraag soektogte vereis die skepping van multi-sleutel indekse, wat nie voldoende in vergelyking met volteks.
  • Die gebruik van gereelde uitdrukkings is nie doeltreffend van die prestasie oogpunt nie, aangesien Hierdie uitdrukkings gebruik nie indekse effektief nie.
  • in Daarbenewens kan geen van hierdie tegnieke gebruik word om enige frase soektogte uit te voer nie (soos op soek na 'flieks wat in 2015 vrygestel word') of geweegde soektogte.

Afgesien van hierdie benaderings, vir meer gevorderde en komplekse soek-sentriese toepassings, is daar alternatiewe oplossings soos Elastiese Soek van SOLR. maar Die gebruik van enige van hierdie oplossings verhoog die argitektoniese kompleksiteit van die application, since MongoDB now has to talk to an additional external database.

Nota dat MongoDB se voltekssoektog nie voorgestel word as 'n volledige vervanging van soektog nie enjin databasisse soos Elastiese, SOLR, ens. Dit kan egter effektief gebruik word vir die meeste aansoeke wat vandag met MongoDB gebou word.

Bekendstelling van MongoDB Teks soek

Met behulp van MongoDB-voltekssoektog kan jy 'n teksindeks definieer op enige veld in die dokument waarvan die waarde 'n string of 'n reeks stringe is. Wanneer ons 'n teks skep indeks op 'n veld, MongoDB tokenizes en stems die geïndekseer veld se teks inhoud, en stel die indekse daarvolgens op.

Om dinge verder te verstaan, laat ons nou in die praktyk duik Dinge. Ek wil hê jy moet die tutoriaal saam met my volg deur die voorbeelde in mongo-dop. Ons sal eers monster data maak wat ons sal wees deur gebruik te maak van die hele artikel, en dan gaan ons voort om sleutelkonsepte te bespreek.

Vir die doel van hierdie artikel, oorweeg 'n versameling boodskappe wat dokumente van die volgende struktuur:

Kom ons voeg 'n paar voorbeeld dokumente in met die invoegopdrag om ons toetsdata te skep:

Skep 'n teksindeks

'N Teksindeks word geskep wat baie ooreenstem met hoe ons 'n gereelde indeks, behalwe dat dit die teks spesifiseer sleutelwoord in plaas van 'n stygende / dalende volgorde te spesifiseer.

Indekseer 'n enkele veld

Skep 'n teks indeks oor die onderwerp Veld van ons dokument met die volgende navraag:

Om hierdie nuutgeskepte teksindeks oor die vakgebied te toets, sal ons dokumente soek met die $ teksoperateur. Ons sal soek al die dokumente wat die sleutelhonde het in hul vakgebied.

Sedert ons voer 'n tekssoektog uit, ons is ook geïnteresseerd in die verkryging van 'n paar statistieke oor hoe relevant die gevolglike dokumente is. Vir hierdie doel, ons sal sterf {$ meta: "textScore"} uitdrukking gebruik, wat inligting verskaf oor die verwerking Van die $ teksoperateur. Ons sal ook sorteer die dokumente volgens hul teksScore gebruik die sorteeropdrag. 'N Hoër teksScore dui op 'n meer relevante wedstryd.

Bogenoemde navraag gee die volgende dokumente terug sterf navraag honde in hul vakgebied.

Soos u kan sien, het die eerste dokument 'n telling van 1 (sedert Die navraag hond verskyn twee keer in sy onderwerp) in teenstelling met die tweede dokument met 'n telling van 0.66. Die navraag het ook die teruggekeerde dokumente in dalende gesorteer volgorde van hul telling.

Een vraag wat mag ontstaan ​​in jou gedagtes, is dit as ons soek na die navraaghonde, waarom is die soekenjin besig om te neem sterf navraag hond (sonder 's') in oorweging? Onthou ons bespreking oor stemming, waar enige soekterme word na hul basis verminder? Dit is die rede waarom die navraag honde verminder word tot hond.

Meerdere indekseer Velde (saamgestelde indeksering)

Meer dikwels as nie, sal jy tekssoektog gebruik veelvuldige velde van 'n dokument. In ons voorbeeld sal ons saamgestelde teks aktiveer indeksering oor die vak en inhoud velde. Gaan voort en voer uit die volgende opdrag in mongo-dop:

Het hierdie werk gedoen? Geen!! Die skep van 'n tweede teks indeks sal gee jy 'n foutboodskap wat sê dat 'n volledige teks soek indeks reeds bestaan. Hoekom is dit so? Die antwoord is daardie teks indekse kom met 'n beperking van slegs een teksindeks per versameling. Dus as jy wil graag 'n ander teks indeks skep, jy sal die bestaande moet laat val een en herskep die nuwe een.

Nadat u bogenoemde indeks skeppingsvrae uitgevoer het, probeer soek na alle dokumente met navraag kat.

Bogenoemde navraag sal die volgende dokumente uitstuur:

Jy kan sien dat die telling van die eerste dokument wat bevat sterf navraag kat in beide vak en inhoud velde, is hoër.

Die hele indeksering Dokument (Wildcard Indexing)

In die laaste voorbeeld stel ons 'n gekombineerde indeks op die onderwerp en inhoudsvelde. Maar daar kan scenario's wees waar jy enige teks wil hê inhoud in jou dokumente is soekbaar.

Byvoorbeeld, oorweeg stoor e-posse in MongoDB dokumente. In die geval van e-posse, al die velde, insluitend Afsender, Ontvanger, Onderwerp en Liggaam moet soekbaar wees. In sulke scenario's wat jy kan al die string velde van jou dokument indekseer deur die $ ** wildcard spesifiseerder te gebruik.

Die soektog sal so iets gaan (maak seker dat jy dit is die bestaande indeks verwyder voordat jy 'n nuwe een skep):

Hierdie soektog sal outomaties teksindekse op enige string velde in ons dokumente. Om dit uit te toets, voeg 'n nuwe dokument in met 'n nuwe veld plek daarin:

Nou as jy teks soek met sleutelwoord chicago (navraag hieronder) probeer, sal dit terugkom die dokument wat ons net ingevoeg het.

'N Paar dinge waarop ek hier wil fokus:

  • waarneem dat ons 'n indeks op die nie uitdruklik definieer plek in die veld nadat ons 'n nuwe dokument ingevoeg. Dit is omdat ons het reeds 'n teksindeks op die hele dokument gedefinieer met die $ ** -operateur.
  • wildcard Indekse kan soms stadig wees, veral in scenario's waar jou data baie is Groot. Om hierdie rede beplan jou dokumentindekse (aka wildcard-indekse) verstandig, aangesien dit 'n prestasie tref.

Gevorderde soek

Frase soek

Jy kan soek na frases soos "slim voëls wat lief is vir kook" deur gebruik te maak van teksindekse. By verstek is die frase soek maak 'n OF soek op al die gespesifiseerde sleutelwoorde, dws dit sal kyk vir dokumente wat bevat Van die sleutelwoorde slim, voël , liefde of kook.

Hierdie navraag sal die volgende dokumente uitstuur:

As jy 'n presiese frase soek wil uitvoer (logiese EN), kan jy dit d Spesifieke dubbele aanhalings in die soek teks.

Hierdie navraag sal lei tot die volgende dokument, wat bevat die frase "kook kos" saam:

Negation Search

'N soekterme met 'n soektog met - (minusteken) sluit alle dokumente wat die ontkenning bevat, uit 'n soektog met 'n soektog met - (minusteken) sluit alle dokumente wat die ontkenning bevat, uit termyn. Probeer byvoorbeeld om 'n dokument te soek wat die navraag rat maar bevat nie voëls wat die volgende navraag gebruik nie:

Kyk agter die skerms

Een belangrike funksie wat ek nie tot nou toe bekend gemaak het nie, is hoe jy agter die skerms kyk en kyk hoe jou soekterme gestig word, stop bewoording toegepas, ontken, ens. $ verduidelik Tot die redding. U kan die verduidelik navraag uitvoer deur die waarheid as parameter te gee, wat u gedetailleerde statistieke op die navraaguitvoering.

soos jy kyk na die navraagplanner voorwerp teruggegee deur die verduidelik bevel, sal jy kan sien hoe MongoDB die gegee soek string. Let daarop dat dit veragtelik word om woorde te stop soos wie , en honde by die hond gesit het.

U kan ook die terme sien wat ons van ons soektog verwaarloos het en die frases wat ons in die parsedTextQuery gebruik het article.

Die verduidelik navraag sal baie nuttig wees as ons meer presteer komplekse navrae en wil dit analiseer.

Geweegde teks soek

Wanneer ons indekse op meer as een veld in ons dokument het, meeste van die tye sal een veld belangriker wees (dws meer gewig) as die ander. Byvoorbeeld, as jy oor 'n blog soek, is die titel van die blog moet die hoogste gewig hê, gevolg deur die bloginhoud.

Die standaardgewig vir elke geïndekseerde veld is 1. Toewys Relatiewe gewigte vir die geïndekseerde velde, jy kan die gewig opsie insluit terwyl jy die createIndex gebruik skuinste.

Kom ons verstaan ​​dit met 'n voorbeeld. As jy probeer om die kookwoord met ons huidige te soek indekse, sal dit lei tot twee dokumente, wat albei dieselfde het vertel.

Laat ons nou ons indekse verander om gewigte in te sluit; Met die vakveld met 'n gewig van 3 Teen die inhoudsveld met 'n gewig van 1.

Probeer om te soek vir navraag kok nou, en jy sal sien wat die dokument bevat hierdie navraag in die vakgebied het 'n groter telling (van 2) as die ander (wat 0.66 het).

Partitionering teks indekse

Namate die data wat in u aansoek gestoor word, groei, word die grootte van u teksindekse ook aan die groei. Met hierdie toename in grootte van teksindekse, MongoDB moet soek na al die geïndekseerde inskrywings wanneer 'n tekssoektog is gemaak.

As 'n tegniek om jou teks doeltreffend te hou met groeiende indekse, kan jy kan die aantal gescande indeksinskrywings beperk deur gelykheidstoestande met 'n gereelde $ tekssoektog tegebruik. 'N baie algemene Voorbeeld hiervan sal al die poste wat tydens 'n sekere is, soek jaar / maand, of soek al die plasings met 'n sekere kategorie / merker.

As u die dokumente waarna ons besig is, waarneem, ons het 'n jaar veld in hulle wat ons het nog nie gebruik nie. N Algemene scenario sou wees om boodskappe per jaar saam te soek met die volledige tekssoektog waaroor ons geleer het.

Hiervoor kan ons skep 'n saamgestelde indeks wat 'n stygende / dalende indeks sleutel op jaar spesifiseer, gevolg deur 'n teks indeks oor die onderwerp veld. Deur dit te doen, is ons doen twee belangrike dinge:

  • Ons is die logiese partisie van die volledige versameling data in geskei geskei per jaar.
  • Dit sal die tekssoektog beperk tot Skandeer slegs die dokumente wat onder 'n spesifieke jaar val (of bel dit stel).

Druppel die indekse wat jy reeds het en skep 'n nuwe samengestelde indeks op ( jaar, vak):

Voer nou die volgende navraag uit om al die boodskappe te soek wat in 2015 geskep is en die katte se navraag bevat:

Die navraag sal slegs een pasgemaakte dokument terugstuur soos verwag. As jy hierdie navraag verduidelik en kyk deur die uitvoeringStats, sal jy vind daardie totaleDocsExamined for this navraag was 1, wat bevestig dat ons nuwe indeks korrek benut en gebruik is MongoDB moes net 'n enkele dokument skandeer, terwyl al die ander veilig ignoreer word dokumente wat nie onder 2015 val nie.

Teksindekse: Voordele

Wat meer kan teks Indekse Doen?

Ons het 'n lang pad in hierdie artikel gekom oor die leer van teks indekse. Daar is baie ander begrippe wat jy met teks kan eksperimenteer indekse. Maar weens die omvang van hierdie artikel sal ons nie kan bespreek nie hulle in detail vandag. Tog, laat ons 'n kort blik op wat dit funksionaliteite is:

  • Teks indekse bied multi-taal ondersteuning, sodat jy in verskillende kan soek verhaal met die $ taal operateur. MongoDB ondersteun tans ongeveer 15 tale, insluitend Frans, Duits, Russies, ens.
  • teks indekse kan gebruik word vir die samevoeging van pyplynnavrae. Die wedstrydfase in 'n gesamentlike soektog kan die gebruik van 'n volledige teks soektog spesifiseer.
  • Jy kan u gereelde operateurs gebruik vir projeksies, filters, perke, soorte, ens. terwyl werk met teks indekse.

MongoDB teks indeksering versus eksterne soek databasisse

Hou in gedagte dat MongoDB voltekssoektog nie is nie 'n volledige vervanging vir tradisionele soekenjin databasisse wat gebruik word MongoDB, met die inheemse MongoDB funksionaliteit word aanbeveel vir die die volgende redes:

  • roteer By 'n onlangse gesprek by MongoDB werk die huidige omvang van tekssoektog perfek goed vir 'n meerderheid aansoeke (ongeveer 80%) wat gebruik word MongoDB vandag.
  • Gebou soek soek vermoëns van u aansoek binne dieselfde aansoek databasis verminder die argitektoniese kompleksiteit van die aansoek.
  • MongoDB teks soek werk in real time, sonder enige lae of bondel updates. Die oomblik jy plaas of werk 'n dokument, die teksindeksinskrywings word opgedateer.
  • teks soek word geïntegreer in die db kernel funksionaliteite van MongoDB, dit is heeltemal konsekwent en werk ook goed, selfs met verberg en replikasie.
  • Dit integreer perfek met jou bestaande Mongo-funksies soos filters, aggregasie, opdaterings, ens.

Text Indexes: Drawbacks

Voltekssoektog is 'n relatief nuwe kenmerk in MongoDB, daar is sekere funksies wat dit tans ontbreek. Ek sal hulle in drie kategorieë verdeel. Kom ons kyk.

Funksionaliteite ontbreek Uit tekssoektog

  • teks Indekse het tans nie die vermoë om steekbare koppelvlakke te ondersteun nie soos pluggable stemmers, woorde stop, ens.
  • Hulle Boomkwekerij ondersteun tans nie funksies soos soek op grond van sinonieme, soortgelyke woorde ens.
  • hulle Moenie termynposisies stoor nie, dws die aantal woorde waarmee die twee sleutelwoorde word geskei.
  • jy kan nie die sorteer volgorde vir 'n soort uitdrukking in 'n teks indeks spesifiseer nie.

Restrictions in Bestaande Funksies

  • A saamgestelde teks indeks kan nie enige ander tipe indeks insluit nie, soos multi-sleutel indexes or geo-spatial indexes. Daarbenewens, as u saamgestelde teks-indeks sluit enige indeks sleutels voor die teks indeks sleutel, al die navrae moet spesifiseer die gelykheidsoperateurs vir die voorafgaande sleutels.
  • daar is enkele navraag spesifieke beperkings. Byvoorbeeld, 'n navraag kan slegs 'n enkele $ teks uitdrukking spesifiseer, jy kan nie $ teks gebruik met $ nie , of jy kan nie die wenk gebruik nie Bestuur met $ teks , gebruik $ teks met $ of benodig al die klousules in u $ van uitdrukking wat geïndekseer moet word, ens.

Prestasie Downsides

  • Teksindekse skep 'n bokoste terwyl nuwe dokumente ingevoeg word. Dit slaan weer op die invoegtoevoer.
  • Sommige navrae soos frase soektogte kan relatief stadig wees.

Klaar maak

Voltekssoektog was nog altyd een van die mees gevraagde kenmerke van MongoDB. In hierdie artikel het ons begin met 'n inleiding tot wat voltekssoektog is, voordat u verder gaan na die basiese beginsels van die skep van teksindekse.

Ons het toe ondersoek saamgestelde indeksering, wildcardindeksering, frase soektogte en negatiewe soektogte. verder, Ons het 'n paar belangrike begrippe verken, soos om teksindekse te analiseer, geweeg soek en verdeel jou indekse logies. Ons kan 'n paar belangrike opdaterings vir hierdie funksie in die komende vrystellings van MongoDB.

Ek beveel aan dat jy 'n toets probeer soek en jou gedagtes deel. As jy dit reeds in jou aansoek geïmplementeer het, deel dit asseblief jou ervaring. Uiteindelik, voel vry om u vrae, gedagtes en pos te plaas voorstelle oor hierdie artikel in die kommentaar afdeling.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.