全文検索(ぜんぶんけんさく、英: Full text search)とは、コンピュータにおいて、複数の文書(ファイル)から特定の文字列を検索すること。「ファイル名検索」や「単一ファイル内の文字列検索」と異なり、「複数文書にまたがって、文書に含まれる全文を対象とした検索」という意味で使用される。

全文検索技術

grep型

順次走査検索、逐次検索ともいう。「grep」とはUNIXにおける文字列検索コマンドであり、複数のテキストファイルの内容を順次走査していくことで、検索対象となる文字列を探し出す。一般に「grep型」と呼ばれる検索手法は、事前に索引ファイル(インデックス)を作成せず、ファイルを順次走査していくために、検索対象の増加に伴って検索速度が低下するのが特徴である。ちなみに「grep型」とは実際にgrepコマンドを使っているという意味ではない。

索引(インデックス)型

検索対象となる文書数が膨大な場合、grep型では検索を行うたびに1つ1つの文書にアクセスし、該当データを逐次検索するので、検索対象文書の増加に比例して、検索にかかる時間も長くなっていってしまう。そこであらかじめ検索対象となる文書群を走査しておき、高速な検索が可能になるような索引データを準備することで、検索時のパフォーマンスを向上させる手法が取られている。事前に索引ファイルを作成することをインデクシング(英: indexing)と呼ぶ。インデクシングにより生成されるデータはインデックス(インデクス)と呼ばれ、その構造は多くの場合、「文字列 | ファイルの場所 | ファイルの更新日 | 出現頻度…」といったようなリスト形式(テーブル構造)を取り、文字列が検索キーとなっている。検索時にはこのインデックスにアクセスすることで、劇的に高速な検索が可能となる。

索引文字列の抽出手法

形態素解析

英文の場合は単語と単語の間にスペースが入るため、自然、スペースで区切られた文字列を抽出していけば、索引データの作成は容易となる。しかし日本語の場合は、単語をスペースで区切る「わかち書き」の習慣がないため、形態素解析技術を用いて、文脈の解析、単語分解を行い、それをもとにインデックスを作成する必要がある。形態素解析を行うためには解析用の辞書が必須であり、検索結果は辞書の品質に少なからず影響を受ける。また、辞書に登録されていないひらがな単語の抽出に難があるなど、技術的障壁も多く、検索漏れが生じることが欠点とされる。

N-Gram

「N文字インデックス法」「Nグラム法」などともいう。検索対象を単語単位ではなく文字単位で分解し、後続の N-1 文字を含めた状態で出現頻度を求める方法。Nの値が1なら「ユニグラム(英: uni-gram)」、2なら「バイグラム(英: bi-gram)」、3なら「トライグラム(英: tri-gram)」と呼ばれる。たとえば「全文検索技術」という文字列の場合、「全文」「文検」「検索」「索技」「技術」「術(終端)」と2文字ずつ分割して索引化を行ってやれば、検索漏れが生じず、辞書の必要も無い。形態素解析によるわかち書きに比べると、2つの欠点がある。意図したものとは異なる検索結果(いわゆる検索ノイズ)の発生と、インデックスサイズの肥大化である。検索ノイズの一例として、「京都」で検索すると「東京都庁」という適合しない検索結果、「***が含まれる物は見つかりませんでした」という文章が返ってくる場合が挙げられる。

その他

他に日本語文書から索引文字列を抽出する手法として、文字種による切り分け、接尾辞配列、シグネチャ法などがありそれぞれに特長があるが、先の2種に比べると大規模なシステムには適用しづらく、精度の問題もあり主流とはなっていない。

文書フィルタ

