Snelle introductie tot zoeken in volledige tekst met ElasticSearch

Persistentie top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

Doorzoekopdrachten in volledige tekst en voert taalkundige zoekopdrachten uit in documenten. Het bevat enkele of meerdere woorden of woordgroepen en retourneert documenten die voldoen aan de zoekvoorwaarde.

ElasticSearch is een zoekmachine gebaseerd op Apache Lucene, een gratis en open-source softwarebibliotheek voor het ophalen van informatie. Het biedt een gedistribueerde, full-text zoekmachine met een HTTP-webinterface en schemavrije JSON-documenten.

In dit artikel wordt ElasticSearch REST API onderzocht en worden basisbewerkingen gedemonstreerd met alleen HTTP-verzoeken.

2. Installatie

Raadpleeg de officiële installatiegids om ElasticSearch op uw computer te installeren.

RESTfull API draait op poort 9200. Laten we testen of het correct werkt met behulp van de volgende curl-opdracht:

curl -XGET '// localhost: 9200 /'

Als u de volgende reactie opmerkt, wordt de instantie correct uitgevoerd:

{"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 ":" Weet je, voor zoeken "}

3. Documenten indexeren

ElasticSearch is documentgericht. Het slaat documenten op en indexeert ze. Door indexering worden documenten aangemaakt of bijgewerkt. Na het indexeren kunt u volledige documenten zoeken, sorteren en filteren, niet rijen met kolomvormige gegevens. Dit is een fundamenteel andere manier van denken over data en is een van de redenen waarom ElasticSearch een complexe full-text zoekopdracht kan uitvoeren.

Documenten worden weergegeven als JSON-objecten. JSON-serialisatie wordt ondersteund door de meeste programmeertalen en is het standaardformaat geworden dat wordt gebruikt door de NoSQL-beweging. Het is eenvoudig, beknopt en gemakkelijk te lezen.

We gaan de volgende willekeurige invoer gebruiken om onze volledige tekstzoekopdracht uit te voeren:

{"title": "Hij ging", "random_text": "Hij ging zo'n durf goed feit. De kleine eigen zeven geredde man leeftijd." } {"title": "Hij verzet zich", "random_text": "Hij verzet zich tegen het gegooide verlangen van nee. \ Aankondigende indruk onaangetast dag zijn onvoorwaardelijke toegeeflijkheid." } {"title": "Weerzinwekkende vragen", "random_text": "Weerzinwekkende vragen stelden hem enkele uitgebreide ondersteunde tevreden." } {"title": "Oude opleiding", "random_text": "Oude opleiding hem vertrek, elke afspraak had de overhand." }

Voordat we een document kunnen indexeren, moeten we beslissen waar we het willen opslaan. Het is mogelijk om meerdere indexen te hebben, die op hun beurt meerdere typen bevatten. Deze typen bevatten meerdere documenten en elk document heeft meerdere velden.

We gaan onze documenten opslaan volgens het volgende schema:

tekst: De indexnaam.

artikel: De typenaam.

ID kaart: De ID van dit specifieke voorbeeldtekstinvoer.

Om een ​​document toe te voegen, gaan we de volgende opdracht uitvoeren:

curl -XPUT 'localhost: 9200 / text / article / 1? pretty' -H 'Content-Type: application / json' -d '{"title": "He went", "random_text": "Hij ging zo goed feit. De kleine eigen zeven geredde man-leeftijd. " } '

Hier gebruiken we id = 1, kunnen we andere vermeldingen toevoegen met dezelfde opdracht en opgehoogde id.

4. Documenten ophalen

Nadat we al onze documenten hebben toegevoegd, kunnen we met de volgende opdracht controleren hoeveel documenten we in het cluster hebben:

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

We kunnen ook een document krijgen met behulp van zijn ID met de volgende opdracht:

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

En we zouden het volgende antwoord moeten krijgen van elastisch zoeken:

{"_index": "text", "_type": "article", "_id": "1", "_version": 1, "found": true, "_source": {"title": "Hij ging" , "random_text": "Hij ging zo'n durf goed feit. De kleine eigen zeven geredde man leeftijd." }}

Zoals we kunnen zien, komt dit antwoord overeen met het item dat is toegevoegd met de id 1.

5. Documenten opvragen

OK, laten we een zoekopdracht in volledige tekst uitvoeren met de volgende opdracht:

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

