「全文検索」とは?
状態:-
閲覧数:1,907
投稿日:2017-03-05
更新日:2017-03-23
文書内の要素を検索する
文字列を格納するデータ型が対象
・CHAR
・VARCHAR
・TEXT
検索文字列
・単語の組み合わせ
・フレーズ: “検索する文字列”
・ワイルドカード: * – ブール全文検索演算子: +, -, ~
・関連重み付け文字: <, >
種類
・全文検索インデックス無しでの検索
・全文検索インデックス有りでの検索
インターネット上に存在する文書をクロール・インデックス
・何十億という文書をインデックスするため検索システムは非常に巨大なものになる
ユーザーが発行したクエリにヒットする(クエリを含む)文書集合の場所(URLなど)をユーザーへ返す
・ユーザーが発行する検索クエリに対して高速に結果を返す必要がある
Web文書全体を対象とする検索エンジンを構築する場合
・検索対象とする文書は手元にないため、収集する必要がある
単純な RDBMS は大規模な全文検索には基本的に向かない
・一般的なRDBは不向き
・各検索エンジンは MySQL でも PostgreSQL でもない、独自のデータ構造を持った DB (RDBMS とは限らない) を使っている
適合率、再現率の高さ
曖昧だったり間違った言葉だったりしてもそれを正しい検索結果に導いてくれる
わざわざ入力を全部しなくても補完してくれるサジェスチョンなどのUI
文字列を格納するデータ型が対象
・CHAR
・VARCHAR
・TEXT
検索文字列
・単語の組み合わせ
・フレーズ: “検索する文字列”
・ワイルドカード: * – ブール全文検索演算子: +, -, ~
・関連重み付け文字: <, >
種類
・全文検索インデックス無しでの検索
・全文検索インデックス有りでの検索
「全文検索エンジン」の機能
インターネット上に存在する文書をクロール・インデックス
・何十億という文書をインデックスするため検索システムは非常に巨大なものになる
ユーザーが発行したクエリにヒットする(クエリを含む)文書集合の場所(URLなど)をユーザーへ返す
・ユーザーが発行する検索クエリに対して高速に結果を返す必要がある
前提
Web文書全体を対象とする検索エンジンを構築する場合
・検索対象とする文書は手元にないため、収集する必要がある
単純な RDBMS は大規模な全文検索には基本的に向かない
・一般的なRDBは不向き
・各検索エンジンは MySQL でも PostgreSQL でもない、独自のデータ構造を持った DB (RDBMS とは限らない) を使っている
ユーザーが求めている機能
適合率、再現率の高さ
曖昧だったり間違った言葉だったりしてもそれを正しい検索結果に導いてくれる
わざわざ入力を全部しなくても補完してくれるサジェスチョンなどのUI
クローラ
クローラとは?
URLを巡回(クロール)して未インデックスの文書や前回の取得時から変更のあった文書を取得し順次、インデックスしていくコンポーネント
検索方法
A.全文照合方式 / 全文書走査
検索対象の文書をすべて走査して,一致する文字列を含む文書を探す方法
・クエリ発行後、検索対象の文書1つ1つが「クエリ単語」を含んでいるのかチェックする
・非常に簡単に実装できる(UNIXの「grep」コマンドで実装できる)
・全文を突っ込んだフィールドに対して LIKE 演算子で単純な中間一致検索
・便利
・最も単純な手法
全文照合アルゴリズム
・KMP(Knuth-Morris-Pratt)法
・BM(Boyer-Moore)法
問題点
・検索のたびに対象のテキストデータをメモリ上に読み込んで照合処理を行うため,大量の検索対象の場合,どうしても検索時間がかかる
・クエリ発行後に対象文書集合を走査するため、「対象となる文書の数が大きくなると、検索に時間がかかり過ぎる」
・単純な中間一致検索は対象のデータを毎回全文嘗め回すので、データ量が増えるとそれに比例して遅くなってしまう
向いている対象
・検索対象が少量
・検索回数も少ない
B.索引方式 / インデックス
予め検索対象の文書をいったんメモリ上に読み込み,検索語に対応する索引データを作成する前処理を行う
・検索時には,予め作成されている索引を元に,合致した文書を見つけ出す方法
・ユーザーがクエリを発行した際、インデックスを持つ検索エンジンは自身のインデックスを調べてクエリ単語を含む文書集合を返す
・ここでいうインデックスは「どの文書が、どの単語を含むのか」という情報を保存するテーブル
・大量の文書集合を高速に検索できる
特徴
・高速に大量の文書を検索するのに向いている
・クエリを含む文書を収集する時間を短縮できる
・インデックスを利用した検索システムと全文書のコンテンツを走査する検索システムを比較すると、多くの場合インデックスを利用した検索システムの方が高速に動作する
・検索対象となる文書数(量)が大きくなっても、検索性能はそれほど劣化しない(注:正確には検索エンジンを保持する計算機のメモリ量とインデックスの大きさなどに依存する)
・大規模データを扱う高負荷な環境では、インデックスの利用が「ほぼ必須」
問題点
・予め索引を作成する必要がある
・索引の作成処理は,かなり負荷の高い処理
向いている対象
・検索対象が大量
・頻繁に検索
インデックスのデータ構造の種類
・「転置」インデックス
・「接尾辞配列」インデックス
利用される手法
・形態素解析方式
・N-Gram方式
MySQL
全文検索をサポートしているストレージエンジンは?
デフォルトで導入されているMyISAMとInnoDB
日本語文章を全文検索するためのカラム
・「単語」と「単語」を、「空白」や「カラム」で区切った状態にしておく必要がある
検索エンジンの具体例
Apache Lucene
Javaで記述された全文検索ソフトウェア
・予め蓄積した大量のデータから、指定したキーワードを探し出す機能を持つ
・Javaのクラスライブラリとして提供される
Elasticsearch
Elastic社のもとでOSSとして開発されている「Lucene」ベースのオープンソース全文検索エンジン
・Nodeが必要
・Apache Solr vs Elasticsearch
全文検索用のライブラリApache Luceneを利用したデータストア
・RDBとは異なる
データストアとは?
・データを決められた形式で記憶装置などに永続的に保存・蓄積するソフトウェア、および、そのような機能・処理
形態素解析系
・BigTable
・Googleのほとんどのサービスを支えるBigtableの誰でも使える版 Cloud Bigtable
・Googleの誇る巨大データベースBigTableのオープンソースクローン「Hypertable」
・Hypertable - Big Data. Big Performance
Groonga
C言語で書かれた国産の全文検索エンジン
・グルンガ
・An open-source fulltext search engine and column store
・MySQLのストレージエンジンとしてSQLベースで容易に高速な全文検索が可能なMroongaが提供されている
Senna 組み込み型全文検索エンジン
Fess
・Java 1.8利用
・OSには依存しない
・Web以外に共有フォルダなどもクロールできる
・クローリングの設定など必要な設定はすべてGUI上でできる
・Elasticsearchを検索エンジンとして利用している(内包しているので別途インストールの必要はない)
最終更新2014年
FINDSPOT
・有償
・オープンソースでの公開が計画されていたが、取り止めになった…
・現在の開発状況は不明
最終更新2011年
Namazu
・バックエンドに RDBMS は使っておらず、独自のデータ構造を持ったデータベースを構築している
・形態素解析方式
・chasenもしくはKAKASIの形態素解析を利用し,わかち書きをした上でインデックスをかける
・機能的にはChaSenの方が高度な分析が行える
・スピード的にはKAKASIの方が高速
・全文検索で文書の山に立ち向かう
最終更新2010年
Tritonnプロジェクト
最終更新2007年
Hyper Estraier