Slide 1

Slide 1 text

Elasticsearch at

Slide 2

Slide 2 text

SEIGO UCHIDA

Slide 3

Slide 3 text

!TQFTOPWB w ೥:BIPP+"1"/৽ଔೖࣾ w ೥݄8BOUFEMZʹδϣΠϯ w ޿ٛͷΠϯϑϥΛ୲౰ w $IFGͱ)VCPUͱ͔͕޷͖

Slide 4

Slide 4 text

!TQFTOPWB

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

γΰτͰίίϩΦυϧਓΛ;΍͢

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

8BOUFEMZ *OD w ೥݄ઃཱ w ΞϧόΠτɺΠϯλʔϯؚΊ໊ w ໊ͷΤϯδχΞ͕׆༂ w γΰτॆ࣮ԽΞϓϦ΍πʔϧͷఏڙ w ࣾɺਓ͕࢖͏

Slide 10

Slide 10 text

ੵۃ࠾༻த https://www.wantedly.com/projects/5106

Slide 11

Slide 11 text

WantedlyͰESΛ ͲͷΑ͏ʹ࢖͍ͬͯΔͷ͔

Slide 12

Slide 12 text

ݕࡧର৅ w γΰτ w ձࣾ w Ϣʔβ

Slide 13

Slide 13 text

γΰτ w ձ໊ࣾ w ۈ຿஍ w ࣾһ਺

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

ืू w ืू໊ w ืूৄࡉ w ืू৬छ

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

Ϣʔβ w Ϣʔβ໊ w ࣗݾ঺հจ w ͦͷଞ͍Ζ͍Ζʢޙड़ʣ

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

ΠϯσοΫε w ௨ৗͷݕࡧ༻ΠϯσοΫε w "VUPDPNQMFUF༻ΠϯσοΫε

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

λΠϓ w γΰτλΠϓ w ձࣾλΠϓ w ϢʔβʔλΠϓ

Slide 22

Slide 22 text

௨ৗͷݕࡧ༻ΠϯσοΫε w υΩϡϝϯτ਺ɿ໿ສ w ϓϥΠϚϦαΠζɿ໿(#

Slide 23

Slide 23 text

"VUPDPNQMFUF༻ΠϯσοΫε w υΩϡϝϯτ਺ɿ໿ສ w ϓϥΠϚϦαΠζɿ໿(#

Slide 24

Slide 24 text

ߏ੒ w 3BJMTPO)FSPLV w &MBTUJDTFBSDIPO&$ w 1PTUHSFTRMPO3%4

Slide 25

Slide 25 text

FMBTUJDTFBSDISVCZ w UJSF͸ϝϯς͕ऴྃ w TFBSDILJDL͸UJSFʹґଘ w ެࣜHFNΛ࢖͏ͷ͕༨ܭͳ੍ݶ͕ͳ ͯ͘ྑ͍

Slide 26

Slide 26 text

Ϋϥελ w &$NTNBMMº୆ w $IFGͰ؅ཧ w +7.ׂ౰.&.ɿ౥ࡌ.&.

Slide 27

Slide 27 text

ར༻ϓϥάΠϯ w )FBE w )2ʢ/PEF%JBHOPTUJDT΍4UBUT֬ೝʹར༻ʣ w .BSWFM TFOTFͰΫΤϦ࡞੒ʹར༻ʣ ։ൃ؀ڥ ͷΈʣ w ,VSPNPKJ w *ORVJTJUPSʢ"OBMZ[FSͷڍಈ֬ೝʣ

Slide 28

Slide 28 text

Ͳ͏΍ֶͬͯΜ͔ͩ

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

ެࣜϦϑΝϨϯε w ඞཁͳ͜ͱ͸ॻ͍ͯ͋Δɺؾ͕͢Δ w ΫΤϦͷྫ͕෦෼తʹॻ͔Ε͍ͯͯࠔΔ w ݕࡧॳ৺ऀʹ͸શମ૾͕͔ͭΈͮΒ͍ w Ͱ΋ಡΜͩ

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

