Rask introduksjon til fulltekstsøk med ElasticSearch

Utholdenhetstopp

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Oversikt

Fulltekstssøk og utfører språklige søk mot dokumenter. Den inkluderer enkle eller flere ord eller uttrykk og returnerer dokumenter som samsvarer med søketilstanden.

ElasticSearch er en søkemotor basert på Apache Lucene, et gratis programvare bibliotek for åpen programvare for henting av informasjon. Det gir en distribuert søkemotor i fulltekst med et HTTP-nettgrensesnitt og skjemafrie JSON-dokumenter.

Denne artikkelen undersøker REST API for ElasticSearch og viser bare grunnleggende operasjoner ved bruk av HTTP-forespørsler.

2. Oppsett

For å installere ElasticSearch på maskinen din, se den offisielle installasjonsveiledningen.

RESTfull API kjører på port 9200. La oss teste om den kjører riktig ved hjelp av følgende curl-kommando:

krølle -XGET '// localhost: 9200 /'

Hvis du observerer følgende svar, kjører forekomsten riktig:

{"name": "NaIlQWU", "cluster_name": "elasticsearch", "cluster_uuid": "enkBkWqqQrS0vp_NXmjQMQ", "version": {"number": "5.1.2", "build_hash": "c8c4c16", "build_date ":" 2017-01-11T20: 18: 39.146Z "," build_snapshot ": false," lucene_version ":" 6.3.0 "}," tagline ":" Du vet, for søk "}

3. Indeksere dokumenter

ElasticSearch er dokumentorientert. Den lagrer og indekserer dokumenter. Indeksering oppretter eller oppdaterer dokumenter. Etter indeksering kan du søke, sortere og filtrere komplette dokumenter - ikke rader med kolonnedata. Dette er en helt annen måte å tenke på data på og er en av grunnene til at ElasticSearch kan utføre et komplekst fulltekstsøk.

Dokumenter er representert som JSON-objekter. JSON-serialisering støttes av de fleste programmeringsspråk og har blitt standardformatet som brukes av NoSQL-bevegelsen. Det er enkelt, kortfattet og lett å lese.

Vi skal bruke følgende tilfeldige oppføringer for å utføre vårt fulltekstsøk:

{"title": "Han gikk", "random_text": "Han gikk så vågent faktum. De små egne syv frelste alderen." } {"title": "Han motsetter seg", "random_text": "Han motsetter seg kastet ønske om nei. \ Annonserer inntrykk upåvirket den dagen han er uforbeholden overbærenhet." } {"title": "Motstøtende spørsmål", "random_text": "Avstøtende spørsmål innhold ham få omfattende støttet." } {"title": "Gammel utdannelse", "random_text": "Gammel utdannelse for ham som avviker enhver arrangering." }

Før vi kan indeksere et dokument, må vi bestemme hvor vi skal lagre det. Det er mulig å ha flere indekser, som igjen inneholder flere typer. Disse typene inneholder flere dokumenter, og hvert dokument har flere felt.

Vi skal lagre dokumentene våre ved hjelp av følgende skjema:

tekst: Indeksnavnet.

artikkel: Typenavnet.

id: ID-en for dette spesielle eksemplet på tekstoppføring.

For å legge til et dokument skal vi kjøre følgende kommando:

curl -XPUT 'localhost: 9200 / text / article / 1? pretty' -H 'Content-Type: application / json' -d '{"title": "Han gikk", "random_text": "Han gikk så tør bra faktum. De små sju frelste menneskene. " } '

Her bruker vi id = 1, kan vi legge til andre oppføringer ved hjelp av samme kommando og inkrementert id.

4. Henter dokumenter

Etter at vi har lagt til alle dokumentene våre, kan vi sjekke hvor mange dokumenter vi har i klyngen ved hjelp av følgende kommando:

curl -XGET '// localhost: 9200 / _count? pretty' -d '{"query": {"match_all": {}}}' 

Vi kan også få et dokument ved hjelp av id-en med følgende kommando:

krøll -XGET 'localhost: 9200 / tekst / artikkel / 1? pen' 

Og vi bør få følgende svar fra elastisk søk:

{"_index": "text", "_type": "article", "_id": "1", "_version": 1, "found": true, "_source": {"title": "Han gikk" , "random_text": "Han gikk så vågent faktum. De små sju frelste alderen." }}

Som vi kan se svarer svaret til oppføringen som er lagt til ved hjelp av id 1.

