Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ブログを支える技術
Search
Takashi Masuda
February 17, 2017
Technology
4.6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ブログを支える技術
社内勉強会の発表資料です。
https://tech.feedforce.jp/vue-elasticsearch.html
Takashi Masuda
February 17, 2017
More Decks by Takashi Masuda
See All by Takashi Masuda
マスタカネットの紹介 〜悠久なる変更履歴〜
masutaka
0
21
最近の情報収集方法 2025
masutaka
0
100
自分のブログをCloudFront+HerokuからCloud Runに移行した
masutaka
0
190
BigQuery経由で使うGoogleスプレッドシートのスキーマ管理
masutaka
0
380
本を聴く毎日を送っています
masutaka
0
120
ボッチLookML開発者兼データ整備人を連れてきたよ!
masutaka
0
150
ここがつらいよ普段使いのLinux
masutaka
0
390
4月から取り組んできたLookerの導入から実装までのお話
masutaka
0
200
HerokuでSidekiqを監視する方法を確立した
masutaka
0
670
Other Decks in Technology
See All in Technology
S3 Filesで挑む! 八戸せんべい汁の食べ頃問題
usanchuu
0
110
『SAR衛星データ解析入門』のご紹介とその応用
syuchimu
0
120
無理せず続ける、子育てエンジニアの学び
codmoninc
PRO
0
960
Temporal 最高!でも改めて「日付」について調べたら人類の負債すぎる件
riyaamemiya
0
170
Classmethod Company Deck
satoshi7
1
730
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
200
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
2
290
Benchmarking Disaggregated Serving on vLLM + Dynamo with a Real Coding-Agent Workload
nttcom
1
200
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
AIがコードを書く時代に、エンジニアは何で自分の価値を証明するのか / In an era where AI writes code how do engineers prove their value
carta_engineering
3
1.1k
大型犬好きによるPugの紹介
yamanoku
1
160
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
200
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
340
58k
Designing Powerful Visuals for Engaging Learning
tmiket
1
610
Building Applications with DynamoDB
mza
96
7.2k
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Being A Developer After 40
akosma
92
590k
Leo the Paperboy
mayatellez
10
2.4k
The Invisible Side of Design
smashingmag
301
52k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
500
We Are The Robots
honzajavorek
0
400
Writing Fast Ruby
sferik
630
63k
Odyssey Design
rkendrick25
PRO
2
880
Transcript
εϥΠυதͷॖURL (goo.gl) Speaker DeckରࡦͰ͢ɻ KeynoteͩͱURL͕ΫϦοΧϒϧʹͳΒͳ͍ͨΊɻ
͋ͷʰ̋̋Λࢧ͑Δٕज़ʱ͔Β10ϲ݄ https://goo.gl/XUlD4p
ύϫʔΞοϓͯ͠ؼͬͯࢀΓ·ͨ͠ʂ
̋̋̋Λࢧ͑Δٕज़ 2017.02.17 ૿ాو࢜(@masutaka) 1.5ഒʂ
̋ϩ̋Λࢧ͑Δٕज़ 2017.02.17 ૿ాو࢜(@masutaka)
̋ϩάΛࢧ͑Δٕज़ 2017.02.17 ૿ాو࢜(@masutaka)
ϒϩάΛࢧ͑Δٕज़ 2017.02.17 ૿ాو࢜(@masutaka)
https://masutaka.net/chalow/
࣮ԋ
None
ࠓճͷݕࡧͷΈ ਓ → search.masutaka.net → nginx → elasticsearch
ͬ͘͟Γઆ໌ • ϑϩϯτΤϯυ͔Βɺmasutaka.netʹ͋Δ ElasticsearchͷAPIΛୟ͍ͯϒϩάهࣄΛݕࡧ • ElasticsearchͷهࣄσʔλσϓϩΠͷͨͼʹ ߋ৽͞ΕΔ • ANDݕࡧͱNOTݕࡧ͚࣮ͩͨ͠
Ϟνϕʔγϣϯ
• ιʔγϟϧPLUSͷސ٬͚ϚχϡΞϧΛ HTMLԽͨ࣌͠ʹɺElasticsearchΛશจݕࡧ Τϯδϯͱͯ͑͠Δ͔ʁͷݕূ • ػೳͱ࣮͢͠͞ • ElasticsearchΛϩάͷՄࢹԽ͚ͩͰͳ ͘ɺશจݕࡧΤϯδϯͱ͍͍ͯͨ͠
ͦͦ ϚελΧωοτͱ https://masutaka.net
https://masutaka.net/chalow/
• ͘͞ΒͷVPS্ͰࣗυϝΠϯΛӡ༻ • ٕज़ϝϞͷެ։ॴ • ֤छٕज़ͷ࣮ݧ • fluentd, Elasticsearch, Kibana,
BigQuery, http2, Mackerel, New Relic, Datadog, Vue.js,…
ߏਤ
σϓϩΠ 1. GitHubͷmasterʹcommit͕Ճ͞ΕΔͱɺ CircleCI͕capistranoΛͬͯࣗಈσϓϩΠ 1. HTMLͷੜͱElasticsearchͷೖ 2. pushoverͰiPhoneʹ௨
• 1ͭͷʮChangeLogϝϞʯϑΝΠϧ͔ΒϒϩάΛੜ • chalowͱ͍͏PerlͷHTMLδΣωϨʔλΛΧελ ϚΠζ • 2001-12-30͔Βॻ͖࢝Ίͨ • 2008-09-25ʹWebαΠτͱͯ͠ެ։ •
2009-05-17͔Βmasutaka.netͱͯ͠Քಇத • 2017-02-17ݱࡏɺ37,268ߦ 1,245هࣄ http://chalow.org
ϚελΧͷChangeLogϝϞʢ࣮ମʣ
ChangeLogϝϞͱ
• Unix Magazine 20021݄߸ʰUnixͷϝϞٕज़ʱͰੈʹΒ ΕΔ • ChangeLogܗࣜΛ࠾༻ͨ͠1ͭͷςΩετϑΝΠϧ • ใ͕1ͭͷϑΝΠϧʹ·ͱ·Δɻϙέοτ1ͭݪଇ •
৽͍͠ϝϞඞͣҰ൪্ʹͳΔͨΊɺཧͷඞཁ͕ͳ ͍ • ςΩετϑΝΠϧͳͷͰɺ͍׳ΕͨΤσΟλͰૉૣ͘ ฤूͰ͖ΔɻকདྷʹͬͯσʔλͷҠߦΛ৺͢Δඞ ཁͳ͍ http://0xcc.net/unimag/1/
ͲͷΑ͏ʹ࣮͔ͨ͠
࠾༻ͨ͠πʔϧ • Vue.js-2.1.10 + axios-0.15.3 • nginx-1.11.3 • Elasticsearch-5.1.1 •
Oga-2.8
JavaScript • ҙ֎ͱΔ͜ͱ͕ଟ͔ͬͨ • FlameworkʢVue.jsʣ • HTTP request with Ajaxʢaxiosʣ
• ݕࡧΫΤϦΈཱͯʢࣗલʣ • Paginationʢࣗલʣ • Routingʢࣗલʣ
• ർΕͨͷͰɺޙURL͚ͩͰࣦྱ͠·͢ • https://masutaka.net/chalow/search.html • https://masutaka.net/chalow/search.js
ElasticsearchͷݕࡧΫΤϦ https://www.elastic.co/guide/en/elasticsearch/reference/5.1/ query-dsl-bool-query.html https://goo.gl/WVxFGo
“ָ͍͠” { "query": { "bool": { "should": [ { "term":
{ "title": "ָ͍͠" } }, { "term": { "body": "ָ͍͠" } } ], "minimum_should_match": 1 } } } OR هࣄλΠτϧ هࣄຊจ
“ָ͍͠ emacs” { "query": { "bool": { "must": [ {
"bool": { "should": [ { "term": { "title": "ָ͍͠" } }, { "term": { "body": "ָ͍͠" } } ], "minimum_should_match": 1 } }, { "bool": { "should": [ { "term": { "title": "emacs" } }, { "term": { "body": "emacs" } } ], "minimum_should_match": 1 } } ] } } } AND
ָ͍͠ -emacs { "query": { "bool": { "must": [ {
"bool": { "should": [ { "term": { "title": "ָ͍͠" } }, { "term": { "body": "ָ͍͠" } } ], "minimum_should_match": 1 } } ], "must_not": [ { "bool": { "should": [ { "term": { "title": "emacs" } }, { "term": { "body": "emacs" } } ], "minimum_should_match": 1 } } ] } } } NOT
nginxͷઃఆ upstream application-elasticsearch { server 0.0.0.0:9200; } server { listen
443 ssl http2; server_name search.masutaka.net; # (snip) location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers Content-Type; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_pass http://application-elasticsearch/chalow/article/_search; } } ElasticsearchΛ·Δ͝ͱެ։ ͍ͯ͠ͳ͍͔Βେৎͩ ͱࢥ͏ɻ
kuromoji pluginͷΠϯετʔϧ $ cd /usr/share/elasticsearch $ sudo bin/elasticsearch-plugin install analysis-kuromoji
$ sudo service elasticsearch restart
ςϯϓϨʔτͷೖ $ curl -X PUT 'http://localhost:9200/_template/chalow' -d ' { "template"
: "chalow", "settings": { "index": { "analysis": { "tokenizer": { "kuromoji_user_dict": { "type": "kuromoji_tokenizer", "mode": "search" } } } } }, "mappings": { "article": { "properties": { "title": { "type": "string", "analyzer": "kuromoji", "fielddata": true, "fields": { "keyword": { "type": "keyword" } } }, "body": { "type": "string", "analyzer": "kuromoji", "fielddata": true, "fields": { "keyword": { "type": "keyword" } } } } } } } '
هࣄσʔλͷೖ #!/bin/sh -eu TMP_JSON=chalow-es.json ES_URL=http://localhost:9200 ./script/html2json > $TMP_JSON curl -s
-X DELETE $ES_URL/chalow curl -s -X POST $ES_URL/_bulk --data-binary @$TMP_JSON > /dev/null ※ σϓϩΠ࣌ʹ࣮ߦ͞ΕΔɻ./script/html2jsonOga gemΛͬͯHTMLͳهࣄΛύʔ ε͠ɺElasticsearch Bulk POSTͷͨΊͷjsonΛ࡞Δɻίʔυ https://goo.gl/atnXVm
None
Vue.jsͱͷग़ձ͍ • ReactɺAngularʹͳ͡Ίͳ ͔ͬͨʹखΛࠩ͠৳ ͯ͘ΕͨVue.js - Qiita [^1] • ࢲͨͪͳͥReactͰͳ
͘Vue.jsΛબΜͩͷ͔ | ϓ ϩάϥϛϯά | POSTD [^2] [^1]: https://goo.gl/kNE5If, [^2]: https://goo.gl/bB5Ej5
ྑ͍ͱ͜Ζ • ϋʔυϧͷ͞ • JSͷϏϧυڥΛߏஙͤͣʹ࢝ΊΒΕΔ • jQueryͰࢭ·͍ͬͯΔਓͰϦΞΫςΟϒϓ ϩάϥϛϯάΛ࢝ΊΒΕΔ • ຊޠΨΠυΛ1Εɺಈ͘ͷΛ࡞ΕΔ
https://goo.gl/mkDKpE
Elasticsearchʹอଘͨ͠ͱ͍͏ ͜ͱʁ
KibanaͰՄࢹԽग़དྷΔʂ
࣮ԋ
None
None
ࣗݾຬ͕ಘΒΕ·ͨ͠ɾɾɾʂ
݁ہͷͱ͜ΖɺElasticsearch ݕࡧʹ͑Δʁ
• ֶशίετߴ͍͕ɺݕࡧΤϯδϯͱͯ͠ ༏लͩͱࢥͬͨɻΓKuromoji͕σΧΠ • ॳظઃఆͰͦͦ͑͜͜ΔɻΘ͔ͪॻ͖ ͷνϡʔχϯάඞཁͦ͏ • όοΫΤϯυ͔Β͑ɺΞΫηεݖΛߟ ྀͨ͠ݕࡧͰ͖Δͣ •
ֶशίετߴ͍ͳʔʢΈʣ
ͱ͜ΖͰݕࡧͱ͍͑ʁ
None
Google Custom SearchͰ ࣮ͯ͠Έͨ
None
࣮ԋ
None
Google Custom Search • GoogleͷΤϯδϯΛͬͯɺҙͷαΠτΛݕࡧͰ͖ΔαʔϏε • GCP্͔ΒAPI KEYͱENGINE IDΛൃߦ͢Ε͑Δ •
ແྉͷར༻੍ݶ100 queries/day • https://goo.gl/DgHyop • ࠷ྉۚ100USDʢ20,000 queries/yearʣ • https://goo.gl/wdxEXx
ײ • ͕͢͞ੈք࠷ڧͷϚωʔδυݕࡧαʔϏε • GETϦΫΤετͰ؆୯ʹ͑ͨ • ͋ΕɺݸਓαΠτఔͳΒ͜ͷར༻੍ݶͰେৎ͔ • Elasticsearchͱҧͬͯɺࡉ͔ͳௐͰ͖ͳ͍ •
ϖʔδͷݕࡧίϯςϯπΛࢦఆ͢Δͱ͔
ճސ
͘Β͍͔Βߏ͕ݻ·Γ ࢝ΊΔ
(´-`).oO(Elasticsearch࠷৽ʹ͠ ͓͔ͯ͘)
https://goo.gl/hfXBZe
• ʗ(^o^)ʘ Elasticsearch 3ͷσʔλΛશ ͯϩετ • ʗ(^o^)ʘ ϚΠάϨʔγϣϯΨΠυʹ ै͍·͠ΐ͏ https://goo.gl/VY62Hh
(´-`).oO(SSLূ໌ॻʹ search.masutaka.netͷՃ͕ඞཁͩͳ)
https://goo.gl/liOdYN
• ʗ(^o^)ʘ StartSSL͕ೝূہͱͯ͠ऴΘͬ ͯͨɻ͔͠͠·ͩൢച͍ͯ͠Δͱ͍͏ҋ • ʗ(^o^)ʘ ࣝෆ͔Βແବʹ՝ۚͨ͠ • Let’s EncryptʹҠߦ
(´-`).oO(Vue.jsͷྑ͞ΛΠϯϑ ϥͷਓʹͬͯΒΘͶ)
ʗ(^o^)ʘ ̏िʹͬͯհ 1. հฤ 2. Ajaxฤ 3. jQueryͱͷҧ͍ฤ
(´-`).oO(ٱʑʹ͘͘ձʹ ग़ͯΈΔ͔)
None
• ʗ(^o^)ʘ ։ళ࣌ؒΛա͔͗ͯΒɺ߄ͨ ͩ͘͠ళͷਓ͕͖ͬͯͨɻ൪ͷਓ͕ ৸ʁ • ʗ(^o^)ʘ ॳΊͯߦͬͨίϫʔΩϯάε ϖʔεͩͬͨͷͰɺ͏Ζͨ͑ͨ
(´-`).oO(͘͘ձͷՌΛ ͨͯ͘͠ํ͕ͳ͍)
ʗ(^o^)ʘ ͘͘ձͷ࠷ޙ ͰωλόϨ
ࠓޙͱϚελΧωοτΛ ΑΖ͓͘͠ئ͍͠·͢ɻ