&MBTUJDTFBSDI8PSLTIPQ w શମ૾Λ௫Έͭͭɺ࣮ࡍʹ৮ΔͷͰΠ ϝʔδ͕௫Ίͨ w IUUQTTQFBLFSEFDLDPNEBEPPOFUFMBTUJDTFBSDIXPSLTIPQ

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

&MBTUJDTFBSDIνϡʔτϦΞϧ w ༻ޠɺશମ૾͕௫Έ΍͍͢ w ίϯςΩετ͕͋Γ࣮ફత w IUUQDPEFIBUFOBCMPHDPNFOUSZ

Slide 35

Slide 35 text

͜ͷຊ͕΋ͬͱૣ͘ग़ͯΕ͹ʜ

Slide 36

Slide 36 text

ۤ࿑ͨ͠ͱ͜Ζ

Slide 37

Slide 37 text

Ϣʔβʔݕࡧ w ϓϩϑΟʔϧ߲໨͕ଟ͍ w ֤߲໨ຖʹϓϥΠόγʔϨϕϧ ͕͋Δ w NBQQJOH΋RVFSZ΋ෳࡶʹ

Slide 38

Slide 38 text

Ͳ͏΍ͬͯ ES Ͱ ACL Λ࣮ݱͯ͠Δ͔ w ྫ͑͹ɺϓϩϑΟʔϧͷʮ໊લʯʮॴଐʯʮॴ ࡏ஍ʯΛجຊ৘ใͷηοτͱͯ͠ϓϥΠόγʔ ϨϕϧʮҰൠެ։ʯͱ͍ͯͨ͠ͱ͢Δ w ࠷ॳ͸/FTUFEEPDVNFOUΛ࢖ͬͯදݱ͠ ͍ͯͨ

Slide 39

Slide 39 text

"properties": {! "basic_privacy": {! "type": "nested"! },! "properties": {! "name": {! "type": "string"! },! "working_for": {! "type": "string"! },! "location": {! "type": "string"! },! "privacy_level": {! "type": "string"! }! }! }! mapping

Slide 40

Slide 40 text

Ͳ͏΍ͬͯ ES Ͱ ACL Λ࣮ݱͯ͠Δ͔ w ͔͠͠ɺ/FTUFEͩͱͰ͖ͳ͍͜ͱʢϋΠϥΠτͳͲʣ ͕ग़ͯ͘ΔͷͰϑϥοτͳߏ଄ͰɺϓϥΠόγʔϨϕ ϧΛදݱ w ܕ@σʔληοτ@@ϓϩύςΟͷΑ͏ʹϚοϐ ϯά w ࠷ॳͷܕ͕ඞཁͳͷ͸ɺEBUF΍JOUFHFSͳͲ TUSJOHҎ֎ʹTJNQMF@RVFSZΛ࢖͏ͱFSSPSͱͳΔͨ Ί

Slide 41

Slide 41 text

mapping query {! "query": {! "simple_query_string": {! "query": ,! "fields": ["s_basic__*"],! "default_operator": "and"! }! }! },! "filter": {! "term": {! "basic_privacy": ! }! }! }! "properties": {! "basic_privacy": {! "type": "string"! },! "s_basic__name": {! "type": "string"! },! "s_basic__working_for": {! "type": "string"! },! "s_basic__location": {! "type": "string"! }! }!

Slide 42

Slide 42 text

Ͳ͏΍ͬͯ ES Ͱ ACL Λ࣮ݱͯ͠Δ͔ w ݁ՌతʹɺOFTUFEΛ࢖Θ͟ΔΛಘͳ͍৔໘ ͕ग़ͯདྷͯϑϥοτͳϓϩύςΟͱOFTUFE Λซ༻͍ͯ͠Δ͕ɺࠓճ͸ͦ͜͸লུ

Slide 43

Slide 43 text

࣭໰λΠϜ

Slide 44

Slide 44 text

4PMS΍$MPVETFBSDI΋ධՁ্ͨ͠Ͱ &4ʹͨ͠ͷ͔ w ʮ༑ୡͱͷܨ͕ΓʯΛՃຯͯ͠ݕࡧͰ͖Δ͔ͱ͍͏͜ͱͰɺάϥϑ %#ͷ/FPKͱҰൠతͳݕࡧͱͯ͠&4Λൺֱͯ͠ɺ&4ͷํ͕அ વύϑΥʔϚϯε͕ྑ͔ͬͨ w 4PMSʹ͍ͭͯ͸4PMSϢʔβ͔Βࠓ͔Β࢖͏ͳΒ&4ͱ͍͏࿩Λฉ͍ ͍ͯͨ w ར༻Ϣʔβʢ(JU)VC GPVSTRVBSF 4PVOE$MPVEͳͲʣ΋ࢀߟʹ͠ ͨ w ݁Ռతʹɺ4PMSʹͳ͍OFTUFE QBSFOUDIJMEEPDVNFOUΛ࢖ͬͯ ͍ΔͷͰ&4Ͱྑ͔ͬͨ

Slide 45

Slide 45 text

։ൃ؀ڥͰ&4Λ࢖͏ͱ NBQQJOHͳͲόϥόϥͰਏ͘ͳΒͳ͍͔ w #PPUTUSBQεΫϦϓτͱ͍͏΋ͷΛ༻ҙͯ͠HJUDMPOFޙ ͷηοτΞοϓʢMPDBMʹ&4ΛೖΕΔͳͲʣΛࣗಈԽ͠ ͍ͯΔ w .BQQJOH΍υΩϡϝϯτͷ௥Ճ΋ηοτΞοϓεΫϦϓ τΛ༻ҙͯ͠ɺϝϯόʔ͝ͱͷ؀ڥͷࠩ෼͕ग़ͳ͍Α͏ʹ ͍ͯ͠Δ

Slide 46

Slide 46 text

! #! # Check for Elasticsearch! #! if test ! $(which elasticsearch)! then! echo " x You need to install ElasticSearch:"! echo " + Installing Elasticsearch..."! brew install elasticsearch! else! echo " + ElasticSearch found."! fi! ! #! # Check for Elasticsearch version! #! ES_VERSION=$(elasticsearch -v | cut -d' ' -f2 | cut -d'.' -f1)! if test ! $ES_VERSION -eq 1! then! echo " x You need to upgrade elasticsearch."! brew upgrade elasticsearch! else! echo " + Your Elasticsearch version is correct."! fi! ! if test -d /usr/local/var/lib/elasticsearch/plugins/marvel! then! echo " + Elasticsearch Plugin Marvel found."! else! echo " + Installing Elasticsearch Plugins Marvel"! plugin --install elasticsearch/marvel/latest! fi! bootstrap script Ұ෦ൈਮ $ script/bootstrap! ! Wantedly! ! γΰτͰίίϩΦυϧਓΛ;΍͢! ! + Your Elasticsearch version is correct.! + ElasticSearch Plugin HQ found.! + ElasticSearch Plugin head found.! + ElasticSearch Plugin Kuromoji found.! + ElasticSearch Plugin Inquisitor found.! + ElasticSearch Plugin Marvel found.! ! Good work. We're ready.! ! Run 'elasticsearch' to start elasticsearch.! And you can see elasticsearch webui plugins 'locahost:9200/_plugin/head/'! ࣮ߦ݁Ռ γϯϓϧͳγΣϧεΫϦϓτɻelasticsearch ΍ϓϥάΠϯ͕Πϯετʔϧ͞ΕͯΔ ͔ΛνΣοΫͯ͠͞Εͯͳ͍ͳΒΠϯετʔϧ͢Δɻ ʢ࣮ࡍͷεΫϦϓτͰ͸ elasticsearch Ҏ֎ͷηοτΞοϓ΋΍ͬͯΔʣ

