Sc2009autumn s2robot

46
Seasar Conference 2009 Autumn Copyright© 2002-2008 N2SM, Inc. All Rights Reserved S2Robotで泳ぎませんか? ~S2RobotとFessのご紹介~ 株式会社エヌツーエスエム 菅谷信介

Transcript of Sc2009autumn s2robot

Page 1: Sc2009autumn s2robot

Seasar Conference2009 Autumn

Copyright© 2002-2008 N2SM, Inc. All Rights Reserved

S2Robotで泳ぎませんか?~S2RobotとFessのご紹介~   

株式会社エヌツーエスエム菅谷信介

Page 2: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

自己紹介 名前: 菅谷信介 所属: N2SM, Inc. オープンソース活動:

– Apache Portals (Jetspeed, Portals Bridges) コミッタ– Seasarプロジェクトコミッタ(S2Container, Teeda,

SAStruts, DBFlute, S2Portlet, S2Robot..)– Portal Application Laboratory(PAL)プロジェクト運

営– Fessプロジェクト運営などなど・・・

ブログ: http://d.hatena.ne.jp/shinsuke_sugaya/

Page 3: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

Agenda S2Robot の概要 S2Robot の使い方 Fess の概要 Fess の特徴 Fess の使い方

Page 4: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

S2Robot

Page 5: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

Seasar2ベースのクローラフレームワーク「クローラ (Crawler) とは、ウェブ上の文書や画像などを周期的に取得し、自動的にデータベース化するプログラムである。「スパイダー」や「ロボット」などとも呼ばれ

る。」 出典: フリー百科事典『ウィキペディア(Wikipedia)』

コンポーネント化され、機能を柔軟にカスタマイズ可能

S2Robotとは

インターネットS2Robot

Page 6: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

全文検索のインデックス作成→ 一番多いパターン(だと思う)

サイトの商品情報などを抜き出し→ ページ上の特定のデータを抜き出してDBに保存するなど

SEOチェックツール→ リンク切れとか、要素数を数えるなど

クローラを開発するというニーズは意外と多いHTTP通信やページ解析が面倒だから?

→実際に面倒でした…

クローラの利用場面

Page 7: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

Webおよびローカルファイルシステムを対象 マルチスレッドクローリング 巡回する深さ、コンテンツ取得数を指定可能 巡回するコンテンツをURLでフィルタリング 柔軟に拡張可能なコンテンツ処理ルール 取得したコンテンツを指定した形式でDBに格納 画像や音声など様々なファイルから文字列抽出 robots.txt に従うクローリング

S2Robotの特徴

Page 8: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

S2プロジェクトなら dicon に追加

S2Robotのセットアップ

<components> : <include path="s2robot.dicon"/> :</components>

備考: DBを利用する場合は s2robot_db.dicon を利用

簡単に使えます!

あとは、S2Robot を DI すれば利用可能

Page 9: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

S2Robot のインスタンスを取得して実行

S2Robotの使い方(基本編)

// container から取得する場合S2Robot s2Robot = (S2Robot) container .getComponent(S2Robot.class);

// URL の追加 (この URL を起点にして巡回します)s2Robot.addUrl(url);// 巡回する深さを指定s2Robot.setMaxDepth(depth);

// クロールの実行 (実行時のセッション ID が返ります)String sessionId = s2Robot.execute();

カレントディレクトリに取得したものを保存

Page 10: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

S2Robotの処理フロー

S2Robot

S2RobotThreadS2RobotThreadS2RobotThread S2RobotClient(Web,FS)

UrlFilter WebFS

execute()

start() Check the URL

Get the Content

ResponseData

RuleManagerRule

ResponseProcessor

process()

Transformer

ResponseData

ResultData

S2Robot DB

store()AccessResult

1

2

3

4

5

6

78

9

101112

WebFSWebFS

Page 11: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

スレッド数の変更

巡回して取得するファイル数

URLキューが空のときに待つ回数

S2Robotの使い方(応用編 ~ その1)

// デフォルトのスレッド数: 10s2Robot. setNumOfThread(20);

// デフォルトの巡回取得数: 0 (無制限)s2Robot. setMaxAccessCount(10000);

// デフォルトの待つ回数: 20s2Robot. setMaxThreadCheckCount(30);

Page 12: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

バックグラウンドで実行

バックグラウンド実行後、終了を待つ

セッションIDの指定 (再実行するときなどに利用)

S2Robotの使い方(応用編 ~ その2)

// デフォルト: false (execute() した後に待つ)s2Robot. setBackground(true);

// デフォルトの待ち時間 (ms): 0 (無制限)s2Robot. awaitTermination(60000);

// デフォルトのセッションID: yyyyMMddHHmmssSSSs2Robot. setSessionId(“200909120123456”);

Page 13: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

アクセスするURLを制限することが可能 S2Robot 内の UrlFilter がアクセス先の URL を制御 アクセスできる URL を指定: addIncludeUrl()

アクセスしない URL を指定: addExcludeUrl()

デフォルトの実装 UrlFilterImpl を dicon で差し替えも可能

