SlideShare una empresa de Scribd logo
1 de 32
AlfrescoとSolr
- Alfresco勉強会 第11回 -




                                      2012/11/7 @mryoshio




                       Copyright 2012 tachibanakikaku.com. All rights reserved.
目次


‣ 自己紹介

‣ AlfrescoとSolr

‣ アーキテクチャ

‣ インストール,設定

‣ ソースコード解説

‣ おわりに
自己紹介


‣ mryoshio
  → A社の社員

  → AlfrescoやLiferayのコンサルタント

  → ソースコードを読んだりカスタマイズしたり

  → Twitterとか色々なところにいます

  → Solr/Lucene周りで遊びたいけど時間とれてない

  → GAE使って作りたいものあるけど(ry
AlfrescoとSolr
Alfrescoとは


‣ 何?
 → 英Alfresco社が提供するオープンソースソフトウェア。企業規模のコンテンツ
   管理を行える。それ以外に,Webコンテンツ管理やコラボレーションを低コ
   ストで行える

‣ 似た機能をもつ製品は?
 → SharePoint(コラボレーション),Documentum(コンテンツ管理)あた
   りが該当する。DM,WCM,Shareにより異なる種類の製品に該当

‣ 特徴は?
 → Community版 (無償)とEnterprise版(有償)が存在

 → 多くのインターフェース(e.g. DM,Share,WCM)が存在
Solrとは


‣ エンタープライズ検索プラットフォーム
 → Apache Luceneプロジェクトから派生した人気のある検索プラット
   フォーム。ヒット部分のハイライト,ファセットサーチなど豊富な機
   能がある。スケーラブルで分散した検索やインデクスレプリケーショ
   ンも可能

‣ スタンドアロンの全文検索サーバ
 → Tomcatなどサーブレットコンテナ上で動作する。Luceneを検索ラ
   イブラリとして使用し,インデクスを用いた全文検索を行う。REST
   ライクなHTTPベースのXMLやJSONインターフェースを持ち,プロ
   グラマブルにドキュメントの操作を行える

                         http://lucene.apache.org/solr/
Alfresco Solr Plugin


‣ 内包LuceneでなくでなくSolrで検索を行う

‣ Alfrescoクラスタリングを行う場合,
  検索インデクスのレプリケーションが不要

‣ 基本的に外部のSolrインスタンスへ
  HTTPベースで問い合わせを行う
メリット,デメリット


‣ メリット
 → 前頁を参照

‣ デメリット
 → WCMを使えない

 → RMモジュールを使えない

 → マルチテナントを使えない

 → トランザクション内でのインデクシングなど
   一貫性を重視する場合には使えない

                  ※ http://wiki.alfresco.com/wiki/Alfresco_And_SOLR
(参考)スクリーンショット
アーキテクチャ
パターン1:AlfrescoとSolrが別居
パターン2:AlfrescoとSolrが同居
インストール,設定
Alfrescoのインストール


‣ 過去の勉強会資料を参照
 → http://www.slideshare.net/mryoshio/alfresco-install

‣ alfresco-community-4.0.e.zipをダウンロード
 → https://wiki.alfresco.com/wiki/Community_file_list_4.0.e
SolrおよびSolr Pluginのインストール


‣ 過去の勉強会資料を参照
  → http://www.slideshare.net/TasukuOtani/
    alfrescostudy4alfresco4solrintegration

  → この資料では同じTomcatにAlfresco,Solrを載せている

‣ alfresco-community-solr-4.0.e.zipをダウン
  ロード
  → https://wiki.alfresco.com/wiki/Community_file_list_4.0.e
動作確認


‣ Alfresco Tomcatのlog4j.propertiesへ追記
    → log4j.logger.org.alfresco.repo.search.impl.solr.SolrQueryHTTPC
      lient=debug

‣ Alfrescoを起動
    → ログイン後,検索を実行 => システムエラーの発生を確認
2012-10-24 15:39:48,522 ERROR [ui.common.Utils] [http-8080-4] システムエラーが発生したため、検索できませんでした: 09240004
 org.alfresco.repo.search.impl.lucene.LuceneQueryParserException: 09240004
        at org.alfresco.repo.search.impl.solr.SolrQueryHTTPClient.executeQuery(SolrQueryHTTPClient.java:364)
        at org.alfresco.repo.search.impl.solr.SolrQueryLanguage.executeQuery(SolrQueryLanguage.java:49)
        at org.alfresco.repo.search.impl.solr.SolrSearchService.query(SolrSearchService.java:348)
        at org.alfresco.repo.search.SearcherComponent.query(SearcherComponent.java:78)
(中略)
        at java.lang.Thread.run(Thread.java:680)
Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
(後略)
動作確認


‣ Solrを起動
     → 再度Alfrescoにて検索を実行 => catalina.outへログが出力される

2012-10-24 15:45:54,157 DEBUG [impl.solr.SolrQueryHTTPClient] [http-8080-3] Sent :/solr/alfresco/alfresco?q=%28%28+TYPE
%3A%22%7Bhttp%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%7Dcontent%22++AND+%28%40%5C%7Bhttp
%5C%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%5C%7Dname%3A%22simple%22++TEXT%3A%22simple
%22%29%29+%28+TYPE%3A%22%7Bhttp%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%7Dfolder%22++AND+
%28%40%5C%7Bhttp%5C%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%5C%7Dname%3A%22simple%22+
%29%29%29+AND+NOT+ASPECT%3A%22sys%3Ahidden%22+&wt=json&fl=*
%2Cscore&rows=500&df=TEXT&start=0&locale=ja_JP&fq=%7B%21afts%7DAUTHORITY_FILTER_FROM_JSON&fq=%7B%21afts
%7DTENANT_FILTER_FROM_JSON
 2012-10-24 15:45:54,157 DEBUG [impl.solr.SolrQueryHTTPClient] [http-8080-3] with: {"textAttributes":[],"allAttributes":
[],"templates":[],"authorities":
["GROUP_ALFRESCO_ADMINISTRATORS","GROUP_EMAIL_CONTRIBUTORS","GROUP_EVERYONE","GROUP_site_admins","GROUP_
site_admins_SiteManager","GROUP_site_swsdp","GROUP_site_swsdp_SiteManager","ROLE_ADMINISTRATOR","ROLE_AUTHENTICA
TED","admin"],"tenants":[""],"query":"(( TYPE:"{http://www.alfresco.org/model/content/1.0}content" AND (@{http://
www.alfresco.org/model/content/1.0}name:"simple" TEXT:"simple")) ( TYPE:"{http://www.alfresco.org/model/content/1.0}
folder" AND (@{http://www.alfresco.org/model/content/1.0}name:"simple" ))) AND NOT ASPECT:"sys:hidden"
","locales":["ja_JP"],"defaultNamespace":"http://www.alfresco.org/model/content/
1.0","defaultFTSFieldOperator":"OR","defaultFTSOperator":"OR"}
 2012-10-24 15:45:54,157 DEBUG [impl.solr.SolrQueryHTTPClient] [http-8080-3] Got: 6 in 904 ms
ソースコード解説
Alfresco Solr Plugin側


‣ solr-tomcat-context.xml

‣ solr.xml

‣ AlfrescoCoreAdminHandler

‣ CoreTracker

‣ CoreWatcherJob

‣ CoreTrackerJob
solr-tomcat-context.xml


‣ Solrのコンテキストを設定するためのファイル

‣ ${TOMCAT_HOME}/conf/Catalina/localhost/
  solr.xmlとして配置

‣ solr.homeを設定

<?xml version="1.0" encoding="utf-8"?>
<Context docBase="@@ALFRESCO_SOLR_DIR@@/apache-solr-1.4.1.war" debug="0" crossContext="true">
 <Environment name="solr/home" type="java.lang.String" value="@@ALFRESCO_SOLR_DIR@@" override="true"/>
</Context>
solr.xml


‣ ${SOLR_HOME}/solr.xml

‣ 前頁の ${TOMCAT_HOME}/conf/Catalina/
  localhost/solr.xmlとは異なるもの

‣ Solrのマルチコア機能を使い複数のコアを設定
    → alfrescoコアのsolr.homeをworkspace-SpacesStoreディレクトリに,
      archiveコアのsolr.homeをarchive-SpacesStoreディレクトリに設定
<?xml version="1.0" encoding="UTF-8" ?>


<solr persistent="true" sharedLib="lib" >
 <cores adminPath="/admin/cores" adminHandler="org.alfresco.solr.AlfrescoCoreAdminHandler">
   <core name="alfresco" instanceDir="workspace-SpacesStore" />
   <core name="archive" instanceDir="archive-SpacesStore" />
 </cores>
</solr>
AlfrescoCoreAdminHandler


‣ マルチコアのハンドリングを行う
      → CoreAdminHandlerを継承

      → coreを指定したactionリクエストを処理

      → handleCustomActionが実際のロジック

      → 重要なメソッド

        AlfrescoCoreAdminHandler ... CoreWatcherJobのスケジューリング

        http://localhost:8080/solr/admin/cores?core=alfresco&action=check

        上記のアクセスを行った場合,下記の分岐に入る

151      if (a.equalsIgnoreCase("CHECK"))
152      {
CoreTracker


‣ インデクスのトラッキングを行う
 → CloseHookを継承

 → solrcore.propertiesから読み込んだcoreの情報を保持
   (e.g. alfresco.host)

 → Jobのスケジューリング

 → Alfrescoへ接続するclientを保持

 → 重要なメソッド

    L.267 CoreTracker

    L.425 getRepoClient

    L. 458 updateIndex
CoreWatcherJob


‣ スケジューリングされるジョブ
 → org.quartz.Jobを継承

 → AlfrescoCoreAdminHandlerでジョブとして生成される

 → AlfrescoCoreAdminHandlerとCoreTrackerの仲立ちを行う

 → 重要なメソッド

    L.44 execute
CoreTrackerJob


‣ インデクスのトラッキングを行うジョブ
 → org.quartz.Jobを継承

 → CoreTrackerのupdateIndexメソッドを実行するジョブとなる

 → 重要なメソッド

    L.42 execute ... CoreTracker#updateIndexをcall
Alfresco側


‣ SolrSearchService

‣ SolrQueryHTTPClient

‣ Alfresco Solr Pluginへ情報を渡すWebScript
SolrSearchService


‣ Solrを使う場合のSearchService
  → org.alfresco.service.cmr.search.SearchServiceを継承

  → 重要なメソッド

     L.137 query ... SearchParameterを設定

     L.318 query ... 検索メソッド本体。最終的に
     SolrQueryHTTPClient#executeQueryを実行
SolrQueryHTTPClient


‣ Solrへのリクエストの組立,実行を行う
  → 重要なメソッド

    L.133 executeQuery ... 検索URL組立,リクエスト送信,結果の返却を実行
情報を渡すWebScript


‣ Alfresco Solr PluginへAlfrescoの情報を渡す
 → webapps/alfresco/WEB-INF/classes/alfresco/templates/
   webscripts/org/alfresco/repository/solr/に存在するWebScript群

    aclChangeSets,acls,aclsReaders

    model,modelsdiff

    nodeContent,nodes,nodesMetaData、

    transactions
おわりに
参考


‣ http://aegif-labo.blogspot.jp/2012/08/
  solrssl.html

‣ http://wiki.alfresco.com/wiki/
  Alfresco_And_SOLR

‣ http://docs.alfresco.com/4.0/index.jsp?topic=
  %2Fcom.alfresco.enterprise.doc%2Fconcepts
  %2Fsolr-webapp-config.html
Copyright 2012 tachibanakikaku.com. All rights reserved.

Más contenido relacionado

La actualidad más candente

全社情報共有サイトへの Alfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
全社情報共有サイトへの Alfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
Ryota Watabe
 

La actualidad más candente (20)

0からわかるAlfresco
0からわかるAlfresco0からわかるAlfresco
0からわかるAlfresco
 
全社情報共有サイトへの Alfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
全社情報共有サイトへの Alfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
 
Alfresco Bulk Import toolのご紹介
Alfresco Bulk Import toolのご紹介Alfresco Bulk Import toolのご紹介
Alfresco Bulk Import toolのご紹介
 
Alfresco勉強会#24 コンテンツのライフサイクル
Alfresco勉強会#24 コンテンツのライフサイクルAlfresco勉強会#24 コンテンツのライフサイクル
Alfresco勉強会#24 コンテンツのライフサイクル
 
Alfresco勉強会#26 Alfresco SDK + Eclipseで開発してみよう
Alfresco勉強会#26 Alfresco SDK + Eclipseで開発してみようAlfresco勉強会#26 Alfresco SDK + Eclipseで開発してみよう
Alfresco勉強会#26 Alfresco SDK + Eclipseで開発してみよう
 
Alfresco勉強会#34 Alfrescoをカスタマイズする時に知っておくと便利なこと
Alfresco勉強会#34 Alfrescoをカスタマイズする時に知っておくと便利なことAlfresco勉強会#34 Alfrescoをカスタマイズする時に知っておくと便利なこと
Alfresco勉強会#34 Alfrescoをカスタマイズする時に知っておくと便利なこと
 
Keycloakの実際・翻訳プロジェクト紹介
Keycloakの実際・翻訳プロジェクト紹介Keycloakの実際・翻訳プロジェクト紹介
Keycloakの実際・翻訳プロジェクト紹介
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
ガチ(?)対決!OSSのジョブ管理ツール
ガチ(?)対決!OSSのジョブ管理ツールガチ(?)対決!OSSのジョブ管理ツール
ガチ(?)対決!OSSのジョブ管理ツール
 
Keycloak入門
Keycloak入門Keycloak入門
Keycloak入門
 
Alfresco紹介
Alfresco紹介Alfresco紹介
Alfresco紹介
 
Goss入門
Goss入門Goss入門
Goss入門
 
Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門
 
Alfrescoクラスタリング入門
Alfrescoクラスタリング入門Alfrescoクラスタリング入門
Alfrescoクラスタリング入門
 
KeycloakでAPI認可に入門する
KeycloakでAPI認可に入門するKeycloakでAPI認可に入門する
KeycloakでAPI認可に入門する
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
 
Jenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーションJenkinsではじめる継続的インテグレーション
Jenkinsではじめる継続的インテグレーション
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 

Similar a AlfrescoとSolr(中編)

alfresco_study_4_alfresco4_solr_integration
alfresco_study_4_alfresco4_solr_integrationalfresco_study_4_alfresco4_solr_integration
alfresco_study_4_alfresco4_solr_integration
Tasuku Otani
 
Alfrescoのバックアップとレストア
AlfrescoのバックアップとレストアAlfrescoのバックアップとレストア
Alfrescoのバックアップとレストア
Ashitaba YOSHIOKA
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
tamtam180
 
Oracle Solaris 11デベロッパーが押さえておきたい機能
Oracle Solaris 11デベロッパーが押さえておきたい機能Oracle Solaris 11デベロッパーが押さえておきたい機能
Oracle Solaris 11デベロッパーが押さえておきたい機能
Kazuyuki Sato
 
20130801 alfresco study17customizemap
20130801 alfresco study17customizemap20130801 alfresco study17customizemap
20130801 alfresco study17customizemap
Takeshi Totani
 
PHPカンファレンス関西2012 Silex
PHPカンファレンス関西2012 SilexPHPカンファレンス関西2012 Silex
PHPカンファレンス関西2012 Silex
Masao Maeda
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
 

Similar a AlfrescoとSolr(中編) (20)

alfresco_study_4_alfresco4_solr_integration
alfresco_study_4_alfresco4_solr_integrationalfresco_study_4_alfresco4_solr_integration
alfresco_study_4_alfresco4_solr_integration
 
Alfrescoのバックアップとレストア
AlfrescoのバックアップとレストアAlfrescoのバックアップとレストア
Alfrescoのバックアップとレストア
 
AlfrescoとSolr(後編)
AlfrescoとSolr(後編)AlfrescoとSolr(後編)
AlfrescoとSolr(後編)
 
開発者向けAlfrescoのご紹介(2013/03/27 JJUG ナイトセミナー「Java製OSS特集」発表資料)
開発者向けAlfrescoのご紹介(2013/03/27 JJUG ナイトセミナー「Java製OSS特集」発表資料)開発者向けAlfrescoのご紹介(2013/03/27 JJUG ナイトセミナー「Java製OSS特集」発表資料)
開発者向けAlfrescoのご紹介(2013/03/27 JJUG ナイトセミナー「Java製OSS特集」発表資料)
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
 
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけねGitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
 
elasticsearchプラグイン入門
elasticsearchプラグイン入門elasticsearchプラグイン入門
elasticsearchプラグイン入門
 
第6回コンテナ型仮想化の情報交換@東京「今日から触れる Solaris Zones 入門」
第6回コンテナ型仮想化の情報交換@東京「今日から触れる Solaris Zones 入門」第6回コンテナ型仮想化の情報交換@東京「今日から触れる Solaris Zones 入門」
第6回コンテナ型仮想化の情報交換@東京「今日から触れる Solaris Zones 入門」
 
第6回コンテナ型仮想化の情報交換@東京「今日から触れる Solaris Zones 入門」
第6回コンテナ型仮想化の情報交換@東京「今日から触れる Solaris Zones 入門」 第6回コンテナ型仮想化の情報交換@東京「今日から触れる Solaris Zones 入門」
第6回コンテナ型仮想化の情報交換@東京「今日から触れる Solaris Zones 入門」
 
FlexJSを追いかける(share)
FlexJSを追いかける(share)FlexJSを追いかける(share)
FlexJSを追いかける(share)
 
Oracle Solaris 11デベロッパーが押さえておきたい機能
Oracle Solaris 11デベロッパーが押さえておきたい機能Oracle Solaris 11デベロッパーが押さえておきたい機能
Oracle Solaris 11デベロッパーが押さえておきたい機能
 
Laravel5を使って開発してみた
Laravel5を使って開発してみたLaravel5を使って開発してみた
Laravel5を使って開発してみた
 
20130801 alfresco study17customizemap
20130801 alfresco study17customizemap20130801 alfresco study17customizemap
20130801 alfresco study17customizemap
 
PHPカンファレンス関西2012 Silex
PHPカンファレンス関西2012 SilexPHPカンファレンス関西2012 Silex
PHPカンファレンス関西2012 Silex
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
Webサーバのチューニング
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳
 
HBase on EC2
HBase on EC2HBase on EC2
HBase on EC2
 
「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ
 

Más de Ashitaba YOSHIOKA

メタプログラミングRuby勉強会#7(fluentプラグイン)
メタプログラミングRuby勉強会#7(fluentプラグイン)メタプログラミングRuby勉強会#7(fluentプラグイン)
メタプログラミングRuby勉強会#7(fluentプラグイン)
Ashitaba YOSHIOKA
 
メタプログラミングRuby勉強会#4
メタプログラミングRuby勉強会#4メタプログラミングRuby勉強会#4
メタプログラミングRuby勉強会#4
Ashitaba YOSHIOKA
 
PolicyとItem (CMIS輪読会#3)
PolicyとItem (CMIS輪読会#3)PolicyとItem (CMIS輪読会#3)
PolicyとItem (CMIS輪読会#3)
Ashitaba YOSHIOKA
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
Ashitaba YOSHIOKA
 
今さら始めるJavaScript
今さら始めるJavaScript今さら始めるJavaScript
今さら始めるJavaScript
Ashitaba YOSHIOKA
 
Alfresco and Web Script (English)
Alfresco and Web Script (English)Alfresco and Web Script (English)
Alfresco and Web Script (English)
Ashitaba YOSHIOKA
 

Más de Ashitaba YOSHIOKA (18)

メタプログラミングRuby勉強会#7(fluentプラグイン)
メタプログラミングRuby勉強会#7(fluentプラグイン)メタプログラミングRuby勉強会#7(fluentプラグイン)
メタプログラミングRuby勉強会#7(fluentプラグイン)
 
AWSを利用した開発者・データを扱う人向けの資料
AWSを利用した開発者・データを扱う人向けの資料AWSを利用した開発者・データを扱う人向けの資料
AWSを利用した開発者・データを扱う人向けの資料
 
メタプログラミングRuby勉強会#5
メタプログラミングRuby勉強会#5メタプログラミングRuby勉強会#5
メタプログラミングRuby勉強会#5
 
メタプログラミングRuby勉強会#4
メタプログラミングRuby勉強会#4メタプログラミングRuby勉強会#4
メタプログラミングRuby勉強会#4
 
千年繁栄する法
千年繁栄する法千年繁栄する法
千年繁栄する法
 
もくもく会について
もくもく会についてもくもく会について
もくもく会について
 
PolicyとItem (CMIS輪読会#3)
PolicyとItem (CMIS輪読会#3)PolicyとItem (CMIS輪読会#3)
PolicyとItem (CMIS輪読会#3)
 
Alfresco Google Docs連携
Alfresco Google Docs連携Alfresco Google Docs連携
Alfresco Google Docs連携
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
今さら始めるJavaScript
今さら始めるJavaScript今さら始めるJavaScript
今さら始めるJavaScript
 
Alfresco CI
Alfresco CIAlfresco CI
Alfresco CI
 
Alfresco JP Site
Alfresco JP SiteAlfresco JP Site
Alfresco JP Site
 
AlfrescoとActiveCMIS
AlfrescoとActiveCMISAlfrescoとActiveCMIS
AlfrescoとActiveCMIS
 
Alfresco Java Foundation API
Alfresco Java Foundation APIAlfresco Java Foundation API
Alfresco Java Foundation API
 
Alfresco and Web Script (English)
Alfresco and Web Script (English)Alfresco and Web Script (English)
Alfresco and Web Script (English)
 
AlfrescoとWeb Script
AlfrescoとWeb ScriptAlfrescoとWeb Script
AlfrescoとWeb Script
 
Alfresco SDKとカスタムアクション
Alfresco SDKとカスタムアクションAlfresco SDKとカスタムアクション
Alfresco SDKとカスタムアクション
 
Alfrescoのインストールと設定
Alfrescoのインストールと設定Alfrescoのインストールと設定
Alfrescoのインストールと設定
 

AlfrescoとSolr(中編)

  • 1. AlfrescoとSolr - Alfresco勉強会 第11回 - 2012/11/7 @mryoshio Copyright 2012 tachibanakikaku.com. All rights reserved.
  • 2. 目次 ‣ 自己紹介 ‣ AlfrescoとSolr ‣ アーキテクチャ ‣ インストール,設定 ‣ ソースコード解説 ‣ おわりに
  • 3. 自己紹介 ‣ mryoshio → A社の社員 → AlfrescoやLiferayのコンサルタント → ソースコードを読んだりカスタマイズしたり → Twitterとか色々なところにいます → Solr/Lucene周りで遊びたいけど時間とれてない → GAE使って作りたいものあるけど(ry
  • 5. Alfrescoとは ‣ 何? → 英Alfresco社が提供するオープンソースソフトウェア。企業規模のコンテンツ 管理を行える。それ以外に,Webコンテンツ管理やコラボレーションを低コ ストで行える ‣ 似た機能をもつ製品は? → SharePoint(コラボレーション),Documentum(コンテンツ管理)あた りが該当する。DM,WCM,Shareにより異なる種類の製品に該当 ‣ 特徴は? → Community版 (無償)とEnterprise版(有償)が存在 → 多くのインターフェース(e.g. DM,Share,WCM)が存在
  • 6. Solrとは ‣ エンタープライズ検索プラットフォーム → Apache Luceneプロジェクトから派生した人気のある検索プラット フォーム。ヒット部分のハイライト,ファセットサーチなど豊富な機 能がある。スケーラブルで分散した検索やインデクスレプリケーショ ンも可能 ‣ スタンドアロンの全文検索サーバ → Tomcatなどサーブレットコンテナ上で動作する。Luceneを検索ラ イブラリとして使用し,インデクスを用いた全文検索を行う。REST ライクなHTTPベースのXMLやJSONインターフェースを持ち,プロ グラマブルにドキュメントの操作を行える http://lucene.apache.org/solr/
  • 7. Alfresco Solr Plugin ‣ 内包LuceneでなくでなくSolrで検索を行う ‣ Alfrescoクラスタリングを行う場合, 検索インデクスのレプリケーションが不要 ‣ 基本的に外部のSolrインスタンスへ HTTPベースで問い合わせを行う
  • 8. メリット,デメリット ‣ メリット → 前頁を参照 ‣ デメリット → WCMを使えない → RMモジュールを使えない → マルチテナントを使えない → トランザクション内でのインデクシングなど 一貫性を重視する場合には使えない ※ http://wiki.alfresco.com/wiki/Alfresco_And_SOLR
  • 14. Alfrescoのインストール ‣ 過去の勉強会資料を参照 → http://www.slideshare.net/mryoshio/alfresco-install ‣ alfresco-community-4.0.e.zipをダウンロード → https://wiki.alfresco.com/wiki/Community_file_list_4.0.e
  • 15. SolrおよびSolr Pluginのインストール ‣ 過去の勉強会資料を参照 → http://www.slideshare.net/TasukuOtani/ alfrescostudy4alfresco4solrintegration → この資料では同じTomcatにAlfresco,Solrを載せている ‣ alfresco-community-solr-4.0.e.zipをダウン ロード → https://wiki.alfresco.com/wiki/Community_file_list_4.0.e
  • 16. 動作確認 ‣ Alfresco Tomcatのlog4j.propertiesへ追記 → log4j.logger.org.alfresco.repo.search.impl.solr.SolrQueryHTTPC lient=debug ‣ Alfrescoを起動 → ログイン後,検索を実行 => システムエラーの発生を確認 2012-10-24 15:39:48,522 ERROR [ui.common.Utils] [http-8080-4] システムエラーが発生したため、検索できませんでした: 09240004 org.alfresco.repo.search.impl.lucene.LuceneQueryParserException: 09240004 at org.alfresco.repo.search.impl.solr.SolrQueryHTTPClient.executeQuery(SolrQueryHTTPClient.java:364) at org.alfresco.repo.search.impl.solr.SolrQueryLanguage.executeQuery(SolrQueryLanguage.java:49) at org.alfresco.repo.search.impl.solr.SolrSearchService.query(SolrSearchService.java:348) at org.alfresco.repo.search.SearcherComponent.query(SearcherComponent.java:78) (中略) at java.lang.Thread.run(Thread.java:680) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) (後略)
  • 17. 動作確認 ‣ Solrを起動 → 再度Alfrescoにて検索を実行 => catalina.outへログが出力される 2012-10-24 15:45:54,157 DEBUG [impl.solr.SolrQueryHTTPClient] [http-8080-3] Sent :/solr/alfresco/alfresco?q=%28%28+TYPE %3A%22%7Bhttp%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%7Dcontent%22++AND+%28%40%5C%7Bhttp %5C%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%5C%7Dname%3A%22simple%22++TEXT%3A%22simple %22%29%29+%28+TYPE%3A%22%7Bhttp%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%7Dfolder%22++AND+ %28%40%5C%7Bhttp%5C%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%5C%7Dname%3A%22simple%22+ %29%29%29+AND+NOT+ASPECT%3A%22sys%3Ahidden%22+&wt=json&fl=* %2Cscore&rows=500&df=TEXT&start=0&locale=ja_JP&fq=%7B%21afts%7DAUTHORITY_FILTER_FROM_JSON&fq=%7B%21afts %7DTENANT_FILTER_FROM_JSON 2012-10-24 15:45:54,157 DEBUG [impl.solr.SolrQueryHTTPClient] [http-8080-3] with: {"textAttributes":[],"allAttributes": [],"templates":[],"authorities": ["GROUP_ALFRESCO_ADMINISTRATORS","GROUP_EMAIL_CONTRIBUTORS","GROUP_EVERYONE","GROUP_site_admins","GROUP_ site_admins_SiteManager","GROUP_site_swsdp","GROUP_site_swsdp_SiteManager","ROLE_ADMINISTRATOR","ROLE_AUTHENTICA TED","admin"],"tenants":[""],"query":"(( TYPE:"{http://www.alfresco.org/model/content/1.0}content" AND (@{http:// www.alfresco.org/model/content/1.0}name:"simple" TEXT:"simple")) ( TYPE:"{http://www.alfresco.org/model/content/1.0} folder" AND (@{http://www.alfresco.org/model/content/1.0}name:"simple" ))) AND NOT ASPECT:"sys:hidden" ","locales":["ja_JP"],"defaultNamespace":"http://www.alfresco.org/model/content/ 1.0","defaultFTSFieldOperator":"OR","defaultFTSOperator":"OR"} 2012-10-24 15:45:54,157 DEBUG [impl.solr.SolrQueryHTTPClient] [http-8080-3] Got: 6 in 904 ms
  • 19. Alfresco Solr Plugin側 ‣ solr-tomcat-context.xml ‣ solr.xml ‣ AlfrescoCoreAdminHandler ‣ CoreTracker ‣ CoreWatcherJob ‣ CoreTrackerJob
  • 20. solr-tomcat-context.xml ‣ Solrのコンテキストを設定するためのファイル ‣ ${TOMCAT_HOME}/conf/Catalina/localhost/ solr.xmlとして配置 ‣ solr.homeを設定 <?xml version="1.0" encoding="utf-8"?> <Context docBase="@@ALFRESCO_SOLR_DIR@@/apache-solr-1.4.1.war" debug="0" crossContext="true"> <Environment name="solr/home" type="java.lang.String" value="@@ALFRESCO_SOLR_DIR@@" override="true"/> </Context>
  • 21. solr.xml ‣ ${SOLR_HOME}/solr.xml ‣ 前頁の ${TOMCAT_HOME}/conf/Catalina/ localhost/solr.xmlとは異なるもの ‣ Solrのマルチコア機能を使い複数のコアを設定 → alfrescoコアのsolr.homeをworkspace-SpacesStoreディレクトリに, archiveコアのsolr.homeをarchive-SpacesStoreディレクトリに設定 <?xml version="1.0" encoding="UTF-8" ?> <solr persistent="true" sharedLib="lib" > <cores adminPath="/admin/cores" adminHandler="org.alfresco.solr.AlfrescoCoreAdminHandler"> <core name="alfresco" instanceDir="workspace-SpacesStore" /> <core name="archive" instanceDir="archive-SpacesStore" /> </cores> </solr>
  • 22. AlfrescoCoreAdminHandler ‣ マルチコアのハンドリングを行う → CoreAdminHandlerを継承 → coreを指定したactionリクエストを処理 → handleCustomActionが実際のロジック → 重要なメソッド AlfrescoCoreAdminHandler ... CoreWatcherJobのスケジューリング http://localhost:8080/solr/admin/cores?core=alfresco&action=check 上記のアクセスを行った場合,下記の分岐に入る 151 if (a.equalsIgnoreCase("CHECK")) 152 {
  • 23. CoreTracker ‣ インデクスのトラッキングを行う → CloseHookを継承 → solrcore.propertiesから読み込んだcoreの情報を保持 (e.g. alfresco.host) → Jobのスケジューリング → Alfrescoへ接続するclientを保持 → 重要なメソッド L.267 CoreTracker L.425 getRepoClient L. 458 updateIndex
  • 24. CoreWatcherJob ‣ スケジューリングされるジョブ → org.quartz.Jobを継承 → AlfrescoCoreAdminHandlerでジョブとして生成される → AlfrescoCoreAdminHandlerとCoreTrackerの仲立ちを行う → 重要なメソッド L.44 execute
  • 25. CoreTrackerJob ‣ インデクスのトラッキングを行うジョブ → org.quartz.Jobを継承 → CoreTrackerのupdateIndexメソッドを実行するジョブとなる → 重要なメソッド L.42 execute ... CoreTracker#updateIndexをcall
  • 26. Alfresco側 ‣ SolrSearchService ‣ SolrQueryHTTPClient ‣ Alfresco Solr Pluginへ情報を渡すWebScript
  • 27. SolrSearchService ‣ Solrを使う場合のSearchService → org.alfresco.service.cmr.search.SearchServiceを継承 → 重要なメソッド L.137 query ... SearchParameterを設定 L.318 query ... 検索メソッド本体。最終的に SolrQueryHTTPClient#executeQueryを実行
  • 28. SolrQueryHTTPClient ‣ Solrへのリクエストの組立,実行を行う → 重要なメソッド L.133 executeQuery ... 検索URL組立,リクエスト送信,結果の返却を実行
  • 29. 情報を渡すWebScript ‣ Alfresco Solr PluginへAlfrescoの情報を渡す → webapps/alfresco/WEB-INF/classes/alfresco/templates/ webscripts/org/alfresco/repository/solr/に存在するWebScript群 aclChangeSets,acls,aclsReaders model,modelsdiff nodeContent,nodes,nodesMetaData、 transactions
  • 31. 参考 ‣ http://aegif-labo.blogspot.jp/2012/08/ solrssl.html ‣ http://wiki.alfresco.com/wiki/ Alfresco_And_SOLR ‣ http://docs.alfresco.com/4.0/index.jsp?topic= %2Fcom.alfresco.enterprise.doc%2Fconcepts %2Fsolr-webapp-config.html
  • 32. Copyright 2012 tachibanakikaku.com. All rights reserved.

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. &amp;#x30C8;&amp;#x30E9;&amp;#x30F3;&amp;#x30B6;&amp;#x30AF;&amp;#x30B7;&amp;#x30E7;&amp;#x30F3;&amp;#x5185;&amp;#x3067;&amp;#x306E;&amp;#x30A4;&amp;#x30F3;&amp;#x30C7;&amp;#x30AF;&amp;#x30B7;&amp;#x30F3;&amp;#x30B0;~ ... WebScript&amp;#x5185;&amp;#x3067;&amp;#x30B3;&amp;#x30F3;&amp;#x30C6;&amp;#x30F3;&amp;#x30C4;&amp;#x3092;&amp;#x4F5C;&amp;#x308A;&amp;#x3001;&amp;#x305D;&amp;#x306E;&amp;#x76F4;&amp;#x5F8C;&amp;#x306B;&amp;#x691C;&amp;#x7D22;&amp;#x3092;&amp;#x884C;&amp;#x3046;&amp;#x7B49;&amp;#x304C;&amp;#x3067;&amp;#x304D;&amp;#x306A;&amp;#x3044;\n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. &amp;#x5B9F;&amp;#x969B;&amp;#x306B;&amp;#x306F;&amp;#x3053;&amp;#x3053;&amp;#x3067;Solr&amp;#x672C;&amp;#x4F53;&amp;#x3082;&amp;#x5165;&amp;#x308C;&amp;#x308B;&amp;#x3053;&amp;#x3068;&amp;#x306B;&amp;#x306A;&amp;#x308B;&amp;#x3002;\n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. 9&amp;#x3064;\n
  30. \n
  31. \n
  32. \n