Hurtig introduktion til fuldtekstsøgning med ElasticSearch

Udholdenhedstop

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

Fuldtekst-søgeforespørgsler og udfører sproglige søgninger mod dokumenter. Det inkluderer enkelte eller flere ord eller sætninger og returnerer dokumenter, der matcher søgebetingelsen.

ElasticSearch er en søgemaskine baseret på Apache Lucene, et gratis og open source-informationssøgningssoftwarebibliotek. Det giver en distribueret søgemaskine i fuldtekst med en HTTP-webgrænseflade og skemafri JSON-dokumenter.

Denne artikel undersøger REST API for ElasticSearch og demonstrerer kun grundlæggende handlinger ved hjælp af HTTP-anmodninger.

2. Opsætning

Se den officielle installationsvejledning for at installere ElasticSearch på din maskine.

RESTfull API kører på port 9200. Lad os teste, om den kører korrekt ved hjælp af følgende curl-kommando:

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

Hvis du observerer følgende svar, kører forekomsten korrekt:

{"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 ved, til søgning "}

3. Indeksering af dokumenter

ElasticSearch er dokumentorienteret. Det gemmer og indekserer dokumenter. Indeksering opretter eller opdaterer dokumenter. Efter indeksering kan du søge, sortere og filtrere komplette dokumenter - ikke rækker med søjledata. Dette er en grundlæggende anden måde at tænke på data på og er en af ​​grundene til, at ElasticSearch kan udføre en kompleks fuldtekstsøgning.

Dokumenter er repræsenteret som JSON-objekter. JSON-serialisering understøttes af de fleste programmeringssprog og er blevet standardformatet, der bruges af NoSQL-bevægelsen. Det er simpelt, kortfattet og let at læse.

Vi vil bruge følgende tilfældige poster til at udføre vores fuldtekstsøgning:

{"title": "Han gik", "random_text": "Han gik sådan tør godt. De små egne syv reddede mandens alder." } {"title": "Han modsætter sig", "random_text": "Han modsætter sig kastet ønske om nr. \ Annoncerende indtryk upåvirket dag er hans uforbeholdne overbærenhed." } {"title": "Frastødende spørgsmål", "random_text": "Afstødende spørgsmål tilfredse ham få omfattende understøttet." } {"title": "Gammel uddannelse", "random_text": "Gammel uddannelse ham afgang enhver arrangere en sejrede." }

Før vi kan indeksere et dokument, skal vi beslutte, hvor det skal gemmes. Det er muligt at have flere indekser, som igen indeholder flere typer. Disse typer indeholder flere dokumenter, og hvert dokument har flere felter.

Vi skal gemme vores dokumenter ved hjælp af følgende skema:

tekst: Indeksnavnet.

artikel: Typenavnet.

id: ID'et for dette bestemte eksempel på tekstindtastning.

For at tilføje et dokument kører vi følgende kommando:

curl -XPUT 'localhost: 9200 / text / article / 1? pretty' -H 'Content-Type: application / json' -d '{"title": "Han gik", "random_text": "Han gik sådan tør godt faktum. De små egne syv frelste manders alder. " } '

Her bruger vi id = 1, kan vi tilføje andre poster ved hjælp af samme kommando og inkrementeret id.

4. Hentning af dokumenter

Når vi har tilføjet alle vores dokumenter, kan vi kontrollere, hvor mange dokumenter ved hjælp af følgende kommando, vi har i klyngen:

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

Vi kan også få et dokument ved hjælp af dets id med følgende kommando:

krølle -XGET 'localhost: 9200 / tekst / artikel / 1? smuk' 

Og vi skulle få følgende svar fra elastisk søgning:

{"_index": "text", "_type": "article", "_id": "1", "_version": 1, "found": true, "_source": {"title": "Han gik" , "random_text": "Han gik sådan en tur faktisk. De små egne syv reddede mandens alder." }}

Som vi kan se svarer svaret til den tilføjede post ved hjælp af id 1.

5. Forespørgsel på dokumenter

OK lad os udføre en fuldtekstsøgning 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 uddannelse "," random_text ":" Gammel uddannelse ham afgang enhver arrangere en sejrede. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0.28582606, "_source": {"title": "Frastødende spørgsmål", "random_text ":" Afstødende spørgsmål tilfredse ham få omfattende understøttet. " }}]}}

Som vi kan se, leder vi efter “Ham afgang” og vi får to resultater med forskellige scores. Det første resultat er indlysende, fordi teksten har den udførte søgning inde i den, og som vi kan se, har vi score på 1.4513469.

Det andet resultat hentes, fordi måldokumentet indeholder ordet ”ham”.

Som standard sorterer ElasticSearch matchende resultater efter deres relevans score, dvs. hvor godt hvert dokument matcher forespørgslen. Bemærk, at scoren for det andet resultat er lille i forhold til det første hit, hvilket indikerer lavere relevans.

6. Fuzzy Search

Fuzzy matching behandler to ord, der ligner "fuzzily", som om de var det samme ord. Først skal vi definere, hvad vi mener med uklarhed.

Elasticsearch understøtter en maksimal redigeringsafstand, der er specificeret med fuzziness-parameteren, på 2. Fuzziness-parameteren kan indstilles til AUTO, hvilket resulterer i følgende maksimale redigeringsafstande:

  • 0 til strenge på et eller to tegn
  • 1 til strenge på tre, fire eller fem tegn
  • 2 til strenge på mere end fem tegn

kan du opleve, at en redigeringsafstand på 2 returnerer resultater, der ikke ser ud til at være relaterede.

Du kan få bedre resultater og bedre ydeevne med en maksimal uklarhed på 1. Afstand henviser til Levenshtein-afstanden, der er en strengmetrik til måling af forskellen mellem to sekvenser. Uformelt er Levenshtein-afstanden mellem to ord det mindste antal redigeringer af enkelttegn.

OK lad os udføre vores søgning med uklarhed:

curl -XGET 'localhost: 9200 / text / article / _search? pretty' -H 'Content-Type: application / json' -d '{"query": {"match": {"random_text": {"query": "ham afgang", "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 uddannelse "," random_text ":" Gammel uddannelse ham afgang enhver arrangere en hersket. " }}, {"_index": "text", "_type": "article", "_id": "2", "_score": 0.41093433, "_source": {"title": "Han er imod", "random_text ":" Han modsætter sig kastet ønske om ikke. \ Annoncerende indtryk upåvirket dag hans er uforbeholden overbærenhed. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0.2876821, "_source": {"title": "Frastødende spørgsmål", "random_text ":" Afstødende spørgsmål tilfredse ham få omfattende understøttet. " }}, {"_index": "text", "_type": "article", "_id": "1", "_score": 0.0, "_source": {"title": "Han gik", "random_text ":" Han gik så vovet godt. De små egne syv frelste manders alder. " }}]}} '

Som vi kan se, giver uklarheden os flere resultater.

Vi er nødt til at bruge uklarhed omhyggeligt, fordi det har en tendens til at hente resultater, der ser ikke ude.

7. Konklusion

I denne hurtige vejledning fokuserede vi på indeksering af dokumenter og forespørgsel på Elasticsearch til fuldtekstsøgning direkte via REST API.

Vi har selvfølgelig API'er tilgængelige til flere programmeringssprog, når vi har brug for det - men API'en er stadig ret praktisk og sprog agnostisk.

Persistens bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

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