URLフィルタ

// 例: http://www.n2sm.net/ 以下だけにするs2Robot. addIncludeFilter(“http://www.n2sm.net/.*”);

// 例: jpg ファイルをアクセスしないs2Robot. addExcludeFilter(“.*\\.jpg”);

Page 14: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

指定されたコンテンツの取得 CommonsHttpClient: http/https からコンテンツを取得 FileSystemClient: ローカルファイルシステムから取

得 S2RobotClientFactoryがS2RobotClientを管理

clientFactory は S2Container から取得可能 client.doGet(uri) でコンテンツを ResponseData で返

す 拡張は S2RobotClient を実装して s2robot_client.dicon

で addClient に加える

S2RobotClient

// url を元に適切なクライアントを判別 (http:,https:,file:)S2RobotClient client = clientFactory.getClient(url);

Page 15: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

RuleManager: 取得したコンテンツの処理ルールを決定

Rule: コンテンツの処理内容を定義 RuleManager から Rule を取得

RuleManagerは S2Container からは取得できない (prototypeでS2Robotにセットされるため)

拡張は s2robot_rule.dicon で定義することが可能

RuleManager & Rule (その1)

// responseData を元に適切なルールを判別Rule rule = s2Robot. getRuleManager() .ruleManager.getRule(responseData);

Page 16: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

addRule で複数ルールを追加することが可能

RuleManager & Rule (その2)

<components> <include path="s2robot_transformer.dicon"/>

<component name="ruleManager" class="org.seasar.robot.rule.impl.RuleManagerImpl" instance="prototype"> <initMethod name="addRule"> <arg>fileRule</arg> </initMethod> </component>

<component name="fileRule" class="org.seasar.robot.rule.impl.RegexRule"> <property name="defaultRule">true</property> <property name="responseProcessor"> <component class="org.seasar.robot.processor.impl.DefaultResponseProcessor"> <property name="transformer">fileTransformer</property> </component> </property> </component></components>;

Page 17: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

ResponseDataを処理する DefaultResponseProcessor: 保持するTransformerを実

Transfomerは s2robot_rule.dicon で指定される NullResponseProcessor: 何もしない

ResponseProcessor

// RuleからResponseProcessorを取得 ResponseProcessor processor = rule.getResponseProcessor();processor.process(responseData);

Page 18: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

ResponseDataをResuleDataに変換する ResultDataは取得データを加工したものを保持

例: 画像のメタデータから文字列を取得して保存など s2robot_transfomer_basic.dicon に基本的なものを定

保存データを復元も可能

Transfomer (その1)

// ResponseDataをResuleDataに変換 ResultData resultData = transformer.transform(responseData);

Transfomer transfomer = container .getComponent(“fileTransfomer”);// getData() で返されるものは各Transformerで定義Object obj = transformer. getData(accessResultData);

Page 19: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

BinaryTransformer: バイナリデータをResultDataに格納

FileTransformer: カレントディレクトリにファイルとして保存

し、ResultDataにパスを格納 HtmlTransformer:

HTMLのバイナリデータと次のリンク先をResultDataに格納 XpathTransformer:

上記の拡張。指定したノードデータをXML形式で保存 TextTransformer:

文字列をResultDataに格納。Extractor機能を利用して様々な形式に対応。

Transfomer (その2)

Page 20: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

様々なファイルから文字列を取得 対応フォーマットはMS Office, pdf, zip など多数 ExtractorFactoryがExtractorを管理

extractorFactoryはS2Containerから取得可能 Extractorの単体利用も可能 (s2robot_extractor.dicon)

Extractor

Extractor extractor = extractorFactory.getExtractor(mimeType);ExtractData extractData = extractor.getText(inputStream);String content = extractData.getContent();// content に inputStream のデータ本体の文字列だけ入るfor (String key : extractData.getKeySet()) { String[] values = extractData.getValues(key); // values にはメタ情報が入る}

Page 21: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

データ格納用エンティティ AccessResult: アクセス結果のパラメータ AccessResultData: 加工後のコンテンツデータ ResponseDataとResultDataからAccessResultと

AccessResultData を生成 DataService インターフェース経由でアクセス 現在、オンメモリまたはDBに保存することが可能

AccessResult & AccessResultData

Page 22: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

AccessResultとAccessResultDataの取得や保存など S2Containerから取得することが可能 AccessResultの取得

あるセッションIDのAccessResult群を取得

DataService

// セッションIDとURLをキーにして取得AccessResult accressResult = dataService .getAccessResult(sessionId, url);

