「ベクトル検索とセマンティック検索は何が違うのか」を調べると、2つを並べた比較表が出てきます。しかしこの2語は同じ階層の技術ではありません。セマンティック検索(セマンティックサーチ、意味検索とも呼ばれます)は「意味で探す」という目的やユーザー体験を指し、ベクトル検索はそれを実現する代表的な実装手段のひとつです。両者を対等な選択肢として比べると、製品選定でも設計でも判断を誤ります。ここでは包含関係を軸に、それぞれの仕組み、埋め込み生成とpgvectorでの実装コード、キーワード検索との差、包含関係が崩れる例外、そしてRAGを含む実務での使い分けと採用判断までを整理します。数値と版番号は2026年10月時点の公式ドキュメントで確かめた値です。
まとめ:ベクトル検索は手段、セマンティック検索は目的という関係
- 並列ではなく包含関係。セマンティック検索=意味・意図で探すという目的、ベクトル検索=埋め込みベクトルの近傍探索という実装手段。ベクトル検索はセマンティック検索の主要な実現方法だが、唯一の方法ではない。
- ベクトル検索の中身は「埋め込みモデルでベクトル化 → HNSWなどのANNインデックスを構築 → 類似度で近傍探索」の3段。精度と速度はインデックスのパラメータで決まり、pgvectorのHNSWは
vector型で2,000次元までという上限がある。 - セマンティック検索の実装系統は3つ。密ベクトル(埋め込み)、スパースベクトル(ElasticのELSER)、知識グラフ・オントロジー。さらに後段の再ランキング(Azure AI Searchのセマンティックランカー)が精度を押し上げる。
- 例外もある。画像やレコメンドの類似検索はベクトル検索だが意味理解ではない。逆にオントロジーで同義語を辿る検索はベクトルを使わないセマンティック検索。
- 実務の既定解は二択ではなくハイブリッド。BM25の全文検索とベクトル検索を並列実行し、RRF(Reciprocal Rank Fusion)で統合したうえで再ランキングする構成が、型番・固有名詞と概念クエリの両方を取りこぼさない。PostgreSQLならSQL1本で組める。
ベクトル検索とセマンティック検索の違い:目的と手段の包含関係を表で比較
最初に結論を書きます。この2つは対立概念ではなく、包含関係にあります。
| 観点 | セマンティック検索 | ベクトル検索 |
|---|---|---|
| 語が指すもの | 目的・検索体験(意味と意図で探す) | 実装手段(ベクトル空間の近傍探索) |
| 階層 | 上位概念 | セマンティック検索の代表的な実装 |
| 入力の扱い | クエリの意図・文脈・同義関係を解釈 | クエリを数値ベクトルへ変換 |
| 一致の判定 | 意味的な関連度 | コサイン類似度・内積・L2距離 |
| 代表的な実装 | 密ベクトル/スパース/知識グラフ | HNSW、IVFFlat、eKNN(全探索) |
| 非テキストへの適用 | 主にテキスト(拡張は可) | 画像・音声・行動ログにも適用可 |
言い換えると、「セマンティック検索をやりたい」は要件で、「ベクトル検索を使う」は設計判断です。Google Cloudのセマンティック検索の概要と仕組みや、Elasticのセマンティック検索の解説が、セマンティック検索を「意図と文脈を理解する検索」と定義したうえで、その実現方法としてベクトル埋め込みを挙げているのも同じ構造です。両者を並べて「どちらを導入するか」と問う設計会議があれば、その問いの立て方自体を疑ってください。正しい問いは「意味で探す要件に対し、どの実装を、どこまで組み合わせるか」になります。
発注の場面でも同じです。「セマンティック検索を入れたい」という要望にベクトルDBの製品名だけを返す提案は、要件と手段を取り違えています。
セマンティック検索の仕組み:密ベクトル・スパース・知識グラフの3系統
セマンティック検索を「ベクトルで検索すること」と説明する記事は多いのですが、実装系統は3つあります。ベクトルはそのうちの2つを占めるだけです。
密ベクトル(埋め込み)による意味検索とOpenAI・Geminiの次元数
文書とクエリを埋め込みモデルで固定長のベクトルに変換し、近い方向のベクトルを持つ文書を返す仕組みです。OpenAIのEmbeddingsガイドによれば、text-embedding-3-smallは既定1536次元、text-embedding-3-largeは既定3072次元で、dimensionsパラメータにより次元を削って保存コストを下げられます。GoogleのGemini APIのEmbeddingsドキュメントでは、2026年10月時点の最新モデルgemini-embedding-2も既定で3072次元を出力し、Matryoshka Representation Learning(MRL)によりoutput_dimensionalityで768・1536などへ縮められると案内されています。「返品したい」と「返送の手続き」のように語が一致しない文書を結び付けられるのがこの系統の強みです。モデルの選び方そのものは埋め込みモデルの仕組みと日本語モデルの選び方で詳しく比べています。
スパースベクトル(ELSER)の語彙拡張と日本語文書で使うときの注意
ElasticのELSER(Elastic Learned Sparse Encoder)は、文書とクエリを「共起しやすい重み付きの語の集合」へ拡張します。密ベクトルと違い、どの語がマッチに寄与したかを追えるため説明性が高く、既存の転置インデックス型の検索基盤にも載せやすいのが利点です。Elasticsearchのsemantic_textフィールドを使えば、推論エンドポイントを指定するだけでチャンク分割と埋め込み生成が自動化されます。意味検索=密ベクトル、という思い込みはここで崩れます。
ただし日本語の案件では注意が要ります。ElasticのELSERドキュメントは、ELSERを英語の文書とクエリ向けに推奨し、英語以外の文書でセマンティック検索をするならE5モデルを使うよう案内しています。日本語文書にELSERを当てて精度が出ないなら、まずモデルの適用範囲を疑ってください。
知識グラフ・オントロジー(SKOS・OWL)によるベクトルを使わない意味検索
語と語の関係(上位下位・同義・属性)を明示的に定義し、その関係を辿って検索する方式です。W3CのRDF・OWL、そして統制語彙のためのSKOS(Simple Knowledge Organization System)といった仕様で記述する「セマンティックWeb」の系譜にあたり、ベクトルを一切使いません。SKOSでは「broader(上位語)」「narrower(下位語)」「altLabel(別名)」のような関係を定義でき、クエリ「心筋梗塞」に対して下位概念や別名まで展開して探す、といった検索が組めます。医学分野のMeSHやICD-10のように統制語彙が整備され、誤った類似(曖昧一致による取り違え)が許されない領域では、いまも現役です。グラフ側の構造を検索に生かす選択肢はベクトルデータベースとグラフデータベースの違いで比較しています。
ベクトル検索の仕組みを試す:埋め込み生成・HNSW索引・近傍探索の3段
手元で確かめられる最小構成として、Pythonで埋め込みを作り、pgvectorで索引を張るまでを順に見ます。
Pythonで埋め込みを生成して「返品したい」と「返送の手続き」を比べる
まずはベクトル化の手触りを確かめます。次のコードはOpenAIのPython SDKでtext-embedding-3-smallを呼び、3つの文のベクトルとコサイン類似度を出力するものです。実行には環境変数OPENAI_API_KEYが必要になります。
# pip install openai numpy
import numpy as np
from openai import OpenAI
client = OpenAI() # 環境変数 OPENAI_API_KEY を読む
texts = ["返品したい", "返送の手続きについて", "RX-750Aの仕様"]
res = client.embeddings.create(model="text-embedding-3-small", input=texts)
vecs = np.array([d.embedding for d in res.data])
print(vecs.shape) # (3, 1536) = 3文 × 既定1536次元
def cos(a, b):
return float(a @ b / (np.linalg.norm(a) * np.linalg.norm(b)))
print("返品 vs 返送 :", cos(vecs[0], vecs[1]))
print("返品 vs 型番 :", cos(vecs[0], vecs[2]))
見るべきは2つの類似度の差です。語が一致しない「返品したい」と「返送の手続きについて」が、型番の文より高い類似度になるか。自社の実クエリと正解文書の組を10〜20件作って同じ計算を回せば、モデル選定の一次評価になります。
次元数とストレージ量の見積もり:3072次元を100万件持つと約12GB
ベクトル化はモデル任せに見えますが、次元数は運用コストに直結します。3072次元をfloat32(4バイト)で100万件保持すれば、ベクトルだけで約12GB。次元を768へ落とせば約3GBで、索引の分はこれに上乗せされます。多言語の取りこぼしが問題にならない範囲で、まず小さい次元から測るのが定石です。日本語と英語が混在するコーパスでは、クロスリンガル性能を先に評価しないと、いくらインデックスを調整しても再現率は上がりません。日本語モデルの比較には、日本語埋め込みベンチマークのJMTEB(2026年10月時点でv2.0系)の結果が参考になります。
pgvectorでHNSW索引を張る:2,000次元の上限とhalfvecでの回避
PostgreSQL拡張のpgvectorなら、既存のRDBにそのままベクトル列を足せます。CHANGELOGでは2026年10月1日公開の0.8.7が最新で、現行は0.8系です。HNSWはv0.5.0(2023年)で入りました。
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE documents (
id bigserial PRIMARY KEY,
content text NOT NULL,
embedding vector(1536)
);
-- HNSW索引(m=16・ef_construction=64 は pgvector の既定値)
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- 近傍探索:$1 にクエリの埋め込みを渡す(コサイン距離が小さい順)
SET hnsw.ef_search = 100; -- 既定40。大きくすると再現率が上がり遅くなる
SELECT id, content, 1 - (embedding <=> $1) AS cosine_similarity
FROM documents
ORDER BY embedding <=> $1
LIMIT 10;
ここで見落とされやすいのが次元の上限です。pgvectorのREADMEによれば、HNSWとIVFFlatで索引を張れるのはvector型で2,000次元まで、半精度のhalfvec型で4,000次元までとされています。つまりtext-embedding-3-largeやgemini-embedding-2の既定3072次元は、vector型のままでは索引を作れません。選択肢は、dimensions/output_dimensionalityで1536次元などへ縮めるか、次のようにhalfvecへキャストして索引を張るかの2つです。
-- 3072次元の列を halfvec にキャストして索引化(4,000次元まで)
CREATE INDEX ON documents_3072 USING hnsw ((embedding::halfvec(3072)) halfvec_cosine_ops);
SELECT id FROM documents_3072
ORDER BY embedding::halfvec(3072) <=> $1::halfvec(3072)
LIMIT 10;
ANNインデックスのHNSWとIVFFlatを精度・速度・メモリで比べる
100万件のベクトルと総当たりで距離計算すれば正確ですが、その分だけ遅くなります(この全探索がeKNN=exhaustive KNNで、後述のANNとは別物です)。そこで近似最近傍探索(ANN)を使います。pgvectorでは、v0.5.0で加わったHNSW(Hierarchical Navigable Small World)と、従来からあるIVFFlatの2種類のインデックスを選べます。HNSWは多層グラフを構築するためクエリ性能(速度と再現率の両立)に優れる一方、構築が遅く多くのメモリを必要とする方式です。IVFFlatはベクトルをリストに分割する方式で、構築が速くメモリは少ないものの、同じ速度なら再現率で劣ります。
HNSWはIVFFlatと違い学習ステップが無いため、データが空のテーブルにも先にインデックスを張れます。増分投入が続くシステムは、この差が効く場面です。絞り込み付きの検索にも注意が要ります。pgvectorのREADMEは、WHERE句が索引走査の「後」に掛かるため、既定のef_search=40で該当率10%の条件なら平均4件しか返らない例を挙げ、0.8.0で入った反復索引スキャン(hnsw.iterative_scan)を勧めています。権限別に絞るRAGでは件数不足の原因になりがちです。まずPostgreSQLで始めるならpgvectorの基本概要とPostgreSQLにおけるベクトル検索を、専用DBの内部構造から比較したい場合はベクトル化とインデックス構造から理解するベクトルデータベースの仕組みを参照してください。
キーワード検索(全文検索・BM25)との違いと、ベクトル検索が外す場面
キーワード検索は転置インデックスとBM25で「その語が含まれるか」を見ます。ベクトル検索は「意味が近いか」を見る仕組みです。BM25の計算式とk1・bの意味はBM25の計算式とPython実装の解説に、エンジン側の選択肢は全文検索エンジンの仕組みと主要OSS比較にまとめています。この差が実務で表面化するのは、次の2場面です。
- キーワード検索が勝つ場面:型番「RX-750A」、人名、エラーコード、社内の略号。これらは埋め込み空間では周囲の語に埋もれ、ベクトル検索が完全一致を外すことがある。
- ベクトル検索が勝つ場面:「動かなくなった原因を知りたい」のような言い換え・要約的なクエリ、表記ゆれ、言語をまたぐ検索。
片方に寄せると、もう片方の失敗が必ず出ます。だから実務では両方を走らせます。
包含関係が崩れる2つの例外:混同したまま設計すると招く検索品質の失敗
「ベクトル検索=セマンティック検索」と丸ごと同一視すると、次の2パターンで設計を誤ります。
ベクトル検索だがセマンティック(意味理解)ではない画像・レコメンドの例
CLIPのような画像埋め込みによる類似画像検索、音声の話者照合、購買履歴からのレコメンドは、いずれも埋め込みベクトルの近傍探索です。しかしそこに「言語の意味理解」はありません。ベクトル検索基盤を導入したからといって、自動的に日本語クエリの意図を汲む検索体験が手に入るわけではない、ということです。ベクトルDBのベンチマークが速くても、埋め込みモデルが日本語の意味を捉えられていなければ検索品質は上がりません。日本語のRAGを組むなら、DBの選定より先にJMTEBのような日本語埋め込みベンチマークと、前述の自社データでの類似度検証でモデルを比較してください。
セマンティックだがベクトルではないAzureセマンティックランカーの制約
前述のELSERのスパースベクトル、オントロジーによる同義語展開、そしてMicrosoftのマネージド検索サービスであるAzure AI Searchのセマンティックランカーがこれにあたります。Microsoft Learnのセマンティックランキング概要によれば、セマンティックランカーはBM25やRRFで並べ替えた「後」に効く再ランキング機能で、そのスコア(@search.rerankerScore)は4〜0の範囲で元のスコアとは別に返ります。見落とせないのは、ランカーは初期検索が拾えなかった文書を後から見つけられないという制約です。同ページの記載では、再ランキングに進むのは初期検索の上位50件までで、51件目以降は対象にすらなりません。したがって「セマンティックランカーを有効にしたのに再現率が上がらない」という相談は、ほぼ初期検索(リコール)側の設計問題です。ここを取り違えると、リランカーのチューニングに時間を溶かすことになります。再ランキングモデルの種類と選び方はリランクモデルの種類と選び方で整理しています。
使い分けとRAGでの実装:pgvectorでハイブリッド検索をSQL1本で組む
結論から言えば、業務システムの検索やRAGの検索器では、キーワード検索とベクトル検索のどちらかを選ぶ設計は推奨しません。既定はハイブリッドです。Microsoft Learnのハイブリッド検索概要によれば、Azure AI Searchのハイブリッド検索はBM25による全文検索とHNSW/eKNNによるベクトル検索を並列に実行し、それぞれの順位をRRFで1本の結果集合に統合します。RRFはスコアの絶対値ではなく順位を使って融合するため、スケールの異なる2つのスコアを正規化せずに混ぜられるのが利点です。
要件別の判断表:全文検索主体・ベクトル主体・ハイブリッドの選び方
| 要件 | 推奨構成 |
|---|---|
| 型番・固有名詞の完全一致が中心 | 全文検索(BM25)主体、ベクトルは補助 |
| 言い換え・自然文の質問が中心 | ベクトル検索主体+全文検索で取りこぼし補完 |
| 社内文書のRAG(両方混在) | ハイブリッド+再ランキング |
| 語の関係が厳密に定義された領域 | オントロジー・知識グラフを併用 |
| チャンク分割の情報欠落が課題 | PageIndex等の非ベクトル型RAG |
RRFで2つの順位を統合するSQL例と、日本語の全文検索で詰まる箇所
専用の検索サービスを使わなくても、PostgreSQLならハイブリッド検索を1本のSQLで書けます。次の例は、ベクトル側と全文検索側でそれぞれ上位20件を取り、RRFの式「1/(k+順位)」で合算するものです。k=60は、RRFを提案したCormackらの2009年の論文で使われた値で、Azure AI SearchのRRFスコアリング解説も60のような小さい値で良く働くと説明しています。
-- 全文検索用の列と索引を追加('simple' は空白区切りで分割する設定)
ALTER TABLE documents
ADD COLUMN textsearch tsvector
GENERATED ALWAYS AS (to_tsvector('simple', content)) STORED;
CREATE INDEX ON documents USING gin (textsearch);
-- $1 = クエリの埋め込み、$2 = クエリ文字列
WITH semantic AS (
SELECT id, RANK() OVER (ORDER BY embedding <=> $1) AS rank
FROM documents
ORDER BY embedding <=> $1
LIMIT 20
),
keyword AS (
SELECT id, RANK() OVER (ORDER BY ts_rank_cd(textsearch, query) DESC) AS rank
FROM documents, plainto_tsquery('simple', $2) AS query
WHERE textsearch @@ query
ORDER BY ts_rank_cd(textsearch, query) DESC
LIMIT 20
)
SELECT COALESCE(s.id, k.id) AS id,
COALESCE(1.0 / (60 + s.rank), 0.0)
+ COALESCE(1.0 / (60 + k.rank), 0.0) AS rrf_score
FROM semantic s
FULL OUTER JOIN keyword k ON s.id = k.id
ORDER BY rrf_score DESC
LIMIT 10;
日本語で詰まるのはキーワード側です。PostgreSQL標準のテキスト検索パーサーは空白や記号で語を区切るため、分かち書きされない日本語の文はほぼ1語扱いになり、部分一致が効きません。pg_bigmやPGroongaなどの拡張を入れるか、キーワード側だけElasticsearchやOpenSearchに任せる構成を検討してください。RRFの計算式と製品別の設定はRRF(Reciprocal Rank Fusion)の解説に、ハイブリッド検索をアプリ側で組む実装コードはハイブリッド検索の仕組みと実装コードにまとめています。
採用条件と見送り場面:ベクトル検索を入れるべき案件とそうでない案件
ここまでの整理を、受託開発の現場で使う判断に落とします。ベクトル検索の導入を勧めるのは、次の条件が2つ以上そろう案件です。
- 利用者が自然文で質問し、文書側の言い回しと一致しないことが多い(問い合わせ対応、社内規程、技術ナレッジ)。
- 表記ゆれや同義語が多く、辞書の整備で追い付かない。
- 生成AIに根拠文書を渡すRAGを組む予定がある。
- 日本語と英語の文書が混在し、言語をまたいで探したい。
逆に、見送るか全文検索主体にとどめるべき場面もはっきりしています。検索の大半が型番・品番・顧客コードの完全一致である業務システム、文書が数千件未満で全文検索とフィルタで十分に引ける社内ポータル、ヒット理由を監査で説明する必要がある領域です。最後のケースではBM25かオントロジーを主にし、ベクトルは候補拡張の補助に回すほうが運用で揉めません。迷うなら、現行検索で「見つからなかった」クエリを100件ほど集め、言い換えが原因のものが何割あるかを数えてください。
導入を決めたら、最初の工程は製品選定ではなく評価データの用意です。埋め込みモデル、ハイブリッドの重み、再ランキングの有無を同じ指標で測ってから構成を固めます。社内文書を対象に、検索器の設計から評価・運用までを一体で相談したい場合は、一創のRAG構築支援で要件整理から伴走しています。
よくある質問
セマンティック検索とベクトル検索は同じものですか?
同じではありません。セマンティック検索は「意味と意図で探す」という目的を指し、ベクトル検索はその代表的な実装手段です。ベクトルを使わないセマンティック検索(オントロジー、ELSERのスパースベクトル)も、意味理解を伴わないベクトル検索(画像類似検索、レコメンド)も存在します。
セマンティック検索を導入すればキーワード検索は不要になりますか?
なりません。型番・人名・エラーコードのような完全一致が必要なクエリは、意味的な近さを見るベクトル検索が外すことがあります。実務では全文検索とベクトル検索を並列実行し、RRFで統合するハイブリッド構成が基本です。
オントロジーとセマンティック検索の違いは何ですか?
オントロジーは語と語の関係(上位下位・同義・属性)を明示的に定義した知識の構造で、セマンティック検索を実現する手段のひとつです。関係が厳密に定義でき、曖昧な類似一致が許されない領域(医療・法務など)では、埋め込みより適する場合があります。W3CのSKOSやOWLが記述の標準として使われています。
RAGとベクトル検索の違いは何ですか?
RAGは外部知識を検索して生成AIの入力に加えるアーキテクチャ全体、ベクトル検索はそのRetriever部分の一実装です。RAGの検索器はベクトル検索でなくてもよく、全文検索やハイブリッド、文書構造を辿る方式も選べます。RAG全体の構成はRAGの仕組みとLLM・ファインチューニングとの違いで解説しています。
ベクトル検索を始めるなら専用のベクトルDBが必要ですか?
必須ではありません。PostgreSQLならpgvector拡張でHNSWインデックスを張れます(v0.5.0以降、2026年10月時点の現行は0.8系)。既存のRDBに数十万〜数百万件規模で載せるなら、まずpgvectorで実測してから専用DBの必要性を判断するほうが、運用対象を増やさずに済みます。Google Cloud側でもFirestoreのベクトル検索(KNN)が2024年9月にGAとなり、既存コレクションに埋め込みを持たせるだけで近傍検索を組めます(埋め込みは2048次元まで)。あわせて、Gemini Embedding 2についても解説しています。
関連記事
- ハイブリッド検索とは?RAGでBM25とベクトル検索を統合する仕組み・RRF・実装コード
- RRF(Reciprocal Rank Fusion)とは?計算式とk=60の意味・製品別設定・RAG-Fusionでの使い方
- 埋め込みモデルとは?仕組みと日本語モデルの選び方・RAG実装での判断基準【2026年版】
- ベクトルデータベースとは?ベクトル化・インデックス構造・製品比較【2026年版】
- ベクトルデータベースとグラフデータベースの違い|比較表と使い分け・GraphRAGでの併用【2026年版】
- pgvectorの基本概要とPostgreSQLにおけるベクトル検索の重要性
- リランクモデルとは?ベクトル検索と組み合わせる種類・仕組み・選び方【2026年版】
- PageIndexとは?ベクトル不要の推論型RAGの仕組み・使い方・従来RAGとの違い