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
Elasticsearchで多言語検索対応してみた話.pdf
Search
motsat
July 19, 2018
Programming
1.5k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Elasticsearchで多言語検索対応してみた話.pdf
motsat
July 19, 2018
More Decks by motsat
See All by motsat
「SmartHR基本機能」の溜まっていく技術課題への取り組み
motsat
0
1.8k
メドピアの輪読会
motsat
2
1.4k
Other Decks in Programming
See All in Programming
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
110
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
270
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
580
Oxlintはいいぞ(続)
yug1224
1
400
プロポーザルを書いてもらう
pvcresin
0
570
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
120
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
290
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
1
260
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
19k
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
400
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
400
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
350
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
340
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
WCS-LA-2024
lcolladotor
0
800
Become a Pro
speakerdeck
PRO
31
6.2k
Abbi's Birthday
coloredviolet
3
9.4k
For a Future-Friendly Web
brad_frost
183
10k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Thoughts on Productivity
jonyablonski
76
5.3k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
250
Building the Perfect Custom Keyboard
takai
2
850
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Transcript
ElasticsearchͰଟݴޠݕࡧର Ԡͯ͠Έͨ
ࣗݾհ ɹɾ໊લ ɹɹࠤ౻ ݩل ɹɾϝυϐΞྺ ɹɹ 2017/9 ʙ WebͷιϑτΤΞΤϯδχΞɹ ɹ
͜Ε͔Β͓͢͠Δ͜ͱ ɾӳޠυΩϡϝϯτΛຊޠͰݕࡧ͢ΔΑ͏ͳɺҟͳΔݴޠ ؒͷݕࡧ ɾ༁Λߦ͏ࣄ͕Ͱ͖ͳ͍߹ͷରԠ ɾElasticsearchͰߦͬͨࡍͷํ๏ͷ1ͭͱɺ ɹϝϦοτ/σϝϦοτ
ҩࢣઐ༻αΠτʮMedPeerʯ
㲔 ৽αʔϏεͷ։ൃ
ʮPubmedจΛຊޠͰޮΑ͘ݕࡧʯ
PubMedจʁ ɹւ֎ҩֶจݙใͷσʔλϕʔε ɹɾӳޠ ʢ͘͝·Εʹผͷݴޠʣ ɾAPIɺFTPͰͷϑΝΠϧऔಘʹରԠ͍ͯ͠Δ
ɾӳจυΩϡϝϯτΛຊޠͰݕࡧ ͍ͨ͠ ɾݕࡧରλΠτϧɺຊจ ࣮ݱ͢Δ͜ͱ
ຊޠʹ༁͓͚ͯ͠ ͳ͍ͣ
༁Λߦ͏ͨΊͷAPI ɾGoogle Translation API 100 ສจࣈ - 20υϧ ɹˠ Pubmed༁ʹෆࣗવͳ͕গͳ͍
ɾMicrosoft Translator API 100 ສจࣈ - 10υϧʢ1120ԁ) ɹˠ ྉ͍͕ۚ҆ɺPubmed༁͢Δͱෆࣗવͳ͕ΘΓͱ͋Δ ɾAmazon Translate ɹຊޠະରԠ(2017/ळࠒ)
༁࣭Λ༏ઌͯ͠ɺPubmed༁ʹෆ ࣗવͳ͕গͳ͔ͬͨͷͰ Google Translation API ʹܾఆɻ
༁ྉۚ
ɾPubMedจ ɹ1700ສ݅ʢMedPeerͰͷऔΓࠐΈରɻʑ૿Ճʣ ɾฏۉจࣈ ɹ1300จࣈ (λΠτϧ100จࣈɺຊจ1200จࣈ) ɹɹɹɹɹˣɹɹɹɹ ɾ߹ܭจࣈ ɹ221ԯจࣈ (100 +
1200) * 1700ສ݅
Google Translation API100 ສจࣈ - 20υϧ ɾֹۚ (221ԯ / 100ສจࣈ)
* 20υϧ = 442000υϧ ɹ ຊԁ = 4889ສԁ ɹ (2017/07/07࣌)
4889ສԁ ߴ͍ʢฐࣾج४ʣ
4889ສԁߴ͍ ɾશͯ༁͢Δͱߴ͗͢Δ ɾͱ͍͑ɺ݅ݮΒͨ͘͠ͳ͍ → ʮӳจυΩϡϝϯτΛຊޠͰݕࡧʯΛͲ ͏͢Δ͔
1.ݩυΩϡϝϯτΛ༁͍ͯ͠ͳͯ͘ ݕࡧՄೳʹ → ຊޠݕࡧʹࣙॻΛ͏ɻ ɹElasticsearchͷʮSynonym Token Filterʯ
Elasticsearch Synonym Token Filter https://www.elastic.co/guide/en/elasticsearch/reference/current/ analysis-synonym-tokenfilter.html
ಉҙޠྨٛޠΛઃఆͰ͖Δػೳɻ ྫʣ ͱ͍͏ఆ͕ٛ͋Εɺ ʮi-podʯͰݕࡧ →ʮi podʯʯʮipodʯʹώοτ ʮi podʯͰݕࡧ →ʮi-podʯʯʮipodʯʹώοτ Synonym
Token Filter i-pod, i pod => ipod
ߴ݂ѹ => hypertension ΠϯϑϧΤϯβ => influenza ͜ΕΛ͍ɺ ຊޠ/ӳޠΛؔ࿈͚ͮΔ
pubmed: { properties: { title_en: { type: "text", analyzer: “english_analyzer"
}, title_ja: { type: "text", analyzer: "ja_analyzer" }, body_en: { type: “text”, analyzer: "english_analyzer" }, body_ja: { type: "text", analyzer: "ja_analyzer" }, }, }, Indexͷproperties(Ϛοϐϯά) ɹɾຊޠϑΟʔϧυ(title_ja/body_ja)ɺ ɹɹӳޠϑΟʔϧυ(title_en/body_en)ΛλΠτϧ/ຊจ ɹɹͦΕͧΕͰ༻ҙ ɾӳޠϑΟʔϧυɺຊޠϑΟʔϧυͰanalyzerΛ͚Δ Elasticsearch༻ͷઃఆ
Indexͷanalysisઃఆ ɹɾfilterʹtype:”synonym”ͰઃఆՃ ɹɾӳޠϑΟʔϧυ༻ͷʮenglish_analyzerʯͷfillterʹɺ ɹɹsynonym filterΛ͏Α͏ઃఆ(ଞެࣜͷEnglishઃఆΛϕʔεʹ) Elasticsearch༻ͷઃఆ { “index” : {
“analysis“: { “filter“ : { “synonym“ : { “type“ : "synonym", “synonyms“ : [‘ߴ݂ѹ => hypertension’, …]}, “analyzer“: { “english_analyzer“: { “tokenizer”: "standard", “filter”: [“synoncym”,”english_possessive_stemmer”,”lowercase “,…] }, …}, }, }, }
Analyze݁Ռ (kibana) ʮߴ݂ѹʯˠʮhypertensionʯͷtokenͱͳΔ (࣮ࡍʹɺઌఔͷαϯϓϧͷଞͷfilterʹΑΓՃ͞Εͨtokenʣ
Ωʔϫʔυʮߴ݂ѹʯͰຊޠ/ӳޠݕࡧ͕Մೳʹ ɾຊޠͷʮߴ݂ѹʯ ɾӳจͷʮhypertensionʯ
ࣙॻͲ͜ͰखʹೖΕΔ͔ ༗໊ͳࣙॻ ɾJMdict (Japanese-Multilingual Dictionary) http://www.edrdg.org/jmdict/j_jmdict.html ɹӳޠҎ֎ೖ͍ͬͯΔΑ͏ͳͷͰɺ ɹෳݴޠͷઃఆͰ͖Δ͔͠Ε·ͤΜɻ
ͲΜͳࣙॻͰྑ͍ͷ͔ ɾઐ༻ޠݫ͍͠ ɹઐ༻ޠ(ҩྍ)ઐͷࣙॻͰͳ͍ͱ୯ޠ͕ཏͰ͖ͳ͍ࣄ͕ ଟ͍ɻ ɹˠ ઐྖҬͷࣙॻΛ୳͢ɺݕࡧϩά͔ΒࣙॻΛΞοϓσʔτ͢Δ ͳͲ ϝυϐΞגࣜձࣾϩθολ༷ͱܖ͠ɺҩྍʹಛԽͨࣙ͠ॻΛఏ ڙ͖ͯ͠·ͨ͠ɻ
ࣙॻʹΑΔଟݴޠͷݕࡧ ϝϦοτ ɹɾશ༁͠ͳͯ͘ݕࡧͰ͖ΔΑ͏ʹͳΔ σϝϦοτ ɹɾࣙॻͷ༻ҙ͕ඞཁʹͳΔ ɹɾݕࡧਫ਼͕ࣙॻͷ࣭ʹࠨӈ͞Ε͍͢ ɹɹˠ จষͷ୯ޠΛཏͰ͖ͳ͍Մೳੑେ͖͍ ɾ୯ޠϕʔεͷݕࡧʹڧ͍͕ɺจͷݕࡧʹऑ͍ ɾݕࡧͰ͖Δ͕ɺ݁Ռදࣔӳޠ
Ϣʔβʔ ΠϯλʔϑΣʔε͍ͩ͠Ͱ͕͢ɺ ɾλΠτϧࣄલ ɹ༁APIͷ͕ͪ࣌ؒͭΒ͍ʢҰཡͰͬ͞ͱݟΔఔͳͷͰʣ ɹຊจΑΓจࣈগͳ͍ͷͰɺશ༁ֹͯۚ͠Ί 2. Ұ෦ࣄલ༁ɺΓදࣔ࣌ʹ
ɾຊจৄࡉදࣔ࣌ ɹදࣔϖʔδͰඇಉظͰॲཧ͞Εͨ༁݁ՌΛදࣔɹ 2. Ұ෦ࣄલ༁ɺΓදࣔ࣌ʹ
ྉۚ ɾ༁ྉ(ݻఆ) ɹ ࣄલʹλΠτϧ͚ͩ༁͢Δࣄʹͨ͠ ɹ 1700ສ݅ * λΠτϧͷΈ(100จࣈ) = 376ສԁɹ(Google
Translate API) ɾ༁ྉ(มಈ) ɹදࣔ࣌ʹ༁͢Δࣄʹͨ͠ = αສԁʢPVඇެදͷؔͰग़ ͤͳ͍Ͱ͕͢ɺݕࡧ͞Εදࣔ͞ΕΔϖʔδҰ෦ͳͷͰ͔ͳΓ҆͘ʣ ɾࣙॻ ɹ גࣜձࣾϩθολ༷ (ҩྍܥಛԽͷӳࣙॻ)ɹ= bສԁʢ͜Εެ ද☓ͳͷͰ͕͢ɺۃΊ͓ͯ҆͘ఏڙ͍͍ͯ·͢ʣ
࠷ऴతͳֹۚ 4889ສԁ → 376+α+b ສԁ େৎʢฐࣾج४ʣ
ิ 1700ສ݅Ҏ߱ʢPubMedͷίϯςϯπʑ૿Ճʣ ͷ༁ɺΑΓҩྍಛԽͷ༁Λߦ͏ͨΊGoogle༁͚ͩͰ ͳ͘ɺԼهͷύʔτφʔ༷ͱܖΛߦ͍APIΛར༻͍ͯ͠· ͢ɻ ɾגࣜձࣾγΣΞϝσΟΧϧ༷ ɹҩྍܥಛԽͷ༁API ɹhttps://www.ikotoba.jp/ ɾגࣜձࣾϩθολ༷ PubMedಛԽͷ༁API
ɹhttps://www.rozetta.jp/
·ͱΊ - ݴޠ͕ҟͳΔυΩϡϝϯτݕࡧʹɺ ɹ ElasticsearchͷSynonym Token FilterΛͬͨ - ༁ྉݮΒͤΔ͕ɺϝϦοτ/σϝϦοτ͋Γ
- ୯ޠͰͷݕࡧΛओͱ͢Δ߹ʹద༻͍͢͠
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