Slide 47

Slide 47 text

elasticsearch-ruby Λ࢖ͬͨ setup script ྫ class ES! def self.client! @client ||= Elasticsearch::Client.new({! url: ES.url,! log: true! })! end! end! ! ES.client.indices.create({! index: "index_name",! body: {! settings: {! analysis: {! filter: {! ...! },! tokenizer: {! ...! },! analyzer: {! ...! }! }! }! }! })! ! ES.client.indices.put_mapping({! index: “index_name”,! type: 'user',! body: {! company: {! _id: { path: 'id' },! _timestamp: { enabled: true, path: 'updated_at', store: true },! _source: { enabled: true },! _all: { enabled: true, analyzer: 'kuromoji_analyzer' },! properties: {! name: { type: 'string', store: true, index: 'analyzed', analyzer: 'kuromoji_analyzer' },! . . .! }! }! }! })! ! ! User.find_in_batches do |users|! body = users.map do |user|! {! index: {! _index: "index_name",! _type: 'user',! _id: user.id,! data: user.elasticsearch_data,! }! }! end! ES.client.bulk body: body! end!

Slide 48

Slide 48 text

εΩʔϚมߋ࣌ʹαʔϏεʹӨڹΛ༩͑ͳ͍Α͏ɺ Ͳ͏ΫϥελΛߋ৽ͯ͠Δ͔ w #MVF(SFFO%FQMPZNFOUΈ͍ͨͳ͜ͱ ʢ࣮ࡍ͸৭ʣΛ΍͍ͬͯΔ

Slide 49

Slide 49 text

blue-es.wantedly.com blue-es-elb Nginx + ES Nginx + ES blue-es-cluster green-es.wantedly.com green-es-elb Nginx + ES Nginx + ES green-es-cluster چεΩʔϚ ৽εΩʔϚ

Slide 50

Slide 50 text

&4ͷ#MVF(SFFO%FQMPZNFOU w CMVFFTFMC HSFFOFTFMCͷΑ͏ʹ&-# αϒυϝΠϯΛͭ༻ҙ͓ͯ͘͠ w $IFGͰlFMBTUJDTFBSDISPMF lHSFFOzFOWJSPONFOUͱͯ͠&4αʔόΛߏ ங͢ΔͱɺΫϥελϦϯάɺ&-# HSFFOFTFMC ΁ͷొ࿥·ͰࣗಈͰηοτ Ξοϓ͞ΕΔΑ͏ʹͯ͠Δɻ෼͘Β͍ɻ w ࣾ಺ϝϯόʔͷΈΞΫηεՄೳͳ؀ڥʹ࠷৽ͷ3BJMTΞϓϦʢ&4ͷ .BQQJOHΛؚΉʣΛσϓϩΠޙɺ͔ͦ͜ΒHSFFOFTDMVTUFSʹ৽εΩʔϚ ͷΠϯσοΫε࡞੒ɺυΩϡϝϯτ௥ՃΛߦ͏ w Ϋϥελʹσʔλ͕ೖͬͨΒɺຊ൪؀ڥͷ3BJMT΋࠷৽ʹͨ͠ޙɺ3BJMT͔Β ར༻͢Δ&4ͷΤϯυϙΠϯτʢ؀ڥม਺Ͱઃఆ͍ͯ͠ΔʣΛ੾Γସ͑ͯσϓ ϩΠ׬ྃ

Slide 51

Slide 51 text

ࠓޙͷ՝୊

Slide 52

Slide 52 text

ࠓޙͷ՝୊ w ύϑΥʔϚϯεͷ޲্ w ϢʔβʔݕࡧͷϋΠϥΠτ w ࣙॻ࢖͏ w ݕࡧਫ਼౓

Slide 53

Slide 53 text

͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