En we krijgen het volgende resultaat:

{"takes": 32, "timed_out": false, "_shards": {"total": 5, "successvol": 5, "failed": 0}, "hits": {"total": 2, "max_score ": 1.4513469," hits ": [{" _index ":" text "," _type ":" article "," _id ":" 4 "," _score ": 1.4513469," _source ": {" title ":" Oude opvoeding "," random_text ":" Oude opvoeding, hij vertrok, elke afspraak had de overhand. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0.28582606, "_source": {"title": "Weerzinwekkende vragen", "random_text ":" Weerzinwekkende vragen stelden hem weinig uitgebreide steun. " }}]}}

Zoals we kunnen zien, zijn we op zoek naar "Hem vertrek" en we krijgen twee resultaten met verschillende scores. Het eerste resultaat is duidelijk omdat de tekst de uitgevoerde zoekopdracht erin bevat en zoals we kunnen zien, hebben we de score van 1.4513469.

Het tweede resultaat wordt opgehaald omdat het doeldocument het woord "hem" bevat.

Standaard sorteert ElasticSearch overeenkomende resultaten op hun relevantiescore, dat wil zeggen op hoe goed elk document overeenkomt met de zoekopdracht. Merk op dat de score van het tweede resultaat klein is ten opzichte van de eerste treffer, wat duidt op een lagere relevantie.

6. Fuzzy zoeken

Fuzzy matching behandelt twee woorden die "vaag" op elkaar lijken alsof ze hetzelfde woord zijn. Ten eerste moeten we definiëren wat we bedoelen met vaagheid.

Elasticsearch ondersteunt een maximale bewerkingsafstand, gespecificeerd met de fuzziness-parameter, van 2. De fuzziness-parameter kan worden ingesteld op AUTO, wat resulteert in de volgende maximale bewerkingsafstanden:

  • 0 voor strings van één of twee karakters
  • 1 voor reeksen van drie, vier of vijf tekens
  • 2 voor strings van meer dan vijf tekens

misschien vindt u een bewerkingsafstand van 2 retourneert resultaten die niet gerelateerd lijken te zijn.

U krijgt mogelijk betere resultaten en betere prestaties met een maximale vaagheid van 1. Afstand verwijst naar de Levenshtein-afstand die een string-metriek is voor het meten van het verschil tussen twee reeksen. Informeel is de levenshteinafstand tussen twee woorden het minimumaantal bewerkingen van één teken.

Oké, laten we onze zoekopdracht vaag uitvoeren:

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

En hier is het resultaat:

{"takes": 88, "timed_out": false, "_shards": {"total": 5, "successvol": 5, "failed": 0}, "hits": {"total": 4, "max_score ": 1.5834423," hits ": [{" _index ":" text "," _type ":" article "," _id ":" 4 "," _score ": 1.4513469," _source ": {" title ":" Oude opvoeding "," random_text ":" Oude opvoeding, hij vertrok, elke afspraak had de overhand. " }}, {"_index": "text", "_type": "article", "_id": "2", "_score": 0.41093433, "_source": {"title": "Hij is tegen", "random_text ":" Hij verzet zich tegen een geworpen verlangen van nee. \ Aankondigende indruk onaangetast dag zijn onvoorwaardelijke toegeeflijkheid. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0.2876821, "_source": {"title": "Weerzinwekkende vragen", "random_text ":" Weerzinwekkende vragen stelden hem weinig uitgebreide steun. " }}, {"_index": "text", "_type": "article", "_id": "1", "_score": 0.0, "_source": {"title": "Hij ging", "random_text ":" Hij ging zo'n durf goed feit. De kleine eigen zeven geredde man leeftijd. " }}]}} '

Zoals we kunnen zien, geeft de wazigheid ons meer resultaten.

We moeten vaagheid zorgvuldig gebruiken, omdat het de neiging heeft om resultaten op te halen die er niet gerelateerd uitzien.

7. Conclusie

In deze korte tutorial hebben we ons geconcentreerd op het indexeren van documenten en het opvragen van Elasticsearch voor zoeken in volledige tekst, rechtstreeks via de REST API.

We hebben natuurlijk API's beschikbaar voor meerdere programmeertalen als dat nodig is, maar de API is nog steeds best handig en taalonafhankelijk.

Persistentie onderaan

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS