Ang Elasticsearch ay isang search engine na may json rest api, gamit ang Lucene at nakasulat sa Java. Ang isang paglalarawan ng lahat ng mga pakinabang ng engine na ito ay magagamit sa opisyal na website. Sa mga sumusunod ay tutukuyin natin ang Elasticsearch bilang ES.
Ang mga katulad na makina ay ginagamit para sa mga kumplikadong paghahanap sa isang database ng dokumento. Halimbawa, paghahanap na isinasaalang-alang ang morpolohiya ng wika o paghahanap sa pamamagitan ng geo coordinates.
Sa artikulong ito ay magsasalita ako tungkol sa mga pangunahing kaalaman ng ES gamit ang halimbawa ng pag-index ng mga post sa blog. Ipapakita ko sa iyo kung paano mag-filter, mag-sort at maghanap ng mga dokumento.
Upang hindi umasa sa operating system, gagawin ko ang lahat ng mga kahilingan sa ES gamit ang CURL. Mayroon ding isang plugin para sa google chrome na tinatawag kahulugan.
Ang teksto ay naglalaman ng mga link sa dokumentasyon at iba pang mga mapagkukunan. Sa dulo mayroong mga link para sa mabilis na pag-access sa dokumentasyon. Ang mga kahulugan ng hindi pamilyar na mga termino ay matatagpuan sa glossaries.
Pag-install ng ES
Upang gawin ito, kailangan muna namin ng Java. Mga developer magrekomenda i-install ang mga bersyon ng Java na mas bago kaysa sa Java 8 update 20 o Java 7 update 55.
Awtomatikong nilikha ang ES index blog at uri ng post. Maaari tayong gumuhit ng isang kondisyon na pagkakatulad: ang isang index ay isang database, at ang isang uri ay isang talahanayan sa database na ito. Ang bawat uri ay may sariling scheme β paggawa ng mga mapa, parang relational table lang. Awtomatikong nabubuo ang pagmamapa kapag na-index ang dokumento:
# ΠΠΎΠ»ΡΡΠΈΠΌ mapping Π²ΡΠ΅Ρ ΡΠΈΠΏΠΎΠ² ΠΈΠ½Π΄Π΅ΠΊΡΠ° blog
curl -XGET "$ES_URL/blog/_mapping?pretty"
Sa tugon ng server, idinagdag ko ang mga halaga ng mga patlang ng na-index na dokumento sa mga komento:
Mahalagang tandaan na ang ES ay hindi nag-iiba sa pagitan ng isang halaga at isang hanay ng mga halaga. Halimbawa, ang field ng pamagat ay naglalaman lamang ng isang pamagat, at ang field ng mga tag ay naglalaman ng isang hanay ng mga string, bagama't ang mga ito ay kinakatawan sa parehong paraan sa pagmamapa.
Pag-uusapan pa natin ang tungkol sa pagmamapa mamaya.
kahilingan
Pagkuha ng dokumento sa pamamagitan ng id nito:
# ΠΈΠ·Π²Π»Π΅ΡΠ΅ΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ Ρ id 1 ΡΠΈΠΏΠ° post ΠΈΠ· ΠΈΠ½Π΄Π΅ΠΊΡΠ° blog
curl -XGET "$ES_URL/blog/post/1?pretty"
Ang mga bagong key ay lumitaw sa tugon: _version ΠΈ _source. Sa pangkalahatan, ang lahat ng mga susi ay nagsisimula sa _ ay inuri bilang opisyal.
Key _version ipinapakita ang bersyon ng dokumento. Ito ay kinakailangan para gumana ang optimistic locking mechanism. Halimbawa, gusto naming baguhin ang isang dokumento na may bersyon 1. Isusumite namin ang binagong dokumento at isinasaad na isa itong pag-edit ng dokumentong may bersyon 1. Kung may ibang nag-edit ng dokumentong may bersyon 1 at nagsumite ng mga pagbabago bago sa amin, pagkatapos Hindi tatanggapin ng ES ang ating mga pagbabago, dahil iniimbak nito ang dokumento na may bersyon 2.
Key _source naglalaman ng dokumentong na-index namin. Hindi ginagamit ng ES ang halagang ito para sa mga operasyon sa paghahanap dahil Ginagamit ang mga index para sa paghahanap. Para makatipid ng espasyo, nag-iimbak ang ES ng naka-compress na source na dokumento. Kung kailangan lang namin ang id, at hindi ang buong source na dokumento, maaari naming i-disable ang source storage.
Kung hindi namin kailangan ng karagdagang impormasyon, makukuha lang namin ang mga nilalaman ng _source:
Pinili namin ang huling post. size nililimitahan ang bilang ng mga dokumentong ibibigay. total ipinapakita ang kabuuang bilang ng mga dokumentong tumutugma sa kahilingan. sort sa output ay naglalaman ng isang hanay ng mga integer kung saan isinasagawa ang pag-uuri. Yung. ang petsa ay na-convert sa isang integer. Higit pang impormasyon tungkol sa pag-uuri ay matatagpuan sa dokumentasyon.
Mga filter at query
Sa halip, ang ES mula noong bersyon 2 ay hindi nakikilala sa pagitan ng mga filter at query ipinakilala ang konsepto ng mga konteksto.
Ang konteksto ng query ay naiiba sa konteksto ng filter dahil ang query ay bumubuo ng isang _score at hindi naka-cache. Ipapakita ko sa iyo kung ano ang _score mamaya.
I-filter ayon sa petsa
Ginagamit namin ang kahilingan saklaw sa konteksto ng filter:
Gayunpaman, kung hahanapin namin ang "mga kuwento" sa field ng nilalaman, wala kaming mahanap, dahil Ang index ay naglalaman lamang ng mga orihinal na salita, hindi ang kanilang mga stems. Upang makagawa ng mataas na kalidad na paghahanap, kailangan mong i-configure ang analyzer.
Field _score nagpapakita kaugnayan. Kung ang kahilingan ay isinasagawa sa isang konteksto ng filter, ang halaga ng _score ay palaging magiging katumbas ng 1, na nangangahulugang isang kumpletong tugma sa filter.
Mga Analyzer
Mga Analyzer ay kinakailangan upang i-convert ang pinagmulang teksto sa isang hanay ng mga token.
Ang mga analyzer ay binubuo ng isa Tokenizer at ilang opsyonal Mga TokenFilter. Ang Tokenizer ay maaaring maunahan ng ilan CharFilters. Hinahati ng mga tokenizer ang source string sa mga token, gaya ng mga puwang at mga bantas na character. Ang TokenFilter ay maaaring magpalit ng mga token, magtanggal o magdagdag ng mga bago, halimbawa, iwanan lamang ang stem ng salita, alisin ang mga preposisyon, magdagdag ng mga kasingkahulugan. CharFilter - binabago ang buong string ng pinagmulan, halimbawa, pinuputol ang mga html tag.
Samantalahin natin api at tingnan natin kung paano binago ng mga standard at russian analyzer ang string na "Nakakatawang kwento tungkol sa mga kuting":
Hinati ng karaniwang analyzer ang string sa pamamagitan ng mga puwang at ginawang lower case ang lahat, inalis ng russian analyzer ang mga hindi mahalagang salita, ginawa itong lower case at iniwan ang stem ng mga salita.
Tingnan natin kung aling Tokenizer, TokenFilters, CharFilters ang ginagamit ng russian analyzer:
Ilarawan natin ang aming analyzer batay sa Russian, na magpuputol ng mga html tag. Tawagin natin itong default, dahil isang analyzer na may ganitong pangalan ang gagamitin bilang default.
Una, ang lahat ng HTML tag ay aalisin mula sa source string, pagkatapos ay ang tokenizer standard ay hahatiin ito sa mga token, ang mga resultang token ay lilipat sa lower case, ang mga hindi gaanong mahalagang salita ay aalisin, at ang natitirang mga token ay mananatiling stem ng salita.
Paglikha ng Index
Sa itaas ay inilarawan namin ang default na analyzer. Malalapat ito sa lahat ng mga patlang ng string. Ang aming post ay naglalaman ng isang hanay ng mga tag, kaya ang mga tag ay ipoproseso din ng analyzer. kasi Naghahanap kami ng mga post ayon sa eksaktong tugma sa isang tag, pagkatapos ay kailangan naming i-disable ang pagsusuri para sa field ng mga tag.
Gumawa tayo ng index blog2 na may analyzer at pagmamapa, kung saan hindi pinagana ang pagsusuri sa field ng mga tag:
Idagdag natin ang parehong 3 post sa index na ito (blog2). Aalisin ko ang prosesong ito dahil... ito ay katulad ng pagdaragdag ng mga dokumento sa index ng blog.
Buong paghahanap ng teksto na may suporta sa expression
kasi Gumagamit kami ng analyzer na may Russian stemming, pagkatapos ay ibabalik ng kahilingang ito ang lahat ng dokumento, bagama't naglalaman lamang ang mga ito ng salitang 'history'.
Ang kahilingan ay maaaring maglaman ng mga espesyal na character, halimbawa:
""fried eggs" +(eggplant | potato) -frittata"
Humiling ng syntax:
+ signifies AND operation
| signifies OR operation
- negates a single token
" wraps a number of tokens to signify a phrase for searching
* at the end of a term signifies a prefix query
( and ) signify precedence
~N after a word signifies edit distance (fuzziness)
~N after a phrase signifies slop amount
Kung interesado ka sa mga katulad na artikulo-aralin, may mga ideya para sa mga bagong artikulo, o may mga panukala para sa kooperasyon, pagkatapos ay ikalulugod kong makatanggap ng mensahe sa isang personal na mensahe o sa pamamagitan ng email [protektado ng email].