2011年5月30日月曜日

Solr 4.0 の cross-core join を試す

join を使うと index の設計がシンプルになるんじゃないかなぁと思って、ずっと追っかけてます。

そこで、まだ trunk にある 4.0 を落としてきていろいろやってみました。

しかし、できるようになったと書いてあった cross-core join で、RangeQuery や PrefixQuery などを発行すると結果が 0 件になるという現象に遭遇。
それが使用なのか、バグなのか不明のまま、とりあえず検索できるようにならないかとソースを読み、試行錯誤をしてみました。

JoinQParserPlugin.java で定義されている JoinQuery クラス。これは、Query クラスを継承しているわけですが、その「public Weight weight(IndexSearcher searcher) throws IOException」 メソッドをオーバーライドして、以下のように記述。


上記コードが他への何かしらの影響を及ぼすかもしれません。(勉強不足なのでスンマセン)
それに、4.0 はまだ正式リリースされているわけではないですから、改善されることに期待しています。

せっかく cross-core join があっても、RangeQuery や PrefixQuery が使えなければ、用途が狭まってしまいます。 join は、強力な機能だと思うので、これからも目がはなせません。

2010年10月20日水曜日

Eclipse の .classpath はどこで操作?Server 実行時に Maven 関係でハマり

いやぁ、参りましたわぁ ...

いま、svn リポジトリにアップしたソースコードから開発環境を戻しているんだが、超ハマり。

相手は何かと言えば ...
  • Eclipse の 動的 Web プロジェクト
  • Maven2 でプロジェクトを構成している
  • Spring を使用している(web.xml 内で ContextLoaderListener を呼び出している)
  • ソースは全て svn に入れているが、.classpath, .project ファイルは svn に入れない
で、どこでハマりかと言えば
  1. Subversive で svn から新規プロジェクトを作成
  2. M2Eclipse で プロジェクト構成の更新を行い
  3. STS の Spring プロジェクト・ネーチャーを追加
  4. サーバーで実行を行う
  5. → ここでエラー
どんなエラーかというと

2010/10/20 21:53:02 org.apache.catalina.core.StandardContext listenerStart
致命的: クラス org.springframework.web.context.request.RequestContextListener のアプリケーションリスナの設定中にエラーが発生しました
java.lang.ClassNotFoundException: org.springframework.web.context.request.RequestContextListener
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
 at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4078)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardHost.start(StandardHost.java:807)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
 at org.apache.catalina.core.StandardService.start(StandardService.java:519)
 at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
2010/10/20 21:53:02 org.apache.catalina.core.StandardContext listenerStart
致命的: クラス org.springframework.web.context.ContextLoaderListener のアプリケーションリスナの設定中にエラーが発生しました
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
 at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4078)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardHost.start(StandardHost.java:807)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
 at org.apache.catalina.core.StandardService.start(StandardService.java:519)
 at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
2010/10/20 21:53:02 org.apache.catalina.core.StandardContext listenerStart
致命的: 前のエラーのためにアプリケーションリスナのインストールをスキップします
2010/10/20 21:53:02 org.apache.catalina.core.StandardContext start
致命的: Error listenerStart
2010/10/20 21:53:02 org.apache.catalina.core.StandardContext start
致命的: 以前のエラーのためにコンテキストの起動が失敗しました [/xxxxxxxxxx] 

で、いろいろ原因を探った結果、なんか Server (Eclipse 上で動くやつね)で起動する時に、Maven のライブラリがデプロイされていないっぽい???

そんで、以前の環境を確認したら、.classpath ファイルの中身に違いを発見

前のは

で、今のは

ま・て・よ、、、

これか!?この部分か!?

で、試したらエラーは解決して、実行でけた!!

よかった~

しかし、この値って、どこで操作して設定するものなんだろうか ... 疑問は残る

※ 追記

判明した!!

パッケージ・エクスプローラーを右クリックして、プロパティを選択すると出てくる「*** の プロパティー」ウィンドウの左のツリーの中に「Deployment Assembly」というのがあって、ここを操作すると、.classpach ファイルと .settings/org.eclipse.wst.common.component ファイルの両方を操作するっぽい

スッキリした~

2010年10月18日月曜日

WST の org.eclipse.wst.common.component ファイルをもっと知りたい

svn からソースコードを持ってきて、開発環境を再構築した時のおはなし。

ソースコードを持ってきて、m2eclipse の 「プロジェクト構成の更新」を行って .classpath と .project ファイルを作り直す。んーで、Server で実行させようとしたら Spring の Context ファイルが classpath に無いよってエラー。

Eclipse の ビルドパスをいじくりいじくり、war ファイルの生成は OK になったが、Server を使ってローカルマシンでの実行ができないまんま。。。

そこで、.settings ディレクトリ以下に自動で生成された org.eclipse.wst.common.component のファイルが、、、

これが原因じゃないか?...

そこで ...

に直してあげたら、ちゃんと Spring の Context ファイルを読み込むようになった。

context ファイルは web.xml 内にて、「classpath:『コンテキストファイル名』」で指定されていた。

つまり、Server の起動時にデプロイされるものが最初の指定では、「src/main/java」以下のもののみだったのが(あれ?ソースコード???)、org.eclipse.wst.common.component を更新して「src/main/resources」と「target/classes」もデプロイされるようになって、ちゃんと動くようになった。

ということか

ちなみに、axis2 を使用した時には を追加してた。

2010年4月23日金曜日

ソースコードのハイライト

ソースコードのハイライトをテスト

def func():
    return None

でけた!

ここを見ていたら、ここへのリンクが。

つまり ...

<!-- SYNTAX HIGHLIGHTER BEGINS -->
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'></script>
<script language='javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>
<!-- SYNTAX HIGHLIGHTER ENDS -->

これを、テンプレートの HTML に貼りつければ OK ... っと
テンプレートを変更すると、消えちゃうのがチョイめんどいなぁ ...

Blogger に貼り付ける時は ...

<pre class='brush: ***'>
内容(エスケープ済)
</pre>

もしくは

<script type='syntaxhighlighter' class='brush: ***'>
<![CDATA[
内容(エスケープ不要)
]]>
</script>

こんな感じで ...