dataService.iterate(sessionId, new AccessResultCallback() { public void iterate(AccessResult accessResult) { // accessResult の処理… }});

Page 23: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

マルチスレッドクローリング→ 同期を最低限にしたり、結構がんばりが必要

壊れた HTML→ nekohtml が結構吸収してくれるけど→ 大手サイトのページでもおかしいものがあったりする…

コンテンツ取得数の指定→ マルチスレッドなので上限で止めるのが大変…

S2Robotのスレッドセーフ→ 複数のS2Robotのインスタンスを同時実行

H2Databaseのパラメータ→奥深い・・・(よくわからん)

S2Robotの苦労話 (おまけ?)

Page 24: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

データベース周りの整理 metaタグの robots に従う 壊れたURL対応(不正な文字とかを除外するフィ

ルタ) サイトマップを読む OpenOffice 系ファイル対応

S2Robotの今後

Page 25: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

Fess

Page 26: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

Javaフレンドリーな全文検索システム「全文検索(ぜんぶんけんさく、Full text search)とは、コ

ンピュータにおいて、複数の文書(ファイル)から特定の文字列を検索すること。」 出典: フリー百科事典『ウィキペディア(Wikipedia)』

Apacheライセンスのオープンソースプロダクト ちなみに Full tExt Search System → Fess

Fessとは

Fessサーバファイルシステム インターネット

Page 27: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

Namazu, Hyper Estraier, Senna, Rast, Nutch, Google Mini, FAST ESP, ConceptBase...

Namazu→スケールしない

Google Mini→ブラックボックス→入れ替え作業が発生する

世の中の検索システム

Page 28: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

Java (Seasar2) ベースの検索システムFessの特徴 (その1)

S2ChronosS2Container SAStruts S2Robot

DBFlute

用途に応じて柔軟に対応可能な設計

Page 29: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

標準でオールインワンで提供 Tomcat の起動で利用可能!

Fessの構成図

Tomcat

SAStruts Solr

S2Robot

H2Database

S2Chronos

Seasar2

DBFlute

fess.war solr.war

Page 30: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

S2Robot で Web とファイルシステムをクロール

様々なファイルフォーマットをサポート→テキスト(HTML,XML含む)、MS Office関

連、PDF、zipなどの圧縮ファイル、画像ファイル、音楽ファイル

ブラウザ上でクロール対象設定 検索結果のパス変換 (ローカルパスの変換と

か) クロール情報のサマリー表示

Fessの特徴 (その2) ~ S2Robotなど

Page 31: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

Luceneベースのオープンソース検索サーバー XML/HTTP や JSON の API Fess のUI から SolrJ で接続 ファセット検索 検索結果の強調表示 SHOOTIで約2億のWebページをインデックス

Fessの特徴 (その3) ~ Apache Solr

Fess ではSolrサーバーをグループ化して状態管理(ハイエンドユースを視野に入れた設計)

Page 32: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

検索サーバ・更新サーバ交換方式Solrサーバ構成例1

Fess

Solr Group 1

Solr Group 2

検索

更新

Page 33: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

レプリケーション方式Solrサーバ構成例2

Fess

Solr Group 1

Solr Group 2

検索

更新

インデックスコピー

Page 34: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

分散クロール方式Solrサーバ構成例3

Fess

Solr Group 1

Solr Group 2

検索

更新

インデックスコピー

Fess DB

Page 35: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

携帯向けアプリ構築のオープンソースフレームワーク→ 3キャリアの絵文字に対応→ 3キャリアの絵文字入りメール/添付メール/デコメールの

送信に対応→ 画像を動的にリサイズ表示→ 端末プロファイル情報などを取得可能→ GPS/GoogleMapインターフェースを提供

Fessの特徴 (その4) ~ mobylet

Fessでは各端末に最適な表示を実現

Page 36: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

検索語を入力

Fess のUI (検索結果)

Page 37: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

管理者でログイン クロール時刻、インデックス操作、モバイル変換

を設定

Fessの管理UI (クローラ設定)

Page 38: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

クロールするウェブ情報の設定管理

対象URLとフィルタ 各種パラメータ ユーザーエージェント名 ブラウザタイプ

Fessの管理UI (ウェブクロールの設定)

Page 39: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

クロールするファイルシステム情報の設定管理

対象パスとフィルタ 各種パラメータ ブラウザタイプ

Fessの管理UI (ファイルシステムクロールの設定)

Page 40: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

検索結果のリンクを書き換えるクロールした結果がファイルシステムの場合にブラウザか

らアクセスできるように書き換えるなどで利用

Fessの管理UI (パスマッピング設定)

Page 41: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

検索結果表示時にブラウザの種類で表示を切り替え

モバイルでアクセスした場合はモバイルページに移動

Fessの管理UI (ブラウザタイプ設定)

Page 42: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

Solrの状態と設定管理 グループ化された Solr に対して、コミット、最適

化、削除を実行可能

Fessの管理UI (Solr設定)

Page 43: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

クロール結果の情報表示

クロール時間 インデックス数

Fessの管理UI (セッション情報)

Page 44: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

プロジェクトサイト:http://fess.sourceforge.jp/ja/

Fess Server 1.0.0 が利用可能

Fess の情報

要望などあればお知らせください

Page 45: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

認証サイトへのアクセス ログファイルのダウンロード リクエストヘッダーの付加 重複ドメインの除外 ロールによる検索結果の出しわけ ラベル付け Solr のアップグレード

Fess の今後

Page 46: Sc2009autumn s2robot

Seasar Conference 2009 Autumn

ありがとうございました