検索対象文書がプレーンテキスト以外、たとえばHTML文書ならばタグの除去等の処理を行ってテキストを抽出できるが、特定メーカーのワープロ独自形式などバイナリ形式の場合、インデクサは直接ファイルからテキストを抽出することが出来ないため、文書フィルタを利用して該当ファイルからテキストを抜き出す必要が生じる。文書フィルタ機能はインデクサが内包しているものもあれば、アドインなどの機能拡張によって実装する場合もある。

  • 代表的な文書フィルタ
    • Xpdf
      • Xpdf
      • NamazuでPDF文書からテキストを抽出するために利用されることが多い。
    • IFilter
      • IFilterShop
      • IFilter.Org
      • Microsoft Office 2010 Filter Packs
      • Index Service、Windowsデスクトップサーチのアドインとして各社より提供されている。
    • xdoc2txt
      • http://ebstudio.info/home/xdoc2txt.html
      • 高速Grepソフトウェア「KWIC Finder」からフィルタ部分を抜き出したもの。Hyper Estraier では標準文書フィルタとして利用されている。

転置ファイル

全文検索用のインデックスには様々な形式があるが、最も一般的なものは単語と、単語を含む文書ファイルのIDとで構成された可変長のレコードを持ったテーブルで、転置ファイル(英: inverted file、転置インデックスとも)と呼ばれるものである。インデクシングや実際の検索の際には「二分探索」などのアルゴリズムを使って、高速に検索単語から文書IDを探し出すことが出来る。転置ファイルのデータ構造や、採用している探索アルゴリズムは全文検索システムによって様々であり、これらの違いによってインデックスサイズ、検索速度、検索精度に大きな違いが出ることがある。

再現率と適合率

