Brzo upoznavanje pretraživanja cjelovitog teksta pomoću ElasticSearch-a

Vrh postojanosti

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Pregled

Pretraživanje cjelovitog teksta i lingvističko pretraživanje dokumenata. Sadrži jednu ili više riječi ili fraza i vraća dokumente koji odgovaraju uvjetima pretraživanja.

ElasticSearch je pretraživač zasnovan na Apache Lucene, besplatnoj biblioteci softvera za pronalaženje informacija otvorenog koda. Pruža distribuiranu tražilicu s punim tekstom s HTTP web sučeljem i JSON dokumentima bez sheme.

Ovaj članak ispituje ElasticSearch REST API i prikazuje osnovne operacije samo pomoću HTTP zahtjeva.

2. Postavljanje

Da biste instalirali ElasticSearch na svoj uređaj, pogledajte službeni vodič za postavljanje.

RESTfull API radi na priključku 9200. Provjerimo je li ispravno pokrenut pomoću sljedeće naredbe curl:

curl -XGET '// localhost: 9200 /'

Ako primijetite sljedeći odgovor, instanca se pravilno izvodi:

{"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 ":" Znate, za pretraživanje "}

3. Indeksiranje dokumenata

ElasticSearch je orijentiran na dokumente. Pohranjuje i indeksira dokumente. Indeksiranje stvara ili ažurira dokumente. Nakon indeksiranja možete pretraživati, sortirati i filtrirati cjelovite dokumente, a ne retke podataka u stupcu. Ovo je bitno drugačiji način razmišljanja o podacima i jedan je od razloga što ElasticSearch može izvršiti složeno pretraživanje cijelog teksta.

Dokumenti su predstavljeni kao JSON objekti. JSON serializaciju podržava većina programskih jezika i postala je standardni format koji koristi pokret NoSQL. Jednostavan je, jezgrovit i lak za čitanje.

Koristit ćemo sljedeće slučajne unose za obavljanje pretraživanja cijelog teksta:

{"title": "Otišao je", "random_text": "Otišao je tako usuđujuće. Činjenica, malih sedam vlastitih spašenih ljudi." } {"title": "Protivio se", "random_text": "Protivio se bačenoj želji br. \ Objavljivanje dojma bez utjecaja na dan bezrezervnog uživanja." } {"title": "Odbojna pitanja", "random_text": "Odbojna pitanja zadovoljila su ga nekoliko opsežno podržanih." } {"title": "Staro obrazovanje", "random_text": "Prevladalo je staro obrazovanje kod odlaska." }

Prije nego što indeksiramo dokument, moramo odlučiti gdje ćemo ga pohraniti. Moguće je imati više indeksa, koji pak sadrže više vrsta. Te vrste sadrže više dokumenata, a svaki dokument ima više polja.

Spremit ćemo svoje dokumente prema sljedećoj shemi:

tekst: Naziv indeksa.

članak: Naziv vrste.

iskaznica: ID ovog primjera unosa teksta.

Za dodavanje dokumenta pokrenut ćemo sljedeću naredbu:

curl -XPUT 'localhost: 9200 / text / article / 1? pretty' -H 'Content-Type: application / json' -d '{"title": "Otišao je", "random_text": "Otišao je tako usudio se dobro činjenica. Mala vlastita sedmorica spašenih čovjekova doba. " } '

Ovdje koristimo id = 1, možemo dodati druge unose koristeći istu naredbu i povećani id.

4. Dohvat dokumenata

Nakon što dodamo sve dokumente možemo provjeriti koliko dokumenata, pomoću sljedeće naredbe, imamo u klasteru:

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

Također, dokument možemo dobiti pomoću njegovog id-a sa sljedećom naredbom:

curl -XGET 'localhost: 9200 / text / article / 1? pretty' 

A iz elastičnog pretraživanja trebali bismo dobiti sljedeći odgovor:

{"_index": "text", "_type": "article", "_id": "1", "_version": 1, "found": true, "_source": {"title": "Otišao je" , "random_text": "Išao je tako usuđujuće. Činjenica je da je malenih sedam spasilo čovjeka." }}

Kao što vidimo, ovaj odgovor odgovara unosu dodanom pomoću id 1.

5. Upit za dokumente

U redu, izvršimo pretraživanje cjelovitog teksta sa sljedećom naredbom:

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

