Wednesday, October 31, 2012

AlfrescoとSolr

こんにちは。

今更ながらSolr関連の記事を書きます。
Alfresco 4.0からSolrに対応されました。

本稿では、概要やインストール等の基本事項について書きます。


概要

[Alfresco]
本ブログの読者なら当然ご存じの通り、Alfresco社が開発しているECMソフトウェアです。サブスクリプションを購入するEnterprise版と無償のCommunity版があります。RedHatとFedoraの関係を考えてもらえば分かりやすいかと思います。

Explorer(旧称DM)とShareの2つのUIがあり、現在はShare UIをメインとして開発が進められています。ShareはSpring SurfとYUIを使った今風のインターフェースになっています。

[Solr]
全文検索エンジンのLuceneを検索エンジンとして使う検索プラットフォームです。詳細はこちらをご覧ください。


AlfrescoでSolrを使うメリット・デメリット

[メリット]

  • Alfrescoのクラスタリングを行う場合、検索インデクスのレプリケーションが不要になる。
  • Alfrescoから見て外にあるSolrへHTTPベースの問い合わせを行うだけで検索が済むため、検索部分の冗長化が楽(HTTPサーバの冗長化と同じノリでできそう)


[デメリット]

  • AVMを使用するWCMでは使えない
  • RMモジュールを使えない
  • マルチテナントを使えない
  • トランザクション内でのインデクシング非対応なので、一貫性を重視する場面では使えない (e.g. WebScript内でコンテンツをアップロード後、同一WebScript内で検索を行う場合)


Solrの利用パターン

SolrとAlfrescoをどのように配置するかを考えてみます。

[パターン1: 同居]

AlfrescoとSolrが同じTomcatインスタンス上のWebアプリケーションとして存在するパターンです。Tomcatの起動・停止時に予期せぬエラーが発生したりしそうなのでできるだけやりたくないなというのが個人的な意見です。Alfresco Solr PluginはAlfrescoへ変更情報等を問い合せて定期的に検索インデクスを更新します。

[パターン2: 別居]

AlfrescoとSolrが異なるTomcatインスタンス上に存在するパターンです。こちらも当然Alfresco Solr Pluginが定期的にインデクスの更新作業を行います。

とりあえず別居推奨です。


インストール・設定

少々手抜きですが、過去のものをご覧ください...

[Alfrescoのインストール]
弊社が過去に実施した勉強会資料をご覧ください。

[SolrおよびAlfresco Solr Pluginのインストール]
Alfrescoと同様、過去の勉強会資料をご覧ください。


動作確認

Alfrescoが載っているTomcatのlog4j.propertiesへ次のものを追記します。

log4j.logger.org.alfresco.repo.search.impl.solr.SolrQueryHTTPClient=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 refusedat java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)(後略)

エラーが出れば、AlfrescoがSolrへ接続しようとしていることでOKです。


次にSolrを起動します。その後Alfrescoを再起動し、ログイン後に検索を実行します。
すると次の様なログが出力されます。


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_AUTHENTICATED","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へ問い合わせがされたことを確認できました。


今回はここまでになります。この続きは、次回Alfresco勉強会でお話したいと思います。お楽しみに。

@mryoshio

No comments:

Post a Comment