Share
Embed
Elasticsearch での類似文書検索と More Like This Query API 詳解
Elasticsearch 勉強会 in 京都での発表スライド
(Elasticsearch 勉強会 in 大阪での発表と同じ内容です)
Takuya Asano
July 14, 2015
Transcript
29 slides
-
Elasticsearch Ͱͷྨࣅจॻݕࡧͱ More Like This Query API ৄղ Elasticsearch ษڧձ
in ژ @ ͯͳژΦϑΟε ઙ id:takuya-a @takuya_a -
id:takuya-a ϓϥοτϑΥʔϜˍΞυςΫνʔϜ • 2015 4 ݄ʹೖࣾ • ͯͳϒοΫϚʔΫશจݕࡧͷվળΛ୲ ڵຯ
• ใݕࡧ • ࣗવݴޠॲཧ • ػցֶश OSS ׆ಈ • kuromoji.js ͳͲͷ JavaScript ϥΠϒϥϦΛ։ൃ -
ྨࣅจॻݕࡧ (More Like This) ͱ ೖྗɿจॻ ग़ྗɿจॻू߹ ʢྨࣅจॻʣ ʮElasticsearch 1.6.0ϦϦʔεʯ
ʮElasticsearch 2.0.0.beta1ϦϦʔεؒۙʯ ʮElasticsearch CheatSheetʯ ʮ[༁] From Solr to elasticsearchʯ ʮelasticsearchษڧձ | Doorkeeperʯ -
ຊͷτʔΫͷ֓ཁ 1. More Like This Query API ʹΑΔྨࣅจॻݕࡧ • Elasticsearch
ʹඪ४ͰඋΘ͍ͬͯΔྨࣅจॻݕࡧ API • More Like This Query API ʹ͍ͭͯৄࡉͳΞϧΰϦζϜΛհ ʢElasticsearch ͕ྨࣅจॻΛͲ͏ͬͯܭࢉ͍ͯ͠Δ͔ʣ 2. Term Vectors API ʹΑΔྨࣅจॻݕࡧ • υΩϡϝϯτʹೖ͍ͬͯΔޠͷ౷ܭใΛऔಘ͢Δ API • ΑΓॊೈʹΧελϚΠζ͕Մೳ ʢޠͷ౷ܭใ͔ΒࣗͰܭࢉ͢Δʣ -
More Like This Query API https://www.elastic.co/guide/en/elasticsearch/reference/1.x/query-dsl-mlt-query.html ೖྗɿจॻ ग़ྗɿจॻू߹ ʢྨࣅจॻʣ ʮElasticsearch
1.6.0ϦϦʔεʯ ʮElasticsearch 2.0.0.beta1ϦϦʔεؒۙʯ ʮElasticsearch CheatSheetʯ ʮ[༁] From Solr to elasticsearchʯ ʮelasticsearchษڧձ | Doorkeeperʯ ͜ΕΛ࣮ݱͰ͖Δ API -
More Like This Query API https://www.elastic.co/guide/en/elasticsearch/reference/1.x/query-dsl-mlt-query.html ϑΟʔϧυΛࢦఆ จॻ ID Λࢦఆ
ύϥϝʔλΛࢦఆ ໊લ͕ࣅ͍ͯΔͷͰฆΒΘ͍͕͠ Search API ͷ More Like This API 1.6.0 Ͱ Deprecated ɺ 2.0 Ͱഇࢭ༧ఆ https://www.elastic.co/guide/en/elasticsearch/reference/current/search-more-like-this.html -
ྨࣅจॻݕࡧͷཧతഎܠ - Bag of words Ϟσϧ - • จॻʢυΩϡϝϯτʣΛ୯ޠͷू߹ (Set)
ͩͱΈͳ͢ (୯ޠͷॱংؾʹ͠ͳ͍) • Bag of words (BOW) ʹΑΔϕΫτϧۭؒϞσϧΛ جຊతͳߟ͑ํͱ͢Δ ಉ͡ޠΛଟؚ͘Ήจॻ = ྨࣅจॻͱఆٛ -
Bag of Words ϞσϧʹΑΔ ྨࣅจॻͷྫ ʮElasticsearch 1.6.0ϦϦʔεʯ ʮElasticsearch 2.0.0.beta1ϦϦʔεؒۙʯ Elasticsearch
Elasticsearch ϦϦʔε ϦϦʔε Lucene Lucene synced-flush Ϋϥελ Ϋϥελ … … Pipeline ಉ͡ޠ͕ͲΕ͚ͩೖͬͯΔ͔ʁ Λܭࢉ -
ྨࣅจॻݕࡧ - จॻͷಛநग़ - 1ͭͷจॻͷதʹɺͨ͘͞ΜͷޠʢλʔϜʣؚ͕·Ε͍ͯΔ • ͯ͢ͷλʔϜɾͯ͢ͷจॻʹରͯ͠ɺྨࣅͷܭࢉΛ͢Δͷݱ࣮తͰͳ͍ • ͍͔ͭ͘ͷॏཁޠΛબ͠ɺͦͷจॻͷಛྔͱ͢Δ ʢBag
of Words ͰͷྨࣅܭࢉΛ ॏཁͳλʔϜʹ͍͚ͭͯͩܭࢉ͢Δ͜ͱͰۙࣅ ͍ͯ͠Δʣ ʮॏཁޠΛͲͷΑ͏ʹબͿ͔ʯ͕ྨࣅจॻݕࡧͷϙΠϯτ ౷ܭใ͔ΒλʔϜͷॏཁʢείΞʣΛܭࢉͯ͠ɺ্Ґ Top-K ͷλʔϜΛબ͢Δ ʢλʔϜͷείΞؔͷྫɿ TF-IDF, IDF, RIDF, Gain ͳͲʣ -
ྨࣅจॻݕࡧ - ΫΤϦ࡞ˍݕࡧ - நग़ͨ͠ॏཁޠΛ OR ΫΤϦʹઃఆͯ͠ݕࡧ͢Δ • ॏཁޠͷ͏ͪɺͲΕؚ͔͕·ΕΕΑ͍ •
ॏཁޠΛͨ͘͞ΜؚΉจॻͷείΞ͕ߴ͘ͳΔ -
ྨࣅจॻݕࡧͷΞϧΰϦζϜ·ͱΊ 1. จॻʹؚ·ΕΔλʔϜͷ౷ܭใʢTF, DFͳͲʣΛऔಘ 2. ౷ܭใ͔Β֤λʔϜͷείΞΛܭࢉʢTF-IDFͳͲͰείΞϦϯάʣ 3. λʔϜΛείΞॱʹฒͼସ্͑ͯҐͷλʔϜʢ=ॏཁޠʣΛநग़ 4. ॏཁޠΛͬͯ
OR ΫΤϦΛ࡞ 5. ࡞ͨ͠ΫΤϦͰݕࡧͯ͠ɺ্ҐͷจॻΛྨࣅจॻͱͯ͠ฦ͢ -
ྨࣅจॻݕࡧͷΞϧΰϦζϜ·ͱΊ 1. จॻʹؚ·ΕΔλʔϜͷ౷ܭใʢTF, DFͳͲʣΛऔಘ 2. ౷ܭใ͔Β֤λʔϜͷείΞΛܭࢉʢTF-IDFͳͲͰείΞϦϯάʣ 3. λʔϜΛείΞॱʹฒͼସ্͑ͯҐͷλʔϜʢ=ॏཁޠʣΛநग़ 4. ॏཁޠΛͬͯ
OR ΫΤϦΛ࡞ 5. ࡞ͨ͠ΫΤϦͰݕࡧͯ͠ɺ্ҐͷจॻΛྨࣅจॻͱͯ͠ฦ͢ More Like This Query API ಉ͡ྲྀΕ -
ྨࣅจॻݕࡧͷΞϧΰϦζϜ·ͱΊ 1. จॻʹؚ·ΕΔλʔϜͷ౷ܭใʢTF, DFͳͲʣΛऔಘ 2. ౷ܭใ͔Β֤λʔϜͷείΞΛܭࢉʢTF-IDFͳͲͰείΞϦϯάʣ 3. λʔϜΛείΞॱʹฒͼସ্͑ͯҐͷλʔϜʢ=ॏཁޠʣΛநग़ 4. ॏཁޠΛͬͯ
OR ΫΤϦΛ࡞ 5. ࡞ͨ͠ΫΤϦͰݕࡧͯ͠ɺ্ҐͷจॻΛྨࣅจॻͱͯ͠ฦ͢ More Like This Query API ಉ͡ྲྀΕ -
More Like This Query API ͷΞϧΰϦζϜ - λʔϜͷ౷ܭใͷऔಘ - IndexReader
Ϋϥε Λ͏ • Lucene ͷసஔΠϯσοΫεΛಡΉͨΊͷΫϥε ʢ௨ৗͷݕࡧͰΘΕΔʣ • λʔϜͷ౷ܭใऔಘͰ͖Δ • IndexReader#getTermVectors() ʹจॻ ID Λ༩͑ͯ term vector Λऔಘ -
More Like This Query API ͷΞϧΰϦζϜ - ॲཧͷྲྀΕ - 1.
จॻʹؚ·ΕΔλʔϜͷ౷ܭใʢTF, DFͳͲʣΛऔಘ 2. ౷ܭใ͔Β֤λʔϜͷείΞΛܭࢉʢTF-IDFͳͲͰείΞϦϯάʣ 3. λʔϜΛείΞॱʹฒͼସ্͑ͯҐͷλʔϜʢ=ॏཁޠʣΛநग़ 4. ॏཁޠΛͬͯ OR ΫΤϦΛ࡞ 5. ࡞ͨ͠ΫΤϦͰݕࡧͯ͠ɺ্ҐͷจॻΛྨࣅจॻͱͯ͠ฦ͢ -
More Like This Query API ͷΞϧΰϦζϜ - λʔϜͷείΞܭࢉ - More
Like This ɺλʔϜͷείΞؔʹ TF-IDF Λ͍ͬͯΔ 1. term vector ͔ΒɺTF ΛΧϯτ 2. IDF ͷܭࢉʹTFIDFSimilarity Ϋϥε Λ͏ 3. TF * IDF ΛɺͦͷλʔϜͷείΞͱ͢Δ TF : λʔϜස fi,j → จॻதʹԿճग़ͯ͘ΔλʔϜ΄Ͳߴ͘ͳΔ IDF : จॻස ni ͷٯʢN จॻʣ→ ϨΞͳλʔϜ΄Ͳߴ͘ͳΔ fi,j : ΤϯτϦʔ j ʹݱΕΔλʔϜͷग़ݱճʢසʣ = term_freq N : ΠϯσοΫεʹೖ͍ͬͯΔΤϯτϦʔͷ૯ = doc_count ni : ΠϯσοΫεશମͰλʔϜ͕ݱΕΔΤϯτϦʔͷ = doc_freq -
More Like This Query API ͷΞϧΰϦζϜ - ॲཧͷྲྀΕ - 1.
จॻʹؚ·ΕΔλʔϜͷ౷ܭใʢTF, DFͳͲʣΛऔಘ 2. ౷ܭใ͔Β֤λʔϜͷείΞΛܭࢉʢTF-IDFͳͲͰείΞϦϯάʣ 3. λʔϜΛείΞॱʹฒͼସ্͑ͯҐͷλʔϜʢ=ॏཁޠʣΛநग़ 4. ॏཁޠΛͬͯ OR ΫΤϦΛ࡞ 5. ࡞ͨ͠ΫΤϦͰݕࡧͯ͠ɺ্ҐͷจॻΛྨࣅจॻͱͯ͠ฦ͢ -
More Like This Query API ͷΞϧΰϦζϜ - λʔϜΛείΞॱͰฒͼସ͑ - λʔϜͷ͔ͳΓଟ͍
ͯ͢ͷλʔϜΛϝϞϦʹ͓͍ͯιʔτ͢Δͷ ۭؒతʹ࣌ؒతʹܭࢉίετ͕ߴ͍ Top-K ͕ཉ͍͠߹ ্Ґ K ݸ͚ͩΛอ͓͍࣋ͯͯ͠ ͋ͱࣺͯͳ͕Βιʔτ -
༏ઌ͖ͭΩϡʔ (PriorityQueue) ߴʹ Top-K ΛٻΊΒΕΔσʔλߏ • Java Ͱඪ४ϥΠϒϥϦʹೖ͍ͬͯΔ • όΠφϦώʔϓʢ̎ώʔϓʣͰ࣮͢Δ͜ͱ͕ଟ͍
• Elasticsearch Ͱɺ Lucene ͷ util ύοέʔδʹ͋Δ org.apache.lucene.util.PriorityQueue ΫϥεΛ͍ͬͯΔ https://github.com/apache/lucene-solr/blob/trunk/lucene/core/src/java/org/apache/lucene/util/PriorityQueue.java -
More Like This Query API ͷΞϧΰϦζϜ - ॲཧͷྲྀΕ - 1.
จॻʹؚ·ΕΔλʔϜͷ౷ܭใʢTF, DFͳͲʣΛऔಘ 2. ౷ܭใ͔Β֤λʔϜͷείΞΛܭࢉʢTF-IDFͳͲͰείΞϦϯάʣ 3. λʔϜΛείΞॱʹฒͼସ্͑ͯҐͷλʔϜʢ=ॏཁޠʣΛநग़ 4. ॏཁޠΛͬͯ OR ΫΤϦΛ࡞ 5. ࡞ͨ͠ΫΤϦͰݕࡧͯ͠ɺ্ҐͷจॻΛྨࣅจॻͱͯ͠ฦ͢ লུ -
More Like This Query API ͷΞϧΰϦζϜ - ·ͱΊ - 1.
จॻʹؚ·ΕΔλʔϜͷ౷ܭใʢTF, DFͳͲʣΛऔಘ (retrieveTerms()) IndexReader ͷϝιου getTermVectors(docNum) Ͱ term vectors ʢλʔϜͷ౷ܭใʣΛಡΈग़͠ 2. ౷ܭใ͔Β֤λʔϜͷείΞΛܭࢉʢTF-IDFͰείΞϦϯάʣ 1. term vector ͔Β TF ΛΧϯτ 2. TFIDFSimilarity Ϋϥεʹ DF ͱ numDocs(શυΩϡϝϯτ) Λͯ͠ IDF Λܭࢉ 3. TF * IDF Λܭࢉʢ͜Ε͕λʔϜͷείΞʣ 3. λʔϜΛείΞॱʹฒͼସ্͑ͯҐͷλʔϜʢ=ॏཁޠʣΛநग़ PriorityQueue ΫϥεͰ Top-K ͷλʔϜʢॏཁޠʣΛબ 4. ॏཁޠΛͬͯ OR ΫΤϦΛ࡞ 5. ࡞ͨ͠ΫΤϦͰݕࡧͯ͠ɺ্ҐͷจॻΛྨࣅจॻͱͯ͠ฦ͢ XMoreLikeThis Ϋϥε ʹ࣮͞Ε͍ͯΔ -
ྨࣅจॻݕࡧͷΞϧΰϦζϜʢ࠶ܝʣ 1. จॻʹؚ·ΕΔλʔϜͷ౷ܭใʢTF, DFͳͲʣΛऔಘ 2. ౷ܭใ͔Β֤λʔϜͷείΞΛܭࢉʢTF-IDFͳͲͰείΞϦϯάʣ 3. λʔϜΛείΞॱʹฒͼସ্͑ͯҐͷλʔϜʢ=ॏཁޠʣΛநग़ 4. ॏཁޠΛͬͯ
OR ΫΤϦΛ࡞ 5. ࡞ͨ͠ΫΤϦͰݕࡧͯ͠ɺ্ҐͷจॻΛྨࣅจॻͱͯ͠ฦ͢ -
Term Vectors API Λͬͨ ྨࣅจॻݕࡧͷΞϧΰϦζϜ 1. จॻʹؚ·ΕΔλʔϜͷ౷ܭใʢTF, DFͳͲʣΛऔಘ • Term
Vectors API 2. ౷ܭใ͔Β֤λʔϜͷείΞΛܭࢉʢTF-IDFͳͲͰείΞϦϯάʣ • ౷ܭใ͔ΒಠࣗͷείΞؔͰܭࢉ 3. λʔϜΛείΞॱʹฒͼସ্͑ͯҐͷλʔϜʢ=ॏཁޠʣΛநग़ • ॻ͖͍ͨݴޠͰϥΠϒϥϦ͕ͳ͔ͬͨΒࣗલͰ࣮ 4. ॏཁޠΛͬͯ OR ΫΤϦΛ࡞ • Boolean Query ͷ should અʹλʔϜʢॏཁޠʣΛฒΔ 5. ࡞ͨ͠ΫΤϦͰݕࡧͯ͠ɺ্ҐͷจॻΛྨࣅจॻͱͯ͠ฦ͢ • Boolean Query Λ Elasticsearch ʹ͛Δ -
·ͱΊ 2 छྨͷྨࣅจॻݕࡧͷΓํΛհ 1. More Like This Query API ʹΑΔྨࣅจॻݕࡧ
࠷ॳ͔ΒΈࠐ·Ε͓ͯΓ API ͚ͩͰ؆୯ʹ͑Δ ΫΤϦ֦ுͷܭࢉ͕ Elasticsearch Ͱ݁ʢແବͳ IO ͕ൃੜ͠ͳ͍ʣ νϡʔχϯά͕͍͔ͭ͘ͷύϥϝʔλͷௐʹݶΒΕΔ 2. Term Vectors API ʹΑΔྨࣅจॻݕࡧ ΑΓॊೈͳΫΤϦ֦ு͕ߦ͑ΔʢࣗવݴޠॲཧػցֶशͱͷΈ߹Θ͕ͤ༰қʣ Term Vector API Ͱฦͬͯ͘ΔϨεϙϯεαΠζ͕େ͖͍ʢωοτϫʔΫෛՙ͕ߴ͍ʣ ΞϓϦέʔγϣϯαʔόͰେྔͷλʔϜΛॲཧ͢Δඞཁ͕༗ΔʢCPUෛՙ͕ߴ͍ʣ