[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-build-semantic-search-opensearch-vectors-zh":3,"article-related-build-semantic-search-opensearch-vectors-zh":30,"series-tools-f3a58146-9c8e-4358-89f3-d89d9558b629":73},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":22,"views":26,"created_at":27,"published_at":28,"topic_cluster_id":29},"f3a58146-9c8e-4358-89f3-d89d9558b629","build-semantic-search-opensearch-vectors-zh","OpenSearch 向量語意搜尋實作指南","\u003Cp data-speakable=\"summary\">這篇教你用 OpenSearch 建立向量語意搜尋，完成索引、寫入嵌入向量、相似度查詢與混合搜尋。\u003C\u002Fp>\u003Cp>這篇給想把\u003Ca href=\"\u002Fnews\u002Fcodex-override-file-team-safety-zh\">文件\u003C\u002Fa>搜尋、知識庫或商品搜尋升級成語意搜尋的開發者。你會照著做出一個可用的 OpenSearch 向量索引，能存文字與 embedding，並回傳最近鄰結果。\u003C\u002Fp>\u003Cp>完成後，你會拿到一組可直接改成正式專案的指令、索引設定與查詢範本，方便你把語意檢索接到自己的應用程式。\u003C\u002Fp>\u003Ch2>開始之前\u003C\u002Fh2>\u003Cul>\u003Cli>OpenSearch 2.x 以上\u003C\u002Fli>\u003Cli>OpenSearch Dashboards 2.x 以上，若你想用介面檢查查詢\u003C\u002Fli>\u003Cli>Node 20+ 或 Python 3.10+，若你要在應用程式內產生 embedding\u003C\u002Fli>\u003Cli>Docker 24+ 或可透過 HTTP 存取的 OpenSearch 叢集\u003C\u002Fli>\u003Cli>OpenSearch 管理員帳號與密碼，或 API key\u003C\u002Fli>\u003Cli>一個 embedding 模型或 embedding API，例如 OpenAI、Cohere 或 Amazon Bedrock\u003C\u002Fli>\u003Cli>curl 8+，用來執行本文範例\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Step 1: 啟動 OpenSearch 叢集\u003C\u002Fh2>\u003Cp>這一步的目的是先拿到一個可連線的 OpenSearch 端點，讓你後面可以建立向量欄位與搜尋查詢。若你是本機開發，直接用 \u003Ca href=\"\u002Ftag\u002Fdocker\">Docker\u003C\u002Fa> 起單節點最省事。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781714880799-8f5k.png\" alt=\"OpenSearch 向量語意搜尋實作指南\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cpre>\u003Ccode>docker run -p 9200:9200 -p 9600:9600 \\\n  -e \"discovery.type=single-node\" \\\n  -e \"OPENSEARCH_INITIAL_ADMIN_PASSWORD=StrongPassword123!\" \\\n  opensearchproject\u002Fopensearch:latest\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>驗收方式很簡單，請用瀏覽器或 curl 打開根端點。你應該看到叢集名稱、版本資訊，以及可連線的回應內容。\u003C\u002Fp>\u003Ch2>Step 2: 建立向量索引\u003C\u002Fh2>\u003Cp>這一步的產出是可以同時存文字與向量的索引。你要先定義 \u003Ccode>knn_vector\u003C\u002Fcode> 欄位，維度必須和你的 embedding 模型輸出一致，例如 384、768 或 1536。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781714896275-ni26.png\" alt=\"OpenSearch 向量語意搜尋實作指南\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cpre>\u003Ccode>curl -u admin:StrongPassword123! -X PUT \"https:\u002F\u002Flocalhost:9200\u002Farticles\" -k -H 'Content-Type: application\u002Fjson' -d '\n{\n  \"settings\": {\n    \"index\": {\n      \"knn\": true\n    }\n  },\n  \"mappings\": {\n    \"properties\": {\n      \"title\": { \"type\": \"text\" },\n      \"body\": { \"type\": \"text\" },\n      \"body_vector\": {\n        \"type\": \"knn_vector\",\n        \"dimension\": 384\n      }\n    }\n  }\n}'\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>驗收時，請查詢索引 mapping。你應該看到 \u003Ccode>knn_vector\u003C\u002Fcode> 欄位，而且維度就是你剛剛設定的數字。\u003C\u002Fp>\u003Ch2>Step 3: 寫入文件與 embedding\u003C\u002Fh2>\u003Cp>這一步的產出是已經帶有文字與數值向量的文件資料。先在你的應用程式裡產生 embedding，再把每筆文件連同向量一起送進 OpenSearch。\u003C\u002Fp>\u003Cpre>\u003Ccode>curl -u admin:StrongPassword123! -X POST \"https:\u002F\u002Flocalhost:9200\u002Farticles\u002F_doc\u002F1?refresh=true\" -k -H 'Content-Type: application\u002Fjson' -d '\n{\n  \"title\": \"向量搜尋入門\",\n  \"body\": \"OpenSearch 可以儲存 embedding 來做語意檢索。\",\n  \"body_vector\": [0.12, -0.03, 0.44, 0.08]\n}'\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>驗收方式是把剛寫入的文件取回來。你應該看到文字欄位與向量欄位都已經出現在回應裡。\u003C\u002Fp>\u003Ch2>Step 4: 執行最近鄰查詢\u003C\u002Fh2>\u003Cp>這一步的產出是可用於語意搜尋的相似文件結果。你要用同一個 embedding 模型產生查詢向量，然後請 OpenSearch 找出最接近的文件。\u003C\u002Fp>\u003Cpre>\u003Ccode>curl -u admin:StrongPassword123! -X GET \"https:\u002F\u002Flocalhost:9200\u002Farticles\u002F_search\" -k -H 'Content-Type: application\u002Fjson' -d '\n{\n  \"size\": 3,\n  \"query\": {\n    \"knn\": {\n      \"body_vector\": {\n        \"vector\": [0.10, -0.01, 0.40, 0.05],\n        \"k\": 3\n      }\n    }\n  }\n}'\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>驗收時，請看前幾筆結果是否在語意上最接近查詢內容，而不只是字面關鍵字相同。\u003C\u002Fp>\u003Ch2>Step 5: 合併文字與向量訊號\u003C\u002Fh2>\u003Cp>這一步的產出是混合搜尋查詢，能同時兼顧精確字詞與語意相似度。當你想讓關鍵字影響排序時，就把文字查詢和向量查詢放在一起。\u003C\u002Fp>\u003Cpre>\u003Ccode>curl -u admin:StrongPassword123! -X GET \"https:\u002F\u002Flocalhost:9200\u002Farticles\u002F_search\" -k -H 'Content-Type: application\u002Fjson' -d '\n{\n  \"query\": {\n    \"bool\": {\n      \"should\": [\n        { \"match\": { \"body\": \"語意檢索\" } },\n        {\n          \"knn\": {\n            \"body_vector\": {\n              \"vector\": [0.10, -0.01, 0.40, 0.05],\n              \"k\": 3\n            }\n          }\n        }\n      ]\n    }\n  }\n}'\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>驗收方式是對照純文字搜尋與純\u003Ca href=\"\u002Fnews\u002Fzvec-turns-local-vector-search-into-a-library-zh\">向量搜尋\u003C\u002Fa>的結果。你應該看到同時符合兩種訊號的文件排得更前面。\u003C\u002Fp>\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>指標\u003C\u002Fth>\u003Cth>基準／優化前\u003C\u002Fth>\u003Cth>結果／優化後\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>搜尋方式\u003C\u002Ftd>\u003Ctd>只用關鍵字比對\u003C\u002Ftd>\u003Ctd>文字 + 向量混合搜尋\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>結果相關性\u003C\u002Ftd>\u003Ctd>容易漏掉同義詞與近義表達\u003C\u002Ftd>\u003Ctd>可抓到語意相近文件\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>索引內容\u003C\u002Ftd>\u003Ctd>只有純文字欄位\u003C\u002Ftd>\u003Ctd>文字欄位 + embedding 向量\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>查詢彈性\u003C\u002Ftd>\u003Ctd>只能依字面命中排序\u003C\u002Ftd>\u003Ctd>可調整 k 與 should 權重\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Ch2>常見錯誤\u003C\u002Fh2>\u003Cul>\u003Cli>向量維度設錯。修法是把索引 mapping 的 dimension 改成和 embedding 模型輸出完全一致。\u003C\u002Fli>\u003Cli>索引與查詢用了不同 embedding 模型。修法是固定同一個模型家族與前處理流程，避免向量空間不一致。\u003C\u002Fli>\u003Cli>測試時看不到新文件。修法是暫時加上 \u003Ccode>?refresh=true\u003C\u002Fcode>，或等待 production 的 refresh 週期。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>接下來可以看什麼\u003C\u002Fh2>\u003Cp>基礎流程跑通後，下一步可以研究重排序、混合檢索權重調整，以及如何把 OpenSearch 向量搜尋接到正式的知識庫或商品搜尋\u003Ca href=\"\u002Fnews\u002Fopenai-service-terms-app-risk-users-zh\">服務\u003C\u002Fa>。\u003C\u002Fp>","這篇教你用 OpenSearch 建立向量語意搜尋，完成索引、寫入嵌入向量、相似度查詢與混合搜尋。","docs.opensearch.org","https:\u002F\u002Fdocs.opensearch.org\u002Flatest\u002Fvector-search\u002F",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781714880799-8f5k.png","tools","zh","cc4a6360-46f7-4cdd-b250-74e4474d0407",[17,18,19,20,21],"OpenSearch","向量搜尋","語意檢索","knn_vector","embedding",[23,24,25],"先建立支援向量的索引，再寫入文字與 embedding。","查詢時要使用同一個 embedding 模型，才能得到穩定的相似度結果。","混合搜尋可以同時保留關鍵字精準命中與語意相關性。",0,"2026-06-17T16:47:36.828153+00:00","2026-06-17T16:47:36.819+00:00","c3c88dd2-a940-438a-b359-0e5a24562273",{"tags":31,"relatedLang":32,"relatedPosts":36},[],{"id":15,"slug":33,"title":34,"language":35},"build-semantic-search-opensearch-vectors-en","Build semantic search with OpenSearch vectors","en",[37,43,49,55,61,67],{"id":38,"slug":39,"title":40,"cover_image":41,"image_url":41,"created_at":42,"category":13},"f87f416c-0f08-4137-b070-714cace25274","zvec-turns-local-vector-search-into-a-library-zh","Zvec 把本地向量搜尋變成函式庫","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781714028472-gvbb.png","2026-06-17T16:33:23.906632+00:00",{"id":44,"slug":45,"title":46,"cover_image":47,"image_url":47,"created_at":48,"category":13},"0d604975-3f39-4093-9a65-b47e4c6f5ccb","codex-override-file-team-safety-zh","Codex override 文件让团队少踩坑","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781712201211-vhvb.png","2026-06-17T16:02:49.966135+00:00",{"id":50,"slug":51,"title":52,"cover_image":53,"image_url":53,"created_at":54,"category":13},"6c40b201-8e6d-4b48-a988-791936798713","opencode-terminal-ai-coding-loop-zh","OpenCode 讓終端編碼變成迴圈","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781693320715-b9x5.png","2026-06-17T10:47:58.3922+00:00",{"id":56,"slug":57,"title":58,"cover_image":59,"image_url":59,"created_at":60,"category":13},"2830e8de-b146-4dd7-b1f6-1b61c223e9ea","open-source-ai-software-infrastructure-wins-zh","開源 AI 軟體贏在基礎設施，不贏在話題","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781691476387-1uwa.png","2026-06-17T10:17:26.854039+00:00",{"id":62,"slug":63,"title":64,"cover_image":65,"image_url":65,"created_at":66,"category":13},"137212d6-7843-4f65-b19f-f0db62e1929b","wazero-turns-go-wasm-into-plain-go-zh","Wazero 讓 Go Wasm 變回純 Go","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781681649267-d64h.png","2026-06-17T07:33:30.509996+00:00",{"id":68,"slug":69,"title":70,"cover_image":71,"image_url":71,"created_at":72,"category":13},"c849204c-8427-4af7-9662-60aa9e1f5524","ffmpeg-webcli-browser-video-editor-zh","ffmpeg-webCLI 把剪片搬進瀏覽器","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781680695836-cdup.png","2026-06-17T07:17:40.422494+00:00",[74,79,84,89,94,99,104,109,114,119],{"id":75,"slug":76,"title":77,"created_at":78},"855cd52f-6fab-46cc-a7c1-42195e8a0de4","surepath-real-time-mcp-policy-controls-zh","SurePath 推出即時 MCP 政策控管","2026-03-26T07:57:40.77233+00:00",{"id":80,"slug":81,"title":82,"created_at":83},"9b19ab54-edef-4dbd-9ce4-a51e4bae4ebb","mcp-in-2026-the-ai-tool-layer-teams-use-zh","2026 年 MCP：團隊真的在用的 AI 工具層","2026-03-26T08:01:46.589694+00:00",{"id":85,"slug":86,"title":87,"created_at":88},"af9c46c3-7a28-410b-9f04-32b3de30a68c","prompting-in-2026-what-actually-works-zh","2026 提示工程，真正有用的是什麼","2026-03-26T08:08:12.453028+00:00",{"id":90,"slug":91,"title":92,"created_at":93},"05553086-6ed0-4758-81fd-6cab24b575e0","garry-tan-open-sources-claude-code-toolkit-zh","Garry Tan 開源 Claude Code 工具包","2026-03-26T08:26:20.068737+00:00",{"id":95,"slug":96,"title":97,"created_at":98},"042a73a2-18a2-433d-9e8f-9802b9559aac","github-ai-projects-to-watch-in-2026-zh","2026 必看 20 個 GitHub AI 專案","2026-03-26T08:28:09.619964+00:00",{"id":100,"slug":101,"title":102,"created_at":103},"a5f94120-ac0d-4483-9a8b-63590071ac6a","claude-code-vs-cursor-2026-zh","Claude Code 與 Cursor 深度對比：202…","2026-03-26T13:27:14.279193+00:00",{"id":105,"slug":106,"title":107,"created_at":108},"0975afa1-e0c7-4130-a20d-d890eaed995e","practical-github-guide-learning-ml-2026-zh","2026 機器學習入門 GitHub 實用指南","2026-03-27T01:16:49.712576+00:00",{"id":110,"slug":111,"title":112,"created_at":113},"bfdb467a-290f-4a80-b3a9-6f081afb6dff","aiml-2026-student-ai-ml-lab-repo-review-zh","AIML-2026：像課綱的學生實驗 Repo","2026-03-27T01:21:51.467798+00:00",{"id":115,"slug":116,"title":117,"created_at":118},"80cabc3e-09fc-4ff5-8f07-b8d68f5ae545","ai-trending-github-repos-and-research-feeds-zh","AI Trending：把 AI 資源收成一張表","2026-03-27T01:31:35.262183+00:00",{"id":120,"slug":121,"title":122,"created_at":123},"3ce6e6e2-bac5-463e-9f8d-45caabcc61f7","awesome-ai-for-science-research-tools-map-zh","AI 科研工具清單，開始像地圖了","2026-03-27T01:46:50.521945+00:00"]