Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ブログを支える技術
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takashi Masuda
February 17, 2017
Technology
4.5k
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
最近の情報収集方法 2025
masutaka
0
79
自分のブログをCloudFront+HerokuからCloud Runに移行した
masutaka
0
180
BigQuery経由で使うGoogleスプレッドシートのスキーマ管理
masutaka
0
360
本を聴く毎日を送っています
masutaka
0
100
ボッチLookML開発者兼データ整備人を連れてきたよ!
masutaka
0
140
ここがつらいよ普段使いのLinux
masutaka
0
370
4月から取り組んできたLookerの導入から実装までのお話
masutaka
0
190
HerokuでSidekiqを監視する方法を確立した
masutaka
0
650
デプロイで止まらないバッチ処理を求めて
masutaka
1
160
Other Decks in Technology
See All in Technology
非定型業務をAI slackbotで自動化する ~ 社内要望を自動壁打ちするbotを作った ~/automating-ad-hoc-work-with-ai-slackbot
shibayu36
0
520
Chart.js が簡単に使えるようになっていたので OGP 画像生成に使った話
kamekyame
0
170
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
3.2k
Platform Engineering as a Product: Criteria for Improvement and Multi-Tenant Design
kumorn5s
0
530
スキルと MCP ツール、責務をどう分けるか? AI が迷わないインターフェース設計の戦略
cdataj
0
210
DevOps Agentで始めるAWS運用 〜フロンティアエージェントが変える運用の現場〜
nyankotaro
1
340
Dynamic Workersについて
yusukebe
2
640
ABEMA の Datadog × OTel 基盤、 中から見るか? 外から見るか?
tetsuya28
0
110
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
5
1.8k
AmazonRoute 53ではじめてのドメイン取得!HTTPS化までの道のりを整理してみた
usanchuu
3
110
AI活用を推進するために ファインディが下した、一つの小さな決断
starfish719
0
280
LLMと共に進化するプロセスを目指して
ymatsuwitter
12
3.7k
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Making Projects Easy
brettharned
120
6.7k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Practical Orchestrator
shlominoach
191
11k
We Are The Robots
honzajavorek
0
240
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
200
Music & Morning Musume
bryan
47
7.2k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
140
Testing 201, or: Great Expectations
jmmastey
46
8.2k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
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^)ʘ ͘͘ձͷ࠷ޙ ͰωλόϨ
ࠓޙͱϚελΧωοτΛ ΑΖ͓͘͠ئ͍͠·͢ɻ