5. Spørring av dokumenter

OK, la oss utføre et fulltekstsøk med følgende kommando:

curl -XGET 'localhost: 9200 / text / article / _search? pretty' -H 'Content-Type: application / json' -d '{"query": {"match": {"random_text": "him departure"} }} '

Og vi får følgende resultat:

{"took": 32, "timed_out": false, "_shards": {"total": 5, "successful": 5, "failed": 0}, "hits": {"total": 2, "max_score ": 1.4513469," hits ": [{" _index ":" text "," _type ":" article "," _id ":" 4 "," _score ": 1.4513469," _source ": {" title ":" Gammel utdannelse "," random_text ":" Gammel utdannelse for ham å avvikle enhver arrangering. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0.28582606, "_source": {"title": "Motstøtende spørsmål", "random_text ":" Avstøtende spørsmål innhold ham få omfattende støttet. " }}]}}

Som vi ser ser vi etter “Ham avgang” og vi får to resultater med forskjellige poeng. Det første resultatet er åpenbart fordi teksten har utført søk inne i den, og som vi ser har vi poengsummen på 1.4513469.

Det andre resultatet blir hentet fordi måldokumentet inneholder ordet “ham”.

Som standard sorterer ElasticSearch samsvarende resultater etter relevanspoeng, det vil si etter hvor godt hvert dokument samsvarer med spørringen. Merk at poengsummen for det andre resultatet er liten i forhold til første treff, noe som indikerer lavere relevans.

6. Fuzzy Search

Fuzzy matching behandler to ord som er "uklar" som om de var det samme ordet. Først må vi definere hva vi mener med uklarhet.

Elasticsearch støtter en maksimal redigeringsavstand, spesifisert med fuzziness-parameteren, på 2. Fuzziness-parameteren kan settes til AUTO, noe som resulterer i følgende maksimale redigeringsavstander:

  • 0 for strenger på ett eller to tegn
  • 1 for strenger på tre, fire eller fem tegn
  • 2 for strenger på mer enn fem tegn

kan det hende at en redigeringsavstand på 2 returnerer resultater som ikke ser ut til å være relatert.

Du kan få bedre resultater og bedre ytelse med en maksimal uklarhet på 1. Avstand refererer til Levenshtein-avstanden som er en strengmåling for å måle forskjellen mellom to sekvenser. Uformelt er Levenshtein-avstanden mellom to ord minimum antall endringer i enkelttegn.

OK, la oss utføre søket vårt med uklarhet:

curl -XGET 'localhost: 9200 / text / article / _search? pretty' -H 'Content-Type: application / json' -d '{"query": {"match": {"random_text": {"query": "ham avgang", "fuzziness": "2"}}}} '

Og her er resultatet:

{"took": 88, "timed_out": false, "_shards": {"total": 5, "successful": 5, "failed": 0}, "hits": {"total": 4, "max_score ": 1.5834423," hits ": [{" _index ":" text "," _type ":" article "," _id ":" 4 "," _score ": 1.4513469," _source ": {" title ":" Gammel utdannelse "," random_text ":" Gammel utdannelse, avgang, alt som arrangerte, rådet. " }}, {"_index": "text", "_type": "article", "_id": "2", "_score": 0.41093433, "_source": {"title": "Han er imot", "random_text ":" Han motsetter seg kastet ønske om nei. \ Annonsere inntrykk upåvirket dag hans er uforbeholden overbærenhet. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0.2876821, "_source": {"title": "Motstøtende spørsmål", "random_text ":" Avstøtende spørsmål innhold ham få omfattende støttet. " }}, {"_index": "text", "_type": "article", "_id": "1", "_score": 0.0, "_source": {"title": "Han gikk", "random_text ":" Han gikk så tørt godt faktum. De små egne syv frelste alderen. " }}]}} '

Som vi kan se uklarheten, gi oss flere resultater.

Vi må bruke uklarhet nøye fordi den har en tendens til å hente resultater som ser ut som ikke er relatert.

7. Konklusjon

I denne raske opplæringen fokuserte vi på indeksere dokumenter og spørre Elasticsearch for fulltekstsøk, direkte via REST API.

Vi har selvfølgelig APIer tilgjengelig for flere programmeringsspråk når vi trenger det - men API er fortsatt ganske praktisk og språkagnostisk.

Persistensbunn

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

$config[zx-auto] not found$config[zx-overlay] not found