Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「うまく言えない」検索を叶える ― OpenSearchと生成AIで作る 類似プロジェクト検索

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Serverless Operations Serverless Operations
February 15, 2026
14

「うまく言えない」検索を叶える ― OpenSearchと生成AIで作る 類似プロジェクト検索

Avatar for Serverless Operations

Serverless Operations

February 15, 2026
Tweet

More Decks by Serverless Operations

Transcript

  1. ͳͥɺࣅ͍ͯΔผͷϓϩδΣΫτΛݟ͚ͭΔඞཁ͕͋Δ͔ʁ "ϓϩδΣΫτ ɾ໘ੵɿ ᶷ ɾඅ༻ɿԯԁ ɾظؒɿ೔ ɾಛ௃ᶃ ݸ͕ࣨଟ͘ɺಛघͳઃඋͱஅ೤ ɾಛ௃ᶄ ਖ਼໘ʹಓ࿏͕͋Γɺଞ͸܏ࣼ஍

    #ϓϩδΣΫτ $ϓϩδΣΫτ %ϓϩδΣΫτ ઃඋͷઃஔཁྖ ɾಛੑ֬ೝ ೖࡳʹඞཁͳॻྨɾखଓ͖ɺ ৹ࠪཁྖɾཁ݅Λ֬ೝ ಛघͳ஍ܗɾಛੑʹΑΔ ࢿࡐௐୡํ๏Λݕ౼ 
  2. ʮ͍͋·͍͞ʯʹରԠ͢ΔͨΊͷઓུ "ϓϩδΣΫτ ɾ໘ੵɿ ᶷ ɾඅ༻ɿԯԁ ɾظؒɿ೔ ɾ׬ྃ೔ɿ೥݄೔ ɾಛ௃ᶃ ݸ͕ࣨଟ͘ɺಛघͳઃඋͱஅ೤ ɾಛ௃ᶄ

    ਖ਼໘ʹಓ࿏͕͋Γɺଞ͸܏ࣼ஍ ᶃᐆດ͞Λߏ଄Խ͠ɺ ࣮૷ʹམͱ͠ࠐΊΔܗ ΁۩ମԽ ˞Ճॏׂ߹ͷ߹ܭ͕ ʹͳΔΑ͏ʹઃఆͯ͠ݕࡧ ᶄݕࡧ݁Ռ͸ෳ਺ͷϓϩδΣΫτ͕ Ұ໨Ͱݟ͑ΔΑ͏ʹఏڙ͢Δ #ϓϩδΣΫτ 50% 25% 25% 0% 0% ໘ੵ අ༻ ಛ௃ ׬ྃ೔ ֊਺ ɾ໘ੵɿ ᶷ ɾඅ༻ɿԯԁ ɾ׬ྃ೔ɿ೥݄೔ ɾಛ௃ ओཁൖೖܦ࿏͕શͯ܏ࣼ஍ $ϓϩδΣΫτ ɾ໘ੵɿ ᶷ ɾඅ༻ɿԯԁ ɾ׬ྃ೔ɿ೥݄೔ ɾಛ௃ ਖ਼໘͔ΒͷԼΓࡔʹ஫ҙ %ϓϩδΣΫτ ɾ໘ੵɿ ᶷ ɾඅ༻ɿԯԁ ɾ׬ྃ೔ɿ೥݄೔ ɾಛ௃ ܏͖΍͍͢஍൫ߏ଄ʹ஫ҙ ྨࣅ౓ ྨࣅ౓ ྨࣅ౓ 
  3. ʮ͍͋·͍ʯͳ஋ͱॏΈ͚ͮΛద༻͢ΔGVODUJPO@TDPSF public filterAreaWithScale( origin: number, offset = 10, scale =

    1000 ) { this.queryTemplate.query.bool.must.push({ function_score: { functions: [ { exp: { 'document.໘ੵ': { origin: origin, offset: offset, scale: scale, }, }, weight: weight }, ], }, }) return this } %FDBZ'VODUJPOT (BVTTJBO ڑ཭͕͍ۙ͘͝΋ͷ͕΄΅ຬ఺ɺ཭ΕΔ΄Ͳٸݮ &YQPOFOUJBM ڑ཭ͷ૿ՃʹͭΕͯҰఆͷׂ߹Ͱܧଓతʹݮগ -JOFBS ڑ཭ʹൺྫͯ͠௚ઢతʹείΞ͕ݮগ 
  4. ʮ͍͋·͍ʯͳ஋ͱॏΈ͚ͮΛద༻͢ΔGVODUJPO@TDPSF public filterAreaWithScale( origin: number, offset = 10, scale =

    1000 ) { this.queryTemplate.query.bool.must.push({ function_score: { functions: [ { exp: { 'document.໘ੵ': { origin: origin, offset: offset, scale: scale, }, }, weight: weight }, ], }, }) return this } // ʮྨࣅ౓ʯΛ൓ө͢ΔͨΊͷϝιου // ޻ࣄબ୒ޙɺεϥΠμʔͷॳظ஋ϩδοΫʹج͍ͮͯ // offset ͱ scale Λ൓ө͠·͢ // origin : ൺֱͷج४ͱͳΔ஋ // offset : ج४஋ͱͷ͕ࠩ͜ͷ஋Ҏ಺ͷ৔߹ɺείΞ͕ຬ఺ʢ1ʣͱΈͳ͞ΕΔൣғ // scale : ج४஋ͱͷ͕ࠩ scale Λ௒͑Δ৔߹ɺείΞʹ͸൓ө͞Εͳ͍ const searchQuery = new SearchQueryHelper() .setPageNumber(1) .setPageSize(25) .filterAreaWithScale(origin, offset, scale) .filterCostWithScale(origin, offset, scale) .filterPeriodWithScale(origin, offset, scale) .filterDeliveryDateWithScale(origin, offset, scale) .setSearchTextVector('ಛ௃', inputTextEmbedding.vector) 
  5. લॲཧ͕ՄೳͳશͯͷछྨͷσʔλΛΑΓࠐΈɺߏ଄Խ͢Δ | code | name | area | cost |

    period | deliveryDate | |------|-----------|------|------------|--------|--------------| | 0001 | A project | 2000 | 1000000000 | 365 | 2023-01-01 | | 0002 | B project | 2000 | 1000000000 | 365 | 2023-01-02 | | 0003 | C project | 2000 | 1000000000 | 365 | 2023-01-03 | root/ ɹᵋ 0001/ ɹ ├ ܖ໿ɾਪਐ४උ/ ├ ૯߹ܭըॻ.pdf └ ܖ໿ॻ.pdf ├ ٞࣄ࿥/ └ ͦͷଞ ... ϓϩδΣΫτ %# ϓϩδΣΫτ ؔ࿈ࢿྉ ɾॻྨ { "meta": { "code": "0001", "name": "A project" }, "document": { "area": 2000, "cost": 1000000000, "period": 1000000000, "startDate": "2022-01-01", "deliveryDate": 2023-01-01, "type": "GENERAL", "status": "DONE" }, "embeddings": [ { "vector": [ ... ], "text": { "key": "ಛ௃ᶃ", "value": "ݸ͕ࣨଟ͘ɺಛघͳઃඋͱஅ೤..." } }, { "vector": [ ... ], "text": { "key": "ಛ௃ᶄ", "value": "ਖ਼໘ʹಓ࿏͕͋Γɺଞ͸܏ࣼ஍..." } } ] } ਺஋σʔλͳͲઈର஋ͰදݱͰ͖Δ߲໨͸ Ϛελʔ%#͔Β&5-ॲཧ ྨࣅ౓ݕࡧʹඞཁͳ ߏ଄Խσʔλੜ੒  
  6. ϓϩδΣΫτؒͷྨࣅ఺ɾಛ௃Λݟ͚ͭΔͨΊͷج४Λ੔ཧ root/ ɹᵋ 0001/ ɹ ├ ܖ໿ɾਪਐ४උ/ ├ ૯߹ܭըॻ.pdf └

    ܖ໿ॻ.pdf ├ ٞࣄ࿥/ └ ͦͷଞ ... { "embeddings": [ { "vector": [ ... ], "text": { "key": "ಛ௃ᶃ", "value": "ݸ͕ࣨଟ͘ɺಛघͳઃඋͱஅ೤..." } }, { "vector": [ ... ], "text": { "key": "ಛ௃ᶄ", "value": "ਖ਼໘ʹಓ࿏͕͋Γɺଞ͸܏ࣼ஍..." } } ] } ϓϩδΣΫτ ؔ࿈ ࢿྉɾॻྨ 0$3ରԠͷ7-.ͰಡΈऔΓ ֤߲໨ʹؔ͢ΔධՁͱαϚϦʔΛ࡞੒ ஍Ҭɾ஍ཧతཁ݅ ɾ஍൫ɺߦ੓ɺؾީ ґཔओʹؔ͢Δࣄ߲ ɾاۀಛੑɺ࢓༷ ֎؍ɾҙঊతಛ௃ ɾ֎นɺృ૷ɺ಺૷ ن໛ʹؔ͢Δৄࡉ ɾ༧ࢉɺ໘ੵɺ֊਺ ઃඋʹؔ͢Δಛ௃ ɾ֤छઃඋɺӄѹࣨ౳ ߏ଄తཁ݅ ɾ޻๏ɺ໔਒ɺ଱਒ 
  7. ࣗવݴޠσʔλͷϋΠϒϦουݕࡧ { embeddings: [ { text: { key: "஍Ҭɾ஍ཧతཁ݅", value:

    "..." }, vector: [...] }, { text: { key: "ઃඋʹؔ͢Δಛ௃", value: "..." }, vector: [...] }, ] } { query: { hybrid: { queries: [ { // ςΩετݕࡧΫΤϦʔ multi_match: { query: SEARCH_TEXT, fields: ["key", "value"] } }, { // ྨࣅݕࡧΫΤϦʔ knn: { embeddings: { vector: [...] } } } ] } }, search_pipeline: { phase_results_processors: [ { 'normalization-processor': { normalization: { technique: "min_max" }, combination: { technique: "arithmetic_mean", parameters: { // είΞϦϯάॏΈ͚ͮ // [text, vector] weights: [0.3, 0.7] } }, ignore_failure: false } } ] } 
  8. σʔλߏ଄Խॲཧߏ੒ͷ֓ཁ ϓϩδΣΫτ %# ϓϩδΣΫτ ؔ࿈ ࢿྉɾॻྨ .PEFMT 4UPSBHF &5- 4USVDUVSJOH

    0QFO4FBSDI $47࿈ܞ όονॲཧ ϑΝΠϧ Ξοϓϩʔυ όονॲཧ &5-͓Αͼ +40/ߏ଄Խ 0$3  4VNNBSJ[JOH  &NCFEEJOH *OEFYJOH ར༻ͨ͠ੜ੒"*Ϟσϧ ɾamazon.nova-[lite/pro]-* ɾamazon.titan-embedv2-[text/image]-* ɾnanonets/Nanonets-OCR-s (OSS)