Rýchly úvod do fulltextového vyhľadávania pomocou elastického vyhľadávania

Perzistencia hore

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Prehľad

Fulltextové vyhľadávanie sa dotazuje a vykonáva lingvistické vyhľadávanie dokumentov. Zahŕňa jedno alebo viac slov alebo fráz a vracia dokumenty, ktoré zodpovedajú podmienkam vyhľadávania.

ElasticSearch je vyhľadávací nástroj založený na Apache Lucene, bezplatnej a softvérovej knižnici na získavanie informácií otvoreného zdroja. Poskytuje distribuovaný fulltextový vyhľadávací modul s webovým rozhraním HTTP a dokumentmi JSON bez schémy.

Tento článok skúma rozhranie ElasticSearch REST API a demonštruje základné operácie iba pomocou požiadaviek HTTP.

2. Inštalácia

Ak chcete nainštalovať ElasticSearch na svoj počítač, pozrite si oficiálneho sprievodcu nastavením.

Rozhranie RESTfull API beží na porte 9200. Vyskúšajme si, či funguje správne, pomocou nasledujúceho príkazu curl:

curl -XGET '// localhost: 9200 /'

Ak spozorujete nasledujúcu odpoveď, inštancia je správne spustená:

{"name": "NaIlQWU", "cluster_name": "elasticsearch", "cluster_uuid": "enkBkWqqQrS0vp_NXmjQMQ", "verzia": {"number": "5.1.2", "build_hash": "c8c4c16", "build_date" ":" 2017-01-11T20: 18: 39.146Z "," build_snapshot ": false," lucene_version ":" 6.3.0 "}," tagline ":" Viete, na vyhľadávanie "}

3. Indexovanie dokumentov

ElasticSearch je orientovaný na dokumenty. Ukladá a indexuje dokumenty. Indexovanie vytvára alebo aktualizuje dokumenty. Po indexovaní môžete prehľadávať, triediť a filtrovať celé dokumenty, nie riadky stĺpcových údajov. Toto je zásadne odlišný spôsob uvažovania o dátach a je to jeden z dôvodov, prečo môže ElasticSearch vykonávať komplexné fulltextové vyhľadávanie.

Dokumenty sú reprezentované ako objekty JSON. Serializácia JSON je podporovaná väčšinou programovacích jazykov a stala sa štandardným formátom používaným hnutím NoSQL. Je jednoduchý, stručný a ľahko sa číta.

Na vykonanie nášho fulltextového vyhľadávania použijeme nasledujúce náhodné položky:

{"title": "Šiel", "random_text": "Šiel si tak trúfalo, dobrý fakt. Malý vlastný zachránený vek je sedem rokov." } {"title": "Odporuje", "random_text": "Odporuje vrhnutej túžbe po nie. \ Oznamujúci dojem v nedotknutý deň sú bezvýhradným pôžitkom." } {"title": "Odpudivé otázky", "random_text": "Odpudivé otázky ho obsahovali len málokrát." } {"title": "Staré vzdelanie", "random_text": "Staré vzdelanie zvíťazilo bez ohľadu na usporiadanie." }

Predtým, ako budeme môcť indexovať dokument, musíme sa rozhodnúť, kam ho uložíme. Je možné, že máte viac indexov, ktoré zase obsahujú viac typov. Tieto typy obsahujú viac dokumentov a každý dokument má viac polí.

Budeme ukladať naše dokumenty podľa nasledujúcej schémy:

text: Názov indexu.

článok: Názov typu.

id: ID tohto konkrétneho príkladu zadávania textu.

Pre pridanie dokumentu spustíme nasledujúci príkaz:

curl -XPUT 'localhost: 9200 / text / article / 1? pretty' -H 'Content-Type: application / json' -d '{"title": "Šiel", "random_text": "Šiel tak dobre, odvážil sa dobre fakt. Malý vlastný sedem zachránený muž starne. “ } '

Tu používame id = 1, môžeme pridať ďalšie položky pomocou rovnakého príkazu a zvýšeného id.

4. Vyberanie dokumentov

Po pridaní všetkých našich dokumentov môžeme skontrolovať, koľko dokumentov máme pomocou nasledujúceho príkazu v klastri:

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

Dokument môžeme získať aj pomocou jeho id pomocou nasledujúceho príkazu:

curl -XGET 'localhost: 9200 / text / článok / 1? pekný' 

Z elastického vyhľadávania by sme mali dostať nasledujúcu odpoveď:

{"_index": "text", "_type": "article", "_id": "1", "_version": 1, "found": true, "_source": {"title": "Šiel" , "random_text": "Išiel si tak trúfalo, dobrý fakt. Malý vlastný sedem zachránený muž vek." }}

Ako vidíme, táto odpoveď zodpovedá záznamu pridanému pomocou id 1.

5. Dopytovanie dokumentov

Dobre, poďme vykonať fulltextové vyhľadávanie pomocou nasledujúceho príkazu:

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

Získame nasledujúci výsledok:

{"takes": 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 ":" Staré vzdelávanie "," random_text ":" Staré vzdelávanie zvíťazilo nad tým, čo zariadil. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0,28582606, "_source": {"title": "odpudivé otázky", "random_text" ":" Odporivé otázky ho uspokojili s niekoľkými rozsiahlymi podporami. " }}]}}

Ako vidíme, hľadáme „Jeho odchod“ a dostaneme dva výsledky s rôznymi skóre. Prvý výsledok je zrejmý, pretože text má v sebe vykonané hľadanie a ako vidíme, máme skóre 1.4513469.

Získa sa druhý výsledok, pretože cieľový dokument obsahuje slovo „on“.

ElasticSearch predvolene triedi zodpovedajúce výsledky podľa skóre relevancie, to znamená podľa toho, ako dobre sa každý dokument zhoduje s dotazom. Upozorňujeme, že skóre druhého výsledku je malé v porovnaní s prvým zásahom, čo naznačuje nižšiu relevanciu.

6. Fuzzy vyhľadávanie

Fuzzy párovanie zaobchádza s dvoma slovami, ktoré sú „plynulé“ podobné, akoby išlo o to isté slovo. Najprv si musíme definovať, čo máme na mysli pod pojmom fuzziness.

Elasticsearch podporuje maximálnu vzdialenosť úprav zadanú parametrom fuzziness na 2. Parameter fuzziness je možné nastaviť na AUTO, čo má za následok nasledujúce maximálne vzdialenosti úprav:

  • 0 pre reťazce s jedným alebo dvoma znakmi
  • 1 pre reťazce s tromi, štyrmi alebo piatimi znakmi
  • 2 pre reťazce s viac ako piatimi znakmi

možno zistíte, že vzdialenosť úprav z 2 vráti výsledky, ktoré zjavne nesúvisia.

Môžete dosiahnuť lepšie výsledky a lepší výkon s maximálnou neurčitosťou 1. Vzdialenosť sa vzťahuje na vzdialenosť Levenshtein, ktorá je metrikou reťazca na meranie rozdielu medzi dvoma sekvenciami. Levenshteinova vzdialenosť medzi dvoma slovami je neformálny minimálny počet úprav s jedným znakom.

Dobre, poďme vykonať naše vyhľadávanie s neurčitosťou:

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

A tu je výsledok:

{"takes": 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 ":" Stará výchova "," random_text ":" Stará výchova zvíťazila nad tým, čo zariadil. " }}, {"_index": "text", "_type": "article", "_id": "2", "_score": 0.41093433, "_source": {"title": "Proti", "random_text" ":" Oponuje proti vrhnutej túžbe po nie. \ Oznamujúci dojem, že v deň, keď bude ovplyvnený, je bezvýhradným pôžitkom. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0.2876821, "_source": {"title": "Odporné otázky", "random_text" ":" Odporivé otázky ho uspokojili s niekoľkými rozsiahlymi podporami. " }}, {"_index": "text", "_type": "article", "_id": "1", "_score": 0.0, "_source": {"title": "Šiel", "random_text" ":" Išiel taký odvážny dobrý fakt. Malý vlastný sedem zachránený muž vek. " }}]}} '

Ako vidíme, rozmazanosť nám dáva ďalšie výsledky.

Fuzziness musíme používať opatrne, pretože má tendenciu získavať výsledky, ktoré vyzerajú ako nesúvisiace.

7. Záver

V tomto rýchlom výučbe sme sa zamerali na indexovanie dokumentov a dopytovanie na server Elasticsearch pre fulltextové vyhľadávanie priamo prostredníctvom rozhrania REST API.

Máme samozrejme k dispozícii API pre viac programovacích jazykov, keď to potrebujeme - ale API je stále celkom pohodlné a jazykovo agnostické.

Perzistencia dno

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

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