 全文検索の仕組み http://opensedk.sourceforge.jp/pukiwiki.php?%C1%B4%CA%B8%B8%A1%BA%F7%A4%CE%BB%C5%C1%C8%A4%DF [ リロード ]   [ 新規 | 編集 | 凍結解除 | 差分 | 添付 ]   [ トップ | 一覧 | 単語検索 | 最終更新 | バックアップ | ヘルプ ] --------------------------------------------------------------------------------最新の20件2005-09-16 コンテンツ管理システム RSS/1bの一部としてのkoike 2005-08-13 RSS/1の全体の構造 Open-SEDKプロジェクト 2005-08-07 分散サービスレジストリ 2005-07-31 開発ノート：他DSRのサービス検索 2005-07-12 ストレージシステム 2005-06-16 ConcreteInterfaceFactory SearchEngine 関連システムとの接続インターフェース 全文検索の仕組み サマリー(要約) ドキュメント インデックス 2005-06-11 全文検索システム 2005-06-08 CVSサーバー上のプロジェクト一覧 2005-05-15 提供パッケージの依存関係 2005-04-09 console/shell 2005-04-06 全文検索apサーバー'phalanx' 2005-04-03 testsite  全文検索システム全文検索の仕組み 1. 検索語→索引語変換 2. 索引語検索 3. 検索結果のとりまとめ→該当ドキュメント特定 4. 検索結果作成 5. 結果の返却全文検索の仕組みSearchEngineクラスは検索コアコンポーネントの単なる基底クラスであるため、具体的な実装がありません。ここでは具体的な実装である、RSSSearchEngineクラスを例に、全文検索の仕組みについて説明します。全文検索処理の大まかな流れは下記の通りです：1. 検索語→索引語変換2. 索引語検索3. 検索結果の取りまとめ→該当ドキュメント特定4. 検索結果作成5. 結果の返却検索条件(SearchConditionクラス)は、条件がネストされていますので、1～3までの処理を再帰的に実行していきます。検索条件は、XMLで表記するとわかりやすいと思います。例えば <AND>   <AND>     <TERM>Open-SEDK</TERM>     <TERM>ソースコード</TERM>     <OR>       <TERM>download</TERM>       <TERM>ダウンロード</TERM>     </OR>   </AND> </AND>SearchConditionクラスはElementの派生クラスで、要素型(type)は'AND'です。従って、上記XMLの最上位の階層はANDになっています。SearchConditionクラスにぶら下がっている要素は、AND/OR/TERMのいずれかです。TERM>は検索語そのものを示します。AND>は</AND>との間に存在する内容について、論理積をとります。OR>は</OR>との間に存在する内容について、論理和をとります。上記のXMLは、次のような意味です：『"Open-SEDK"と"ソースコード"、("download"か"ダウンロード"のいずれか)を全て含む』↑1. 検索語→索引語変換検索時に指定される検索文字列(検索語と呼びます)は、そのままではインデックスシステムに問いあわせることができませんので、一度索引語に変換します。具体的には、検索語をParserを使ってn-gram分割します。インデックスシステムに対しては、分割生成された索引語の位置情報を要求し、全ての索引語を含む(AND演算)ドキュメントを特定します。検索語を分割する際のn-gram長は、索引語を作成した際の長さと必ず一致していなければなりません。↑2. 索引語検索検索条件の処理中、Element#getElementType()の内容がElement.TYPE_TERMのものを発見した際、1.の検索語→索引語変換をした後、分割生成された索引語全ての位置情報をインデックスシステムに対して要求します。取得できたら、位置情報全てについてAND演算を適用し、更にSEQ演算を適用します。↑3. 検索結果のとりまとめ→該当ドキュメント特定AND演算には、org.logical_paradox.koike.rss.search.lo.AndLogicalOperatorを使用します。AND演算によって、全ての索引語を含むドキュメントと関連する位置情報に絞ることができます。全ての索引語が同じドキュメントのバラバラの位置に配置されている可能性があるため、全ての索引語が連続して存在するかどうかも調べる必要があります。この演算を、SeqLogicalOperatorが実行します。SEQ演算というのは、オリジナルの論理演算子です。与えられた引数が全て連続した位置に配置されているかどうかを返します。ある検索語のANDとSEQ演算の様子を、下記に図示します。----------------------------------------------------------------------------------------------------------------------------------------------------------------Element.TYPE_TERMの結果として、これらの結果を返しますが、AND/OR演算の場合、これらの結果について更にAND演算を適用します。適用処理には、同じくAndLogicalOperatorを使用します。このようにして再帰的に処理し、最終的に残ったものが検索結果となります。↑4. 検索結果作成1～3を再帰的に実行することによって、最終的に1つのKoikeIndexResultSetの形で検索結果を抽出することができます。この結果を踏まえて、検索結果を作成します。検索結果は、org.logical_paradox.koike.core.search.ResultSetの配列の形で返却します。配列の要素数は、検索の結果、該当したドキュメントの数と一致します。KoikeIndexResultSetの格納されている位置情報から、ノードIDとドキュメント番号を取得して、ドキュメント管理システムからドキュメントに関する情報を取得します。取得できたドキュメントに対して、サマリーを作成し、取得できた追加情報を添付してResultSetを作成します。↑5. 結果の返却SearchEngine#search()メソッドは最終的に4.で生成されたResultSetの配列を検索結果として検索要求元に返却します。検索結果の型を変換する必要があれば、検索を要求した側が責任もって変換するようにします。 --------------------------------------------------------------------------------                       Last-modified: Thu, 16 Jun 2005 22:33:17 JST (100d)Modified by me "PukiWiki" 1.4.3 Copyright © 2001,2002,2003 PukiWiki Developers Team. License is GNU/GPL.Based on "PukiWiki" 1.3 by sng Powered by PHP 4.3.10-16 HTML convert time to 0.244 sec. 