全文検索システムの評価指標のひとつとして「再現率(英: recall)」と「適合率(精度、英: precision)」が用いられる。前者は「いかに検索漏れが少ないか」をあらわし後者は「いかに検索ノイズが少ないか」をあらわす。一般的に両者はトレードオフの関係にあるといわれている。(→「情報検索#検索性能の評価」)

ランク付け(スコアリング)

検索された文書は「更新順」「ファイル名順」「文書のタイトル順」などにソートされる。一般的な検索エンジンでは独自のランク付けルールも適用し「重要度」などと呼んでいるものもある。ランク付けの基本的な考え方は「ユーザーにとって重要と思われる文書を上位に表示する」ことであり、以下のような手法が採られることが多い。

  • 文書中の検索単語出現頻度
  • HTMLタグの解析
タグや<H1>タグを重視する。</dd></dl> <ul><li>tf-idf</li></ul> <dl><dd>TFとは単語の出現頻度、IDFは全文書中において単語が一部の文書に集中している度合いをあらわし、両者を掛け合わせることでランク付けを行う。</dd></dl> <ul><li>ページランク</li></ul> <dl><dd>「重要度の高いページからリンクされているページは重要である」という原理に基づいてランク付けを行う。Googleで採用されている。</dd></dl> <h2>主な用途</h2> <dl><dt>WWW検索サービス</dt> <dd>検索サービスの中では、超大型の機能が求められる分野で、熾烈な競争が行われてきたが、2013年現在では「Google」または「Bing」のいずれかに集約されつつある。ウェブの初期から行われていたサービスのひとつで、技術の進歩もめざましい。</dd> <dt>企業向け社内検索サービス</dt> <dd>社内ファイルサーバの文書資産を高速全文検索するシステム。WordやExcelといったオフィススイートから、メール、データベースなどの多くのファイル形式に対応し、企業の性格に応じて、多様な検索結果を返す。近年、電子データの企業資産の重要性が増し、非常に発達してきている分野。</dd> <dt>デスクトップ検索</dt> <dd>個人のローカルファイルを検索するためのアプリケーションソフトウェア。Word、Excel、PDFなど様々なファイル形式に対応している。また、画像データなどの、個人の保有にあるマルチメディアデータの検索に特化したものもあり、スピードと手軽さが求められている。</dd></dl> <h2>代表的な全文検索エンジン</h2> <h3>サーバ/ワークステーション向け</h3> <h4>無償</h4> <ul><li>Tokyo Dystopia: a full-text search system <ul><li>以下の製品群と組み合わせて使用する。Tokyo Cabinet: a modern implementation of DBM、Tokyo Tyrant: network interface of Tokyo Cabinet、Tokyo Promenade: a content management system、Kyoto Cabinet: a straightforward implementation of DBM、Kyoto Tycoon: a handy cache/storage server</li></ul></li></ul> <ul><li>Hyper Estraier <ul><li>N-gramベース (N.M-gram)。わかち書き方式も併用可。</li> <li>分散インデクス、Webクローラ、検索用CGIなど標準添付のプログラムが充実。</li> <li>N.M-gram方式とは、N文字に続くM文字のハッシュ値を計算し保持することによって、フレーズ検索が可能。フォルスドロップあり。類似検索あり。</li> <li>大規模なインデックスも作成可。</li></ul></li></ul> <ul><li>msearch <ul><li>インデックスは「ファイル名|タブコード|本文|改行コード」の単純なもので、これにGrep検索をかけることで対象文書を抽出する。</li> <li>設置が非常に容易であり、root権限が無くてもインデックスの更新が可能なため、個人の小規模サイトを中心に用いられている。</li> <li>UTF-8などUnicodeにも対応したUnicode版msearchがある。</li></ul></li></ul> <ul><li>Namazu <ul><li>わかち書きベース。</li> <li>2単語によるフレーズからハッシュ値を計算し保持することによって、フレーズ検索が可能。フォルスドロップ(英: false drop=誤った候補)あり。</li> <li>古くからあり、日本で広く使われている全文検索システム。</li> <li>小中規模を対象とし、大規模が苦手。</li></ul></li></ul> <ul><li>Apache Lucene/Solr <ul><li>Analyzerと呼ばれるクラスを選ぶことにより、N-gramやわかち書き形式でのインデックス作成ができる。</li> <li>Javaによる全文検索システム。</li> <li>Luceneがクラスライブラリとして提供され、Luceneを利用した全文検索サーバーがSolrとなる。</li> <li>IBM WebSphere Commerce, Salesforce, Microsoft Azure, SAP Hybris, 楽天などで利用されている。</li> <li>大規模なインデックスも作成可。スケーリングし稼働率、対障害性を高めるZookeeperを使った仕組みを備える。</li></ul></li></ul> <ul><li>Rast <ul><li>わかち書きベース・N-gramベースの選択</li> <li>単語の出現位置情報を保持し、正確なフレーズ検索が可能。フォルスドロップなし。</li></ul></li></ul> <ul><li>Senna <ul><li>わかち書きベース・N-gramベースの選択</li> <li>他のプログラムからライブラリとして呼び出して利用する。</li> <li>MySQLの中に全文検索エンジンを組み込むパッチが提供されており、MySQLを利用しているプログラムであれば全文検索機能を手軽に実現できる。</li> <li>PostgreSQLに対して、Sennaを全文検索エンジンとして組み込むためのモジュールLudiaが公開されている。</li> <li>Perlバインディングにより、Perlスクリプトから簡単に利用することができる。PHP、Ruby、Pythonバインディングも提供されている。</li> <li>大規模なインデックスも作成可。ただし、分散検索の機能はない。</li></ul></li></ul> <ul><li>Groonga <ul><li>Sennaの後継エンジン</li></ul></li></ul> <h4>有償</h4> <ul><li>jetrun®クラスター・サーチエンジン <ul><li>300カテゴリ700万ワードの豊富な独自辞書による高速な全文検索エンジン</li> <li>ASP方式とアプライアンス方式のWebサービス</li></ul></li> <li>ConceptBase Enterprise Search <ul><li>国産のエンタープライズ検索エンジン ConceptBase シリーズの大規模対応版</li> <li>検索精度の高い独自技術「NL-Vgram」で、1つのインデックスで概念検索と全文検索の両方を実現可能。</li></ul></li> <li>ConceptBase Search Lite(旧 ConceptBase Search 1000) <ul><li>概念検索や文字列一致検索に加え、絞り込み検索など高速で多彩な検索が特徴。</li> <li>上位版「ConceptBase V」はビューポイント、ファセット・ナビゲーションなど独特の機能を有する。</li></ul></li> <li>Sedue <ul><li>圧縮サフィックスアレイを使用したインメモリ型の全文検索エンジン</li> <li>複数マシンでの分散検索も可能</li></ul></li> <li>FAST ESP <ul><li>検索パフォーマンスと検索対象データ量の両面でスケーラビリティを持ち、超大規模システムまで対応可能。</li> <li>形態素解析とN-gramの両方をハイブリッドに利用可能。</li></ul></li> <li>FileBlog <ul><li>Solrベースで、ActiveDirectory連携などWindowsファイルサーバ検索に特化したGUI</li> <li>フォルダ階層のブラウズや、フォルダによる検索範囲限定が特徴</li></ul></li> <li>Oracle Secure Enterprise Search <ul><li>N-gramベース (V-gram)。</li> <li>ログインしたユーザーが参照可能な結果のみを表示するセキュア検索が特徴。</li></ul></li> <li>Piranha <ul><li>サイト内検索CGI</li></ul></li> <li>SAVVY <ul><li>国産のパターン認識技術をベースとし、完全一致検索のほか、あいまい検索、あるまで検索、自然語調検索など、超高速かつ多彩な検索方式が特徴。</li></ul></li> <li>SMART/InSight <ul><li>形態素解析、N-gram選択可。</li> <li>ActiveDirectoryなどのACL継承機能有り。</li> <li>Apache Solrをエンジンとして使用。</li></ul></li> <li>Neuron <ul><li>Apache Solrベースでプラグインを組み込み、検索画面・クローラーをパッケージングした全文検索システム。</li> <li>形態素解析とN-Gramで日本語を分割し、辞書登録の負荷を大幅に軽減。独自開発のクローラーによるパフォーマンスの高さが特徴。</li></ul></li> <li>Vivisimo Velocity <ul><li>クラスタリング技術による、類似した検索結果の自動カテゴライズ機能。</li> <li>ActiveDirectoryと連携したACL検索等、企業内の既存セキュリティに適合させるカスタマイズ性の高さが特徴。</li></ul></li> <li>WiSE</li> <li>FlexSearch</li> <li>InfoBee/iS <ul><li>NTTの技術を基にした純国産検索エンジン</li> <li>形態素解析、同義語辞書を使用したあいまい検索が可能</li></ul></li> <li>IBM OmniFind Enterprise Edition <ul><li>形態素解析とN-gramの両方をサポート</li> <li>さまざまなデータソースを検索対象とすることができる</li></ul></li> <li>FAST Search Server for SharePoint <ul><li>ファスト製品の技術を基にした検索エンジン</li></ul></li> <li>Autonomy IDOL (Intelligent Data Operating Layer) <ul><li>オートノミーはMeaning-Based Computing (MBC) を提唱しており、その中核となるコア技術</li></ul></li> <li>QuickSolution <ul><li>住友電工情報システムによって提供されている全文検索エンジン。</li></ul></li> <li>Microsoft SharePoint Server <ul><li>SharePoint 2013からファスト製品の技術を基にした検索エンジンを標準で提供。</li> <li>マイクロソフトによるクラウド サービスMicrosoft Office 365やパートナー クラウド上のMicrosoft SharePointとのハイブリッド検索に強みを持つ。</li></ul></li></ul> <h3>個人向け</h3> <h4>無償</h4> <ul><li>Windows Search(マイクロソフト) <ul><li>わかち書きベース</li> <li>Windows Vista以降に標準搭載。</li> <li>検索対象フォルダを詳細に設定可能。ネットワークドライブにも対応。</li> <li>当初は「MSN サーチ ツールバー with Windows デスクトップ サーチ」というパッケージで配布されていた。</li></ul></li> <li>Spotlight(Apple) <ul><li>Mac OS X Tiger以降に標準搭載。「Sherlock」の後継ソフト。</li></ul></li> <li>GrepWin <ul><li>GrepのWindows移植。</li> <li>GUI付き。</li></ul></li> <li>Googleデスクトップ (Google) <ul><li>わかち書きベース。</li> <li>Google web検索と同じエンジンでローカルファイルを検索できる。</li> <li>欠点は、大きなファイルの場合、後半部分がインデックス化されないなどの問題。</li> <li>2008年を最後に開発停止済。</li></ul></li> <li>DesktopHE <ul><li>N-gramベース (N.M-gram)。わかち書き方式も併用可。</li> <li>Hyper EstraierにGUIをつけた物。</li> <li>Google デスクトップなどの常駐型とは異なり、インデックスを張ったあとはコンピュータが重くなったりしない。</li> <li>2010年を最後に開発停止済。</li></ul></li> <li>インデックスサービス(マイクロソフト) <ul><li>Windows 2000 / XPに標準搭載。</li> <li>デフォルトではオフとなっている。</li> <li>ローカルディスク全体をインデックス化できるが、CPU負荷は高くなる。</li> <li>メール検索には非対応。</li> <li>Vistaでは、Windows デスクトップサーチをベースにしたシステムになった。</li></ul></li> <li>FindFast(マイクロソフト) <ul><li>MS Office95~2000に標準搭載。</li> <li>Officeファイルが対象であり、メール検索などはできない。</li> <li>Office XP以降は、インデックス検索に置き換わった。</li></ul></li> <li>Beagle <ul><li>LinuxなどのUnix系OS向け</li></ul></li> <li>MetaTracker <ul><li>LinuxなどのUnix系OS向け</li></ul></li> <li>butterfly_search(バタフライサーチ) <ul><li>アルファベットは空白区切り、それ以外の文字はN-gramベースでインデックス化。</li> <li>検索対象はテキストファイルのみ。</li></ul></li></ul> <h4>有償</h4> <ul><li>全文検索くん (Search ) <ul><li>Luceneによる全文検索システム</li> <li>PDF、新旧Officeドキュメント対応</li></ul></li> <li>サーチクロス(ビレッジセンター) <ul><li>形態素解析によるわかち書きは採用せず。</li> <li>詳細なアルゴリズムは不明だが、文字種により単語を分割し、インデックスに登録していくタイプと思われる。</li> <li>ひらがなは事前に辞書登録されたもの以外は検索できない。</li> <li>アルゴリズムが単純な分、インデクシングが極めて高速。</li></ul></li> <li>コンセプトサーチ(ジャストシステム) <ul><li>自然言語による検索が可能。</li> <li>文書管理アプリケーションDocuWorks(富士フイルムビジネスイノベーション)のバージョン6.0より「ExpandFinder」という名称でバンドルされている。</li></ul></li> <li>分散インデックス型 全文検索ソフト: Pokuda Search Pro <ul><li>Apache Tikaによるテキスト抽出とApache Luceneによる全文検索</li> <li>PDF、新旧Officeドキュメント、OpenOfficeドキュメント、MP3, MP4のメタ情報の検索に対応</li></ul></li></ul> <h2>アルゴリズム</h2> <p>リニアサーチ(通称「馬鹿サーチ」)やバイナリーサーチ(二分法)、ハッシュ法などがあるが、それぞれ得失があり、「辞書の登録語彙数が多くなると手間数が増えて遅くなる」という問題がある。 </p><p>一般的な検索エンジンではダブル配列法が用いられているようだが、ダブル配列法は主記憶領域が狭い過去の環境に合わせて開発されたらしいので、現在では可読性が悪いため採用するのはお奨めできない ダブル配列法の解析から、その祖形であるトリプル配列法が発見(おそらくは再発見)されたが、発明者は知られていない。 トリプル配列は、辞書登録語彙に関わらず、最長の登録語彙の長さ l に比例した手間数しかかからないのでお手軽なあるアルゴリズムだが、最長語彙 l が増えるとヒットする語数が減るので、途中でリニアサーチに切替えるとコンパクトになる。また、プログラミング言語の予約語のように数が限られていて頻出する語については、ハッシュ法を使ったほうが簡単である。 </p> <h2>脚注</h2> <h2>関連項目</h2> <ul><li>文字列探索</li> <li>情報検索</li> <li>概念検索</li> <li>検索エンジン</li> <li>形態素解析</li> <li>エンタープライズサーチ</li></ul> <h2>外部リンク</h2> <ul><li>日本語全文検索エンジンソフトウェアのリスト(2003年ごろまでの全文検索エンジンの一覧)</li> <li>21世紀の最新エンジンたち(Namazu・Rast・HyperEstraier・Sennaの特徴、適合率・再現率の解説)</li> <li>BYTE LAB「デスクトップ検索」<全5回>:ITpro</li></ul><br><p><img src="https://ferret-one.akamaized.net/images/590833a0256aa655950056b5/original.jpeg?utime=1493709728" alt="全文検索導入で失敗しない!" onerror="this.onerror=null;this.src='https://ts2.mm.bing.net/th?id=OIP.biqzZMBW0rBQ_fA4tNfvPwHaC6;" ></p><p><img src="https://i.ytimg.com/vi/9d6rTPV1jAE/maxresdefault.jpg" alt="文字位置まで探せる全文検索 YouTube" onerror="this.onerror=null;this.src='https://ts2.mm.bing.net/th?id=OIP.m9dkuX6LizYPYzG3B6_0NAHaEK;" ></p><p><img src="https://wagby.com/images/manual8/textsearch-def1.gif" alt="全文検索" onerror="this.onerror=null;this.src='https://ts2.mm.bing.net/th?id=OIP.Nru6ZGbOSjj7c0BKL4468AHaFE;" ></p><p><img src="https://ogimage.blog.st-hatena.com/12704591929888232442/6435922169448688117/1360047042" alt="全文検索 初めてのシステムと日記" onerror="this.onerror=null;this.src='https://ts2.mm.bing.net/th?id=OIP.xtRas70-8u3I9WWQbvcoqgHaD4;" ></p><p><img src="http://www.searchplusplus.jp/img/cover.44127ad5.png" alt="インデックス型全文検索ツール Search++" onerror="this.onerror=null;this.src='https://ts2.mm.bing.net/th?id=OIP.RBJ61fcPZDtzqVBVDjzHrAHaDx;" ></p> </div> <footer class=post-footer> <ul class=post-tags></ul> <nav class=paginav><a class=prev href=https://labjarvkh.pages.dev/posts/ynowneixu-5ea248e7f54f53250adc5b8a40a4c8c7><span class=title>« Prev</span><br><span>リスボン市長</span></a> <a class=next href=https://labjarvkh.pages.dev/posts/ynowneixu-f6eac7df42344fccb2b382012d4d7ff3><span class=title>Next »</span><br><span>吉見祐治</span></a> </nav> </footer> </article> </main> <footer class=footer><span>© 2025 <a href=https://labjarvkh.pages.dev>John Ten</a></span></footer> <script type=text/javascript src=/ads/floating.js></script> <a href=#top aria-label="go to top" title="Go to Top (Alt + G)" class=top-link id=top-link accesskey=g><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentcolor"><path d="M12 6H0l6-6z"/></svg></a> <script> let menu = document.getElementById("menu"); menu && (menu.scrollLeft = localStorage.getItem("menu-scroll-position"), menu.onscroll = function() { localStorage.setItem("menu-scroll-position", menu.scrollLeft) }), document.querySelectorAll('a[href^="#"]').forEach(e => { e.addEventListener("click", function(e) { e.preventDefault(); var t = this.getAttribute("href").substr(1); window.matchMedia("(prefers-reduced-motion: reduce)").matches ? document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView() : document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView({ behavior: "smooth" }), t === "top" ? history.replaceState(null, null, " ") : history.pushState(null, null, `#${t}`) }) }) </script> <script> var mybutton = document.getElementById("top-link"); window.onscroll = function() { document.body.scrollTop > 800 || document.documentElement.scrollTop > 800 ? (mybutton.style.visibility = "visible", mybutton.style.opacity = "1") : (mybutton.style.visibility = "hidden", mybutton.style.opacity = "0") } </script> <script> document.getElementById("theme-toggle").addEventListener("click", () => { document.body.className.includes("dark") ? (document.body.classList.remove("dark"), localStorage.setItem("pref-theme", "light")) : (document.body.classList.add("dark"), localStorage.setItem("pref-theme", "dark")) }) </script> </body> </html>