I dobivamo sljedeći rezultat:

{"uzeo": 32, "timed_out": false, "_shards": {"ukupno": 5, "uspješno": 5, "nije uspjelo": 0}, "pogotke": {"ukupno": 2, "max_score ": 1.4513469," hits ": [{" _index ":" text "," _type ":" article "," _id ":" 4 "," _score ": 1.4513469," _source ": {" title ":" Staro obrazovanje "," random_text ":" Prevladalo je staro obrazovanje kod odlaska bilo kojeg dogovarača. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0,28582606, "_source": {"title": "Odbojna pitanja", "random_text ":" Odbojna pitanja zadovoljila su ga nekoliko opsežno podržanih. " }}]}}

Kao što vidimo tražimo "On odlazak" i dobivamo dva rezultata s različitim rezultatima. Prvi je rezultat očit jer se u tekstu izvršava pretraga i kao što vidimo imamo ocjenu 1.4513469.

Dohvaća se drugi rezultat jer ciljni dokument sadrži riječ "on".

Prema zadanim postavkama, ElasticSearch sortira podudarne rezultate prema njihovoj ocjeni relevantnosti, odnosno prema tome koliko se svaki dokument podudara s upitom. Imajte na umu da je rezultat drugog rezultata mali u odnosu na prvi pogodak, što ukazuje na manju relevantnost.

6. Nejasna pretraga

Nejasno podudaranje tretira dvije riječi koje su "mutno" slične kao da su iste riječi. Prvo, moramo definirati što podrazumijevamo pod neizrazitošću.

Elasticsearch podržava maksimalnu udaljenost uređivanja, navedenu s parametrom fuzziness, od 2. Parametar fuzziness može se postaviti na AUTO, što rezultira sljedećim maksimalnim udaljenostima za uređivanje:

  • 0 za nizove od jednog ili dva znaka
  • 1 za nizove od tri, četiri ili pet znakova
  • 2 za nizove s više od pet znakova

možda ćete otkriti udaljenost uređivanja od 2 vraća rezultate za koje se čini da nisu povezani.

Možda ćete dobiti bolje rezultate i bolje performanse, uz maksimalno nejasnoće 1. Udaljenost se odnosi na Levenshteinovu udaljenost koja je metrika niza za mjerenje razlike između dva niza. Neformalno, Levenshteinova udaljenost između dvije riječi najmanji je broj uređivanja s jednim znakom.

U redu, obavimo pretragu nejasno:

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

I evo rezultata:

{"uzeo": 88, "timed_out": false, "_shards": {"ukupno": 5, "uspješno": 5, "nije uspjelo": 0}, "pogotke": {"ukupno": 4, "max_score ": 1.5834423," hits ": [{" _index ":" text "," _type ":" article "," _id ":" 4 "," _score ": 1.4513469," _source ": {" title ":" Staro obrazovanje "," random_text ":" Prevladalo je staro obrazovanje kod odlaska bilo kojeg dogovarača. " }}, {"_index": "text", "_type": "article", "_id": "2", "_score": 0.41093433, "_source": {"title": "Protivio se", "random_text ":" Protivio se bačenoj želji br. \ Objavljivanje dojma bez utjecaja na dan kad je bezrezervno prepuštanje. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0,2876821, "_source": {"title": "Odbojna pitanja", "random_text ":" Odbojna pitanja zadovoljila su ga nekoliko opsežno podržanih. " }}, {"_index": "text", "_type": "article", "_id": "1", "_score": 0,0, "_source": {"title": "Otišao je", "random_text ":" Išao je tako usuđujuće. Činjenica je da je malenih sedam spasilo čovjeka. " }}]}} '

Kao što vidimo, nejasnoće nam daju više rezultata.

Moramo pažljivo koristiti maglovitost jer nastoji dohvatiti rezultate koji izgledaju nepovezani.

7. Zaključak

U ovom brzom vodiču na koji smo se usredotočili indeksiranje dokumenata i postavljanje upita Elasticsearch-u za pretraživanje cijelog teksta, izravno putem REST API-ja.

Mi, naravno, imamo API-je dostupne za više programskih jezika kada to trebamo - ali API je i dalje prilično prikladan i jezično agnostičan.

Dno postojanosti

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

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