<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>イージーネット Tech Blog &#187; 全文検索</title>
	<atom:link href="http://blog.eni.co.jp/tech/category/full-text-search/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.eni.co.jp/tech</link>
	<description>株式会社イージーネットのスタッフによる技術系ブログです</description>
	<lastBuildDate>Tue, 12 Jan 2010 01:46:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/category/full-text-search/feed" />
		<item>
		<title>Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する方法(SolrJのバグの対処方法)</title>
		<link>http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html#comments</comments>
		<pubDate>Wed, 15 Jul 2009 06:38:05 +0000</pubDate>
		<dc:creator>kubo@eni.co.jp</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[全文検索]]></category>
		<category><![CDATA[CoreAdmin]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[SolrJ]]></category>
		<category><![CDATA[マルチコア]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=863</guid>
		<description><![CDATA[こんにちは。
株式会社イージーネット プロダクト&#038;サービス事業部 の久保です。
前回書いたSolrの記事 全文検索サーバ: これからSolrを始める人のためのApache Solr概要と便利なリンク集 はおかげさまで沢山のアクセス/ブックマークをいただきました。
来週火曜日の7/21には、Lucene/Solrで有名なロンウイットの関口さん(参考: 関口宏司のLuceneブログ)などが参加されるSolr勉強会も開催されるようですので、Solr人気は高まっているのかもしれません。
今回は前回から変わって小さなネタになりますが、
Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する際にはまるSolrJのバグと、その対処方法について書きます。

Solr1.3のマルチコア機能とは
単純に言うと、1つのSolrアプリケーション(サーブレットアプリケーション)の上で、論理的に複数のSolrアプリケーションを動かすことができる機能です。
詳しくは前回の記事の「マルチコア構成」をご覧ください。
Coreを追加するためのURL(Query String)
Coreを追加するのに必要なURL(Query String)は次のようになります。
(参考URL: Solr Wiki &#8211; CoreAdmin)

http://server/solr/admin/cores?action=CREATE&#38;name=[name]&#38;instanceDir=[dir]&#38;config=[solrconfig]&#38;schema=[schema]

(例)

http://testserver:8080/solr/admin/cores?action=CREATE&#38;name=test&#38;instanceDir=test&#38;config=/solr/conf/solrconfig.xml&#38;schema=/solr/conf/schema.xml



[name]
coreに付ける名前(例: test)


[dir]
coreのディレクトリ名(例: test)


[solrconfig]
solrconfig.xmlファイルのパス(例: /solr/conf/solrconfig.xml)


[schema]
schema.xmlファイル(例: /solr/conf/schema.xml)


SolrJを使った場合の問題
SolrJのver1.3において、SolrCoreAdminRequestのcreateCoreメソッドを使った以下のコードは失敗します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package jp.co.eni.solr.test;
&#160;
import java.io.IOException;
import java.net.MalformedURLException;
&#160;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.request.CoreAdminRequest;
import org.apache.solr.client.solrj.response.CoreAdminResponse;
&#160;
//失敗する
public class FailedCoreCreateTest &#123;
	public static void main&#40;String&#91;&#93; args&#41; &#123;
		try &#123;
			// SolrのURL
			String url = &#34;http://server/solr/&#34;;
			// coreの名前
			String coreName = &#34;failed&#34;;
			// coreのディレクトリ名
			String instanceDir = &#34;failed&#34;;
&#160;
			SolrServer server = new CommonsHttpSolrServer&#40;url&#41;;
			CoreAdminResponse response = CoreAdminRequest.createCore&#40;coreName, instanceDir, [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは。<br />
<a href="http://www.eni.co.jp/">株式会社イージーネット</a> プロダクト&#038;サービス事業部 の久保です。</p>
<p>前回書いたSolrの記事 <a href="http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html">全文検索サーバ: これからSolrを始める人のためのApache Solr概要と便利なリンク集</a> はおかげさまで沢山のアクセス/ブックマークをいただきました。<br />
来週火曜日の7/21には、Lucene/Solrで有名なロンウイットの関口さん(参考: <a href="http://lucene.jugem.jp/">関口宏司のLuceneブログ</a>)などが参加される<a href="http://atnd.org/events/937">Solr勉強会</a>も開催されるようですので、Solr人気は高まっているのかもしれません。</p>
<p>今回は前回から変わって小さなネタになりますが、<br />
Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する際にはまるSolrJのバグと、その対処方法について書きます。</p>
<p><span id="more-863"></span></p>
<h3>Solr1.3のマルチコア機能とは</h3>
<p>単純に言うと、1つのSolrアプリケーション(サーブレットアプリケーション)の上で、論理的に複数のSolrアプリケーションを動かすことができる機能です。<br />
詳しくは<a href="http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html#multicore">前回の記事の「マルチコア構成」</a>をご覧ください。</p>
<h3>Coreを追加するためのURL(Query String)</h3>
<p>Coreを追加するのに必要なURL(Query String)は次のようになります。<br />
(参考URL: <a href="http://wiki.apache.org/solr/CoreAdmin">Solr Wiki &#8211; CoreAdmin</a>)</p>

<div class="wp_codebox"><table width="100%" ><tr id="p8639"><td class="code" id="p863code9"><pre class="java" style="font-family:monospace;">http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//server/solr/admin/cores?action=CREATE&amp;name=[name]&amp;instanceDir=[dir]&amp;config=[solrconfig]&amp;schema=[schema]</span></pre></td></tr></table></div>

<p>(例)</p>

<div class="wp_codebox"><table width="100%" ><tr id="p86310"><td class="code" id="p863code10"><pre class="java" style="font-family:monospace;">http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//testserver:8080/solr/admin/cores?action=CREATE&amp;name=test&amp;instanceDir=test&amp;config=/solr/conf/solrconfig.xml&amp;schema=/solr/conf/schema.xml</span></pre></td></tr></table></div>

<table class="content">
<tr>
<th>[name]</th>
<td>coreに付ける名前(例: test)</td>
</tr>
<tr>
<th>[dir]</th>
<td>coreのディレクトリ名(例: test)</td>
</tr>
<tr>
<th>[solrconfig]</th>
<td>solrconfig.xmlファイルのパス(例: /solr/conf/solrconfig.xml)</td>
</tr>
<tr>
<th>[schema]</th>
<td>schema.xmlファイル(例: /solr/conf/schema.xml)</td>
</tr>
</table>
<h3>SolrJを使った場合の問題</h3>
<p>SolrJのver1.3において、SolrCoreAdminRequestのcreateCoreメソッドを使った以下のコードは失敗します。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p86311"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code" id="p863code11"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">jp.co.eni.solr.test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.net.MalformedURLException</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.SolrServer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.SolrServerException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.impl.CommonsHttpSolrServer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.request.CoreAdminRequest</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.response.CoreAdminResponse</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//失敗する</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> FailedCoreCreateTest <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// SolrのURL</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> url <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://server/solr/&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// coreの名前</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> coreName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;failed&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// coreのディレクトリ名</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> instanceDir <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;failed&quot;</span><span style="color: #339933;">;</span>
&nbsp;
			SolrServer server <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CommonsHttpSolrServer<span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			CoreAdminResponse response <span style="color: #339933;">=</span> CoreAdminRequest.<span style="color: #006633;">createCore</span><span style="color: #009900;">&#40;</span>coreName, instanceDir, server<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;qtime: &quot;</span> <span style="color: #339933;">+</span> response.<span style="color: #006633;">getQTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amalformedurlexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">MalformedURLException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>SolrServerException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">IOException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>失敗の原因は、上記コードにより生成されるHTTP RequestのQuery Stringにあります。<br />
エラーのログを見ると、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p86312"><td class="code" id="p863code12"><pre class="java" style="font-family:monospace;"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Exception</span></a> in thread <span style="color: #0000ff;">&quot;main&quot;</span> org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">common</span>.<span style="color: #006633;">SolrException</span><span style="color: #339933;">:</span> Internal Server <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aerror+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Error</span></a>
&nbsp;
Internal Server <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aerror+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Error</span></a>
&nbsp;
request<span style="color: #339933;">:</span> http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//server/solr/admin/cores?action=CREATE&amp;core=failed&amp;instanceDir=failed&amp;wt=javabin&amp;version=2.2</span>
	at org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">client</span>.<span style="color: #006633;">solrj</span>.<span style="color: #006633;">impl</span>.<span style="color: #006633;">CommonsHttpSolrServer</span>.<span style="color: #006633;">request</span><span style="color: #009900;">&#40;</span>CommonsHttpSolrServer.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">343</span><span style="color: #009900;">&#41;</span>
	at org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">client</span>.<span style="color: #006633;">solrj</span>.<span style="color: #006633;">impl</span>.<span style="color: #006633;">CommonsHttpSolrServer</span>.<span style="color: #006633;">request</span><span style="color: #009900;">&#40;</span>CommonsHttpSolrServer.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">183</span><span style="color: #009900;">&#41;</span>
	at org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">client</span>.<span style="color: #006633;">solrj</span>.<span style="color: #006633;">request</span>.<span style="color: #006633;">CoreAdminRequest</span>.<span style="color: #006633;">process</span><span style="color: #009900;">&#40;</span>CoreAdminRequest.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">170</span><span style="color: #009900;">&#41;</span>
	at org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">client</span>.<span style="color: #006633;">solrj</span>.<span style="color: #006633;">request</span>.<span style="color: #006633;">CoreAdminRequest</span>.<span style="color: #006633;">createCore</span><span style="color: #009900;">&#40;</span>CoreAdminRequest.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">226</span><span style="color: #009900;">&#41;</span>
	at jp.<span style="color: #006633;">co</span>.<span style="color: #006633;">eni</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">test</span>.<span style="color: #006633;">FailedCoreCreateTest</span>.<span style="color: #006633;">main</span><span style="color: #009900;">&#40;</span>FailedCoreCreateTest.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">23</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>とあるように、
<pre>name=failed</pre>
<p>ではなく
<pre>core=failed</pre>
<p>となっていることが分かります。<br />
これは、SolrJ1.3のorg.apache.solr.client.solrj.request.CoreAdminRequest.Create#getParames(rev:688188)が以下のような実装になっているためです。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p86313"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p863code13"><pre class="java" style="font-family:monospace;">    @Override
    <span style="color: #000000; font-weight: bold;">public</span> SolrParams getParams<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> action <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aruntimeexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">RuntimeException</span></a><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;no action specified!&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      ModifiableSolrParams params <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ModifiableSolrParams<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span> CoreAdminParams.<span style="color: #006633;">ACTION</span>, action.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span> CoreAdminParams.<span style="color: #006633;">CORE</span>, core <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                      <span style="color: #666666; font-style: italic;">//←※ここがおかしい</span>
      params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span> CoreAdminParams.<span style="color: #006633;">INSTANCE_DIR</span>, instanceDir<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>configName <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span> CoreAdminParams.<span style="color: #006633;">CONFIG</span>, configName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>schemaName <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span> CoreAdminParams.<span style="color: #006633;">SCHEMA</span>, schemaName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">return</span> params<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>簡単な解決策</h3>
<p>以下のようなCoreAdminRequest.Createの拡張クラスを用意することで、上記の問題を解決することができます。</p>
<h4>用意するクラス</h4>

<div class="wp_codebox"><table width="100%" ><tr id="p86314"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code" id="p863code14"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">jp.co.eni.solr.test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.request.CoreAdminRequest.Create</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.common.params.CoreAdminParams</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.common.params.ModifiableSolrParams</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.common.params.SolrParams</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> SolvedCreate <span style="color: #000000; font-weight: bold;">extends</span> Create <span style="color: #009900;">&#123;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 *
	 * @param coreName
	 * @param instanceDir
	 * @param configName
	 * @param schemaName
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> SolvedCreate<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> coreName, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> instanceDir, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> configName, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> schemaName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// coreの名前</span>
		setCoreName<span style="color: #009900;">&#40;</span>coreName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// coreのディレクトリ名</span>
		setInstanceDir<span style="color: #009900;">&#40;</span>instanceDir<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// solrconfig.xmlのパス</span>
		setConfigName<span style="color: #009900;">&#40;</span>configName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// schema.xmlのパス</span>
		setSchemaName<span style="color: #009900;">&#40;</span>schemaName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> SolrParams getParams<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		ModifiableSolrParams params <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ModifiableSolrParams<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getParams</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// coreではなくnameを使う</span>
		params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span>CoreAdminParams.<span style="color: #006633;">CORE</span>, <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		params.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span>CoreAdminParams.<span style="color: #006633;">NAME</span>, core<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> params<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>getParamsメソッドは、org.apache.solr.client.solrj.impl.CommonsHttpSolrServer#requestの中で呼ばれます。</p>
<p>CoreAdminParams.COREやCoreAdminParams.NAMEを持つorg.apache.solr.common.params.CoreAdminParamsというのは以下のようなインタフェースになっており、<br />
COREではなくNAMEを用いるのが正しそうだということになります。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p86315"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p863code15"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> CoreAdminParams 
<span style="color: #009900;">&#123;</span>
  <span style="color: #008000; font-style: italic; font-weight: bold;">/** What Core are we talking about **/</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> CORE <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;core&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #008000; font-style: italic; font-weight: bold;">/** Persistent -- should it save the cores state? **/</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> PERSISTENT <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;persistent&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #008000; font-style: italic; font-weight: bold;">/** If you rename something, what is the new name **/</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> NAME <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;name&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// 後略</span></pre></td></tr></table></div>

<h4>SolvedCreate利用コード</h4>
<p>上記のSolvedCreateクラスを利用したコードは次のようになります。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p86316"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code" id="p863code16"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">jp.co.eni.solr.test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.net.MalformedURLException</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.SolrServer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.SolrServerException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.impl.CommonsHttpSolrServer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.response.CoreAdminResponse</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 成功する</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> SuccessCoreCreateTest <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// SolrのURL</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> url <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://server/solr/&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// coreの名前</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> coreName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;name2&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// coreのディレクトリ名</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> instanceDir <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;dir2&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// solrconfig.xmlのパス</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> configName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/solr/conf/solrconfig.xml&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// schema.xmlのパス</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> schemaName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/solr/conf/schema.xml&quot;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// Createクラスのバグ対応のため、SolvedCreateクラスを作成して使っている</span>
			SolvedCreate createRequest <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SolvedCreate<span style="color: #009900;">&#40;</span>coreName, instanceDir, configName, schemaName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			SolrServer server <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CommonsHttpSolrServer<span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			CoreAdminResponse response <span style="color: #339933;">=</span> createRequest.<span style="color: #006633;">process</span><span style="color: #009900;">&#40;</span>server<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;qtime: &quot;</span> <span style="color: #339933;">+</span> response.<span style="color: #006633;">getQTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amalformedurlexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">MalformedURLException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>SolrServerException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">IOException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>1.4では修正される模様</h3>
<p>この問題は、Apacheプロジェクトのバグトラックにも登録されています。<br />
<a href="http://issues.apache.org/jira/browse/SOLR-803">SOLR-803: CoreAdminRequest.createCore fails because name parameter isn&#8217;t set</a>を見ると、StatusはResolveとなっています。<br />
<a href="http://svn.apache.org/repos/asf/lucene/solr/">Solrのレポジトリ</a>を直接確認してみたところ、上記の問題はrev.708266の修正で解決されているようです。</p>
<blockquote><p>
    SOLR-803: fix CoreAdminRequest.createCore error
</p></blockquote>
<p>コードは確認していませんが、ちゃんとした？修正がされていそうです。</p>
<p>また<a href="http://svn.apache.org/repos/asf/lucene/solr/trunk/CHANGES.txt">pache Solr Version 1.4-dev Release Notes</a>を見ると、SOLR-803も含まれていますので、1.4のリリース時にはこのエントリで取り上げた問題は発生しなくなるはずです。</p>
<h3>参考URL</h3>
<ul>
<li><a href="http://wiki.apache.org/solr/CoreAdmin">Solr Wiki &#8211; CoreAdmin</a></li>
</ul>
<h3>使用したソフトウェア</h3>
<table class="content">
<tr>
<th>ソフトウェア</th>
<th>バージョン</th>
</tr>
<tr>
<th>Solr</th>
<td>1.3</td>
</tr>
<tr>
<th>SolrJ</th>
<td>1.3</td>
</tr>
</table>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html">全文検索サーバ: これからSolrを始める人のためのApache Solr概要と便利なリンク集</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html" />
	</item>
		<item>
		<title>全文検索サーバ: これからSolrを始める人のためのApache Solr概要と便利な情報リスト集</title>
		<link>http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html#comments</comments>
		<pubDate>Wed, 20 May 2009 09:22:05 +0000</pubDate>
		<dc:creator>kubo@eni.co.jp</dc:creator>
				<category><![CDATA[Lucene]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[全文検索]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[スケーラビリティ]]></category>
		<category><![CDATA[スケーラブル]]></category>
		<category><![CDATA[スケールアウト]]></category>
		<category><![CDATA[全文検索サーバ]]></category>
		<category><![CDATA[分散]]></category>
		<category><![CDATA[性能]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=294</guid>
		<description><![CDATA[
このエントリーは、なるべく定期的に最新情報に更新するようにしています。
更新履歴

2009/05/20　公開
2009/05/23頃　色々調整
2009/07/20　データ量/性能とハードウェアとSolrを始めるための情報リストに、本記事へのご指摘をいただいたブログ(ぼうずの日常的雑感様)の情報を追加。またSolrを始めるための情報リストにIT Proで始まった連載第4回　全文検索エンジン「Lucene/Solr」の用途と良さの情報を追加。
2009/07/26　Solr勉強会で色々事例が出ていたようですので、実績/事例に情報を追記。
2009/10/09　データ量/性能とハードウェアとスケールアウトの記述をより具体的にしました。


はじめまして。
株式会社イージーネット プロダクト&#038;サービス事業部の久保です。
当社では、

ネットワークフォレンジック アプライアンス製品で、メールアーカイブとしても使えるNetRAPTOR
Adobe AIRによるデスクトップアプリケーションによってドラッグ&#038;ドロップや右クリックから「送る」での一発送信機能に対応した、大容量ファイル送信システムのeasyFiLEX

などを開発しております。
今日は、当社で利用しているOSSの全文検索サーバアプリケーションであるApache Solrについてご紹介したいと思います。
GoogleでSolrを検索しても、日本語圏のコンテンツはまだまだ少ないようです。
当社がSolrを使い始めた昨年は現在よりもさらに少なく、結構苦労しました。
今回はやや雑多な内容となりますが、新しくSolrを使う際に必要と考えられる情報をまとめてみました。
本エントリーでは、Solr1.3を対象としています。
Solr1.3が現在の安定版で、Solr1.4-devが開発版となります。

目次

Solrとは

機能一覧
実績/事例
Solrを使ったシステムの開発方法
おすすめする方


データ量/性能とハードウェア
マルチコア構成
様々な検索
スケールアウト
検索と更新
Solrを始めるための情報リスト

全体像をつかむ
Solr1.3について知る
使ってみる
開発中、常に参照する
その他有用なサイト


終わりに

Solrとは
Apache Solrは、OSSの全文検索のエンジンとして有名なApache Luceneをベースに、

HTTPでの入出力(サーバアプリケーション化)
管理Webアプリケーション
キャッシュ機構

などの機能拡張を行ったJavaのWebサーバアプリケーションです。
単純に言うと、LuceneのHTTPラッパー＋拡張機能ということになります。
Javaのサーブレットアプリケーションなので、Tomcatなどのアプリケーションサーバに配置することになります。
サーバ側だけではなく、SolrJなどのSolrクライアントが揃っているのもポイントです。
IntegratingSolr &#8211; Solr Wikiにあるように、SolrクライアントはJava以外の実装(PHP,Ruby,Pythonなど)もあります。
Solrを使ったシステムの開発方法
Solrを用いたシステムの開発者は、以下のようなことを行うことになります。

Solrサーバ側
Tomcatなどのアプリケーションサーバ上へのSolrの配置、設定、スキーマ設計、チューニングなどを行います。
		基本的には、コーディングは不要です。
	
Solrクライアント側
Solrクライアントを使ったXML/HTTPでの操作を行います。
		Java,PHP,RubyなどにバインディングされたSolrクライアント実装を用い、Solrサーバを操作します。
		XMLではなくCSVを用いたり、HTTPではなくJDBC経由でRDBからデータを追加したり、といったこともできるようです。
	

おすすめする方
以下のような方には、様々な言語からHTTP/XMLで手軽に全文検索ができるSolrをおすすめします。

Luceneを使いたいが、Luceneを直接触るのは大変そうだと考えている方
Luceneを使いたいが、クライアントとしてJava以外の言語を使いたい方
簡単に全文検索アプリケーションを使いたい方
スケーラブルな全文検索アプリケーションを使いたい方

機能一覧
公式サイトの機能一覧で、機能の一覧が確認できます。
まず最初にここに目を通すことをおすすめします。
日本語のWebリソースとしては、InfoQの以下の記事で概要がつかめます。

Apache Solr ～ Luceneベースの高スケーラブルなエンタープライズ検索サーバー(Ver1.2時点の記事)
Apache Solr：Luceneをベースに構築された拡張性のあるクラスタ化検索サーバ(Ver1.3時点の記事)

実績/事例
PublicServers &#8211; Solr Wikiで、海外での実績一覧が確認できます。
国内では、以下のような事例が見つかります。

リクルートにおける検索エンジンSolrの活用(PDF形式)
Solrスゲェ!(ECナビ・ECナビラボ)(odp形式)

(2009/07/26追記)
また新しい実績や事例として、Solr勉強会で出ている各種事例が参考になりそうです。

Solr勉強会の資料公開しました：マピオンラボ(セミナー／勉強会)
ECナビ デベロッパー ネットワーク: Solr勉強会の資料を置きました.
Solr勉強会に行ってきました[solr][ecnavi][mapion][recruit] &#8211; d.hatena.zeg.la
Solr勉強会に行ってきました。 &#8211; 不可視点
Solr勉強会行ってきた。 &#8211; public static void main
0を1にする瞬間が難しい: Solr勉強会メモ

データ量/性能とハードウェア
ハードウェアやデータ内容やその他様々な要素が関わってきますので一概には言えませんが、当社で検証した際の感触では
特に念入りなチューニングをしなくても(※2)、Quad Core CPUと4GB以上のメモリとそれなりに高速なディスクがあれば、1台で少なくとも数百万件オーダーのデータ(※1)には対応できる※3
という感じになります。
※1　ここでは、30フィールドほどあるそれなりに大きめのデータのケースを想定しています。ぼうずの日常的雑感 &#8211; Solr のメモリについての体験談でご指摘のように、データによってかなり結果は異なってくると思いますし、またJVMが32bitか64bitかによってメモリ使用量が異なるようです。また、同ブログのSolr のメモリ使用量を小さくするには、メモリ使用量の調整の方法が記載されています。
※2　最低限のチューニングは必要でした。後日別エントリで紹介したいと思います。
※3　(追記)検索と更新を同時に行うような場合は、パフォーマンス問題が発生する可能性があります。検索と更新も併せて参照ください。
詳細は次の通りです。

基本的には他のデータベースと同様にI/Oバウンドなアプリケーションとなりますので、ディスク性能があった方が良いです。
大量のデータを扱う場合、Solrのキャッシュ機構の影響か、Luceneに比べてもメモリを大量に消費する気がします。メモリは4GB以上を最初から検討しておいた方が良いです。
よって、最初から64bit OSを検討しておく必要があります。
大量のスレッドを使用するマルチスレッドアプリケーションとなりますので、CPUも出来ればQuad Core以上の方がよいと思います。同時検索数で違いが出てきます。

後述のようにSolrはスケーラビリティに優れていますので、複数のハードウェアを並べて分散検索や数千万から一億程度のデータも扱うことが出来るようです。(当社では検証出来ていませんが)
Solr(Lucene)で扱えるドキュメント数については、以下のURLが参考になります。

Distributed Search on Solr 1.3 &#124; 関口宏司のLuceneブログ
Solrとは &#8211; Solr, Python, MacBook Air

マルチコア構成
Solrには「コア」と呼ばれる概念があります。
以下、株式会社ロンウイット／ダウンロードにあるホワイトペーパー『RONDHUIT REPORT Vol.4 「Solr 1.3の新機能」（全2ページ）』から引用します。


Solrには「コア」のオブジェクトがあり、検索リクエストを処理する各種リクエストハンドラ、検索を実行するサーチャー、インデックスのスキーマ定義、各種ツール・オブジェクト等さまざまなデータを保持している。Solr 1.2まではSolrインスタンスにコアは1つであったが、Solr [...]]]></description>
			<content:encoded><![CDATA[<div class="update">
<span class="red">このエントリーは、なるべく定期的に最新情報に更新するようにしています。</span></p>
<p>更新履歴</p>
<ul>
<li>2009/05/20　公開</li>
<li>2009/05/23頃　色々調整</li>
<li>2009/07/20　<a href="#performance">データ量/性能とハードウェア</a>と<a href="#useful">Solrを始めるための情報リスト</a>に、本記事へのご指摘をいただいたブログ(<a href="http://d.hatena.ne.jp/bowez/searchdiary?word=*[Solr]">ぼうずの日常的雑感</a>様)の情報を追加。また<a href="#useful">Solrを始めるための情報リスト</a>にIT Proで始まった連載<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20090713/333679/?ST=oss">第4回　全文検索エンジン「Lucene/Solr」の用途と良さ</a>の情報を追加。</li>
<li>2009/07/26　<a href="http://atnd.org/events/937">Solr勉強会</a>で色々事例が出ていたようですので、<a href="#case">実績/事例</a>に情報を追記。</li>
<li>2009/10/09　<a href="#performance">データ量/性能とハードウェア</a>と<a href="#scaleout">スケールアウト</a>の記述をより具体的にしました。</li>
</ul>
</div>
<p>はじめまして。<br />
<a href="http://www.eni.co.jp/" title="株式会社イージーネットのホームページ" onClick="javascript: pageTracker._trackPageview("/C1/www.eni.co.jp");">株式会社イージーネット</a> プロダクト&#038;サービス事業部の久保です。</p>
<p>当社では、</p>
<ul>
<li>ネットワークフォレンジック アプライアンス製品で、メールアーカイブとしても使える<a href="http://www.netraptor.jp/" title="イージーネットのネットワークフォレンジック製品 NetRAPTORのWebサイト" onClick="javascript: pageTracker._trackPageview("/C1/www.netraptor.jp");">NetRAPTOR</a></li>
<li>Adobe AIRによるデスクトップアプリケーションによってドラッグ&#038;ドロップや右クリックから「送る」での一発送信機能に対応した、大容量ファイル送信システムの<a href="http://www.eni.co.jp/products/easyfilex/" title="大容量ファイルを安全に送信！ ファイル転送パッケージソフト easyFiLEXのWebサイト" onClick="javascript: pageTracker._trackPageview("/C1/www.eni.co.jp/products/easyfilex/");">easyFiLEX</a></li>
</ul>
<p>などを開発しております。</p>
<p>今日は、当社で利用しているOSSの全文検索サーバアプリケーションである<a href="http://lucene.apache.org/solr/">Apache Solr</a>についてご紹介したいと思います。</p>
<p>GoogleでSolrを検索しても、日本語圏のコンテンツはまだまだ少ないようです。<br />
当社がSolrを使い始めた昨年は現在よりもさらに少なく、結構苦労しました。<br />
今回はやや雑多な内容となりますが、新しくSolrを使う際に必要と考えられる情報をまとめてみました。</p>
<p>本エントリーでは、Solr1.3を対象としています。<br />
Solr1.3が現在の安定版で、Solr1.4-devが開発版となります。</p>
<p><span id="more-294"></span></p>
<h3 id="contents">目次</h3>
<ul>
<li><a href="#intro">Solrとは</a>
<ul>
<li><a href="#function">機能一覧</a></li>
<li><a href="#case">実績/事例</a></li>
<li><a href="#development">Solrを使ったシステムの開発方法</a></li>
<li><a href="#recommend">おすすめする方</a></li>
</ul>
</li>
<li><a href="#performance">データ量/性能とハードウェア</a></li>
<li><a href="#multicore">マルチコア構成</a></li>
<li><a href="#search">様々な検索</a></li>
<li><a href="#scaleout">スケールアウト</a></li>
<li><a href="#searchandupdate">検索と更新</a></li>
<li><a href="#links">Solrを始めるための情報リスト</a>
<ul>
<li><a href="#perspective">全体像をつかむ</a></li>
<li><a href="#1.3">Solr1.3について知る</a></li>
<li><a href="#start">使ってみる</a></li>
<li><a href="#refer">開発中、常に参照する</a></li>
<li><a href="#useful">その他有用なサイト</a></li>
</ul>
</li>
<li><a href="#end">終わりに</a></li>
</ul>
<h3 id="intro">Solrとは</h3>
<p><a href="http://lucene.apache.org/solr/">Apache Solr</a>は、OSSの全文検索のエンジンとして有名な<a href="http://lucene.apache.org/java/docs/index.html">Apache Lucene</a>をベースに、</p>
<ul>
<li>HTTPでの入出力(サーバアプリケーション化)</li>
<li>管理Webアプリケーション</li>
<li>キャッシュ機構</li>
</ul>
<p>などの機能拡張を行ったJavaのWebサーバアプリケーションです。<br />
単純に言うと、<strong>LuceneのHTTPラッパー＋拡張機能</strong>ということになります。<br />
Javaのサーブレットアプリケーションなので、Tomcatなどのアプリケーションサーバに配置することになります。</p>
<p>サーバ側だけではなく、SolrJなどのSolrクライアントが揃っているのもポイントです。<br />
<a href="http://wiki.apache.org/solr/IntegratingSolr">IntegratingSolr &#8211; Solr Wiki</a>にあるように、SolrクライアントはJava以外の実装(PHP,Ruby,Pythonなど)もあります。</p>
<h4 id="development">Solrを使ったシステムの開発方法</h4>
<p>Solrを用いたシステムの開発者は、以下のようなことを行うことになります。</p>
<dl>
<dt>Solrサーバ側</dt>
<dd>Tomcatなどのアプリケーションサーバ上へのSolrの配置、設定、スキーマ設計、チューニングなどを行います。<br />
		基本的には、コーディングは不要です。
	</dd>
<dt>Solrクライアント側</dt>
<dd>Solrクライアントを使ったXML/HTTPでの操作を行います。<br />
		Java,PHP,RubyなどにバインディングされたSolrクライアント実装を用い、Solrサーバを操作します。<br />
		XMLではなくCSVを用いたり、HTTPではなくJDBC経由でRDBからデータを追加したり、といったこともできるようです。
	</dd>
</dl>
<h4 id="recommend">おすすめする方</h4>
<p>以下のような方には、様々な言語からHTTP/XMLで手軽に全文検索ができるSolrをおすすめします。</p>
<ul>
<li>Luceneを使いたいが、Luceneを直接触るのは大変そうだと考えている方</li>
<li>Luceneを使いたいが、クライアントとしてJava以外の言語を使いたい方</li>
<li>簡単に全文検索アプリケーションを使いたい方</li>
<li>スケーラブルな全文検索アプリケーションを使いたい方</li>
</ul>
<h4 id="function">機能一覧</h4>
<p>公式サイトの<a href="http://lucene.apache.org/solr/features.html">機能一覧</a>で、機能の一覧が確認できます。<br />
まず最初にここに目を通すことをおすすめします。</p>
<p>日本語のWebリソースとしては、<a href="http://www.infoq.com/jp/">InfoQ</a>の以下の記事で概要がつかめます。</p>
<ul>
<li><a href="http://www.infoq.com/jp/news/2007/09/solr">Apache Solr ～ Luceneベースの高スケーラブルなエンタープライズ検索サーバー</a>(Ver1.2時点の記事)</li>
<li><a href="http://www.infoq.com/jp/news/2008/11/apache-solr">Apache Solr：Luceneをベースに構築された拡張性のあるクラスタ化検索サーバ</a>(Ver1.3時点の記事)</li>
</ul>
<h4 id="case">実績/事例</h4>
<p><a href="http://wiki.apache.org/solr/PublicServers">PublicServers &#8211; Solr Wiki</a>で、海外での実績一覧が確認できます。<br />
国内では、以下のような事例が見つかります。</p>
<ul>
<li><a href="http://www.rondhuit.com/download/linuxworld-2008.pdf">リクルートにおける検索エンジンSolrの活用</a>(PDF形式)</li>
<li><a href="http://www.unixuser.org/~haruyama/ecnavi/20080712_MCT_Solr.odp">Solrスゲェ!(ECナビ・ECナビラボ)</a>(odp形式)</li>
</ul>
<p>(2009/07/26追記)<br />
また新しい実績や事例として、<a href="http://atnd.org/events/937">Solr勉強会</a>で出ている各種事例が参考になりそうです。</p>
<ul>
<li><a href="http://labs.mapion.co.jp/blog/report/solr.php">Solr勉強会の資料公開しました：マピオンラボ(セミナー／勉強会)</a></li>
<li><a href="http://labs.ecnavi.jp/developer/2009/07/solr.html">ECナビ デベロッパー ネットワーク: Solr勉強会の資料を置きました.</a></li>
<li><a href="http://d.hatena.ne.jp/zegenvs/20090721/p1">Solr勉強会に行ってきました[solr][ecnavi][mapion][recruit] &#8211; d.hatena.zeg.la</a></li>
<li><a href="http://d.hatena.ne.jp/code46/20090722/p1">Solr勉強会に行ってきました。 &#8211; 不可視点</a></li>
<li><a href="http://d.hatena.ne.jp/Kishi/20090722/1248281864">Solr勉強会行ってきた。 &#8211; public static void main</a></li>
<li><a href="http://fujimoto.goga.co.jp/article/123994449.html">0を1にする瞬間が難しい: Solr勉強会メモ</a></li>
</ul>
<h3 id="performance">データ量/性能とハードウェア</h3>
<p>ハードウェアやデータ内容やその他様々な要素が関わってきますので一概には言えませんが、当社で検証した際の感触では<br />
<strong>特に念入りなチューニングをしなくても(※2)、Quad Core CPUと4GB以上のメモリとそれなりに高速なディスクがあれば、1台で少なくとも数百万件オーダーのデータ(※1)には対応できる</strong>※3<br />
という感じになります。</p>
<p>※1　ここでは、30フィールドほどあるそれなりに大きめのデータのケースを想定しています。<a href="http://d.hatena.ne.jp/bowez/20090527#p1">ぼうずの日常的雑感 &#8211; Solr のメモリについての体験談</a>でご指摘のように、データによってかなり結果は異なってくると思いますし、またJVMが32bitか64bitかによってメモリ使用量が異なるようです。また、同ブログの<a href="http://d.hatena.ne.jp/bowez/20090616#p1">Solr のメモリ使用量を小さくする</a>には、メモリ使用量の調整の方法が記載されています。<br />
※2　最低限のチューニングは必要でした。後日別エントリで紹介したいと思います。<br />
※3　(追記)検索と更新を同時に行うような場合は、パフォーマンス問題が発生する可能性があります。<a href="#searchandupdate">検索と更新</a>も併せて参照ください。</p>
<p>詳細は次の通りです。</p>
<ul>
<li>基本的には他のデータベースと同様にI/Oバウンドなアプリケーションとなりますので、ディスク性能があった方が良いです。</li>
<li>大量のデータを扱う場合、Solrのキャッシュ機構の影響か、Luceneに比べてもメモリを大量に消費する気がします。メモリは4GB以上を最初から検討しておいた方が良いです。</li>
<li>よって、最初から64bit OSを検討しておく必要があります。</li>
<li>大量のスレッドを使用するマルチスレッドアプリケーションとなりますので、CPUも出来ればQuad Core以上の方がよいと思います。同時検索数で違いが出てきます。</li>
</ul>
<p><a href="#scaleout">後述のように</a>Solrはスケーラビリティに優れていますので、複数のハードウェアを並べて分散検索や数千万から一億程度のデータも扱うことが出来るようです。(当社では検証出来ていませんが)<br />
Solr(Lucene)で扱えるドキュメント数については、以下のURLが参考になります。</p>
<ul>
<li><a href="http://lucene.jugem.jp/?eid=221">Distributed Search on Solr 1.3 | 関口宏司のLuceneブログ</a></li>
<li><a href="http://d.hatena.ne.jp/knaka20blue/20080820/1219197203">Solrとは &#8211; Solr, Python, MacBook Air</a></li>
</ul>
<h3 id="multicore">マルチコア構成</h3>
<p>Solrには「コア」と呼ばれる概念があります。<br />
以下、<a href="http://www.rondhuit.com/download.html">株式会社ロンウイット／ダウンロード</a>にあるホワイトペーパー<a href="http://www.rondhuit.com/download/RONDHUIT-REPORT-Vol4.pdf">『RONDHUIT REPORT Vol.4 「Solr 1.3の新機能」（全2ページ）』</a>から引用します。</p>
<blockquote>
<p>
Solrには「コア」のオブジェクトがあり、検索リクエストを処理する各種リクエストハンドラ、検索を実行するサーチャー、インデックスのスキーマ定義、各種ツール・オブジェクト等さまざまなデータを保持している。Solr 1.2まではSolrインスタンスにコアは1つであったが、Solr 1.3からは複数持てることになった。これがマルチコアである。
</p>
</blockquote>
<p>複数のSolrアプリケーションが必要な場合、一般的にはSolr1.3から実装されたマルチコア機能を用いて1つのサーブレットアプリケーションで実現することができます。<br />
マルチコア構成では、コアごとにデータ、アプリケーション設定、スキーマ(DB定義)を別々に定義できます。(追記: 同じ設定ファイルを使うのも勿論OKです)</p>

<div class="wp_codebox"><table width="100%" ><tr id="p29418"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p294code18"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;solr</span> <span style="color: #000066;">persistent</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">sharedLib</span>=<span style="color: #ff0000;">&quot;lib&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cores</span> <span style="color: #000066;">adminPath</span>=<span style="color: #ff0000;">&quot;/admin/cores&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;core</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;core1&quot;</span> <span style="color: #000066;">instanceDir</span>=<span style="color: #ff0000;">&quot;core1/&quot;</span> <span style="color: #000066;">config</span>=<span style="color: #ff0000;">&quot;/solr_home/conf/solrconfig1.xml&quot;</span> <span style="color: #000066;">schema</span>=<span style="color: #ff0000;">&quot;/solr_home/conf/schema1.xml&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;core</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;core2&quot;</span> <span style="color: #000066;">instanceDir</span>=<span style="color: #ff0000;">&quot;core2/&quot;</span> <span style="color: #000066;">config</span>=<span style="color: #ff0000;">&quot;/solr_home/conf/solrconfig2.xml&quot;</span> <span style="color: #000066;">schema</span>=<span style="color: #ff0000;">&quot;/solr_home/conf/schema2.xml&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/cores<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/solr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>またアプリケーション稼働中に動的にコアの追加/削除/リロードなどが可能になっていますので、運用をしながらコアの増減や設定変更を行うことができます。<br />
(参考: <a href="http://wiki.apache.org/solr/CoreAdmin">CoreAdmin &#8211; Solr Wiki</a>)</p>
<p>ちなみにSolr1.2までの場合には以下の方法で対応していたと思いますが、Solr1.3の上記マルチコア機能により、それらは必要なくなったようです。</p>
<dl>
<dt>Solrのスキーマで、論理的なアプリケーションを区別する識別子を持っておき、1つのSolrを用意</dt>
<dd>この場合、スキーマやデータは一つとなります。</dd>
<dt>複数のSolrアプリケーションをアプリケーションサーバにデプロイする</dt>
<dd>この場合、スキーマやデータは複数となりますが、大量のアプリケーションがデプロイされることになりますので、リソースを消費します。</dd>
</dl>
<h3 id="search">様々な検索</h3>
<p>一概に『全文検索サーバアプリケーション』と言っても、Solrは多機能です。<br />
重要な機能としては次のようなものがあります。</p>
<dl>
<dt>単語検索/LIKE検索(完全一致/部分一致)</dt>
<dd>OracleやPostgreSQLと同じく、通常の単語検索やLIKE検索を行うことができます。それにより、完全一致/部分一致での検索を行うことができます。</dd>
<dt>全文検索</dt>
<dd>形態素解析やN-Gramと呼ばれる方式により、全文検索を行うことができます。</dd>
<dt>ファセット検索</dt>
<dd>例えば日付範囲や、カテゴリーなどの「ファセット」ごとの検索結果件数を簡単に取得したり、そこからさらに絞り込み検索を行ったり、ということができます。<br />
		サンプルとしては<a href="http://www.rondhuit-demo.com/lbs2demo/search/index">関口宏司のLuceneブログ &#8211; ブログ検索デモ</a>があります。<br />
		(参考: <a href="http://lucene.jugem.jp/?eid=169">Luceneブログ内検索デモのリニューアル | 関口宏司のLuceneブログ</a>)<br />
		見て分かる通り、カテゴリをクリックするとその検索結果が表示されますが、検索結果画面の右サイドバーからさらに絞り込みが行えます。</p>
<p>		この機能の使いどころとしては、例えば次のようなことがあります。</p>
<ul>
<li>キーボード入力無しで、簡単に絞り込み検索を実現できる</li>
<li>カテゴリごとの集計結果を利用した統計情報が簡単に取得できる</li>
</ul>
</dd>
<dt>重み付け検索</dt>
<dd>
		特定のフィールドに重みを付けた検索結果を得ることができるようです。<br />
		<a href="http://d.hatena.ne.jp/knaka20blue/20081210/1228898458">ヒット件数が数十万件を超えるような場合でも使える。新しくインデキシングしたドキュメントを検索結果の上位に表示する２つの方法。 &#8211; Solr, Python, MacBook Air</a>が参考になりそうです。(フレッシュネスブーストというようです)
	</dd>
<dt>分散検索</dt>
<dd>複数のSolrサーバに対し、検索を実行することができます。詳しくは<a href="#scaleout">スケールアウト</a>を参照ください。</dd>
</dl>
<h3 id="scaleout">スケールアウト</h3>
<p>Solrは以下のような方法でスケールアウトが出来ができ、1億を超えるドキュメントを扱うことが出来るようです。</p>
<ul>
<li>Solr1.3から実装されたDistributedSearch(分散検索)機能を用いれば、複数のSolrノード(=Shards)に振り分けたデータに対して1リクエストで同時に検索が実行できます。<br />
		DistributedSearch部分のソースコードを見る限りThreadPoolExecutorで複数のShardsにマルチスレッドで検索しますので、Solrノードを増やしても処理速度はほぼ一定に保たれると考えられます。<br />
		<br />
		なおデータを何らかの規則でパーティショニングしておけば、分散検索を用いなくても特定のSolrノードに対して検索を実行すれば良くなりますので、そのような設計も検討することができます。</li>
<li>レプリケーション機能を用いれば、同一のデータを持つSolrノードを複数持つことができます。検索を複数のSolrノードに振り分けることで、1つのSolrノードの負荷を下げることができます。</li>
</ul>
<h3 id="searchandupdate">検索と更新</h3>
<p>当然ですが、大量の検索と更新が同時に発生する場合、どうしてもパフォーマンスに問題が発生します。<br />
レプリケーション機能を用いて検索サーバと更新サーバを分けることも出来そうですが、<br />
例えばインデクシングにリアルタイム性が求められないのであれば、<br />
夜間バッチで前日分の更新を行うなどの対応も検討することができます。</p>
<h3 id="links">これからSolrを始めるための情報リスト</h3>
<p>ここでは、これから実案件などでSolrの利用を検討している方に、参考になるような情報源をいくつかに分けて紹介したいと思います。</p>
<h4 id="perspective">全体像をつかむ</h4>
<dl>
<dt>全文検索システム「Solr」徹底活用ガイド(Software Design 2007年12月号)</dt>
<dd>本記事の内容は本エントリー内の<a href="#softwaredesign">使ってみる</a>というところで紹介していますが、ただのインストールだけではなく幅広い内容を扱っており、おすすめです。</dd>
<dt><a href="http://lucene.apache.org/solr/">公式サイト</a></dt>
<dd><a href="http://lucene.apache.org/solr/features.html">機能一覧</a>や<a href="http://wiki.apache.org/solr/FAQ">FAQ</a>などに最初に目を通されることをおすすめします。<br />
		<br />
		特に機能一覧は重要です。<br />
		Solrはかなり高機能なので、思いもよらぬ機能が入っていることもあります。<br />
		<br />
		例えば</p>
<blockquote><p>
			Distributed search with sharded index on multiple hosts
		</p></blockquote>
<p>		とあるのを見ると、複数のSolrホストにまたがった分散検索が出来そうだということが分かります。
	</dd>
<dt><a href="http://www.rondhuit.com/download.html">株式会社ロンウイット／ダウンロード</a></dt>
<dd>Lucene/Solrのコミッターである関口氏の会社の資料ダウンロードページです。どの資料も、日本語の情報としては貴重なものです。</dd>
<dt><a href="http://www.rondhuit.com/download/linuxworld-2008.pdf">リクルートにおける検索エンジンSolrの活用</a>(PDF形式)</dt>
<dd>Solrの概要の他、技術系の話も交えた採用への道筋が載っており、非常にためになります。</dd>
<dt><a href="https://www.ibm.com/developerworks/jp/java/library/j-solr1/index.html">Apache Solr でもっと賢く検索する: 第 1 回 基本機能と Solr スキーマ</a></dt>
<dt><a href="https://www.ibm.com/developerworks/jp/java/library/j-solr2/">Apache Solr でもっと賢く検索する: 第 2 回 エンタープライズに対応した Solr</a></dt>
<dd>developerWorksの記事です。2007年の記事なのでやや古いですが、出来ることを設定ファイルや画面を関連づけて知ることが出来るため、分かりやすいと思います。</dd>
</dl>
<h4 id="1.3">Solr1.3について知る</h4>
<p>昨年秋に、Solr1.3がリリースされています。<br />
以下のサイトでは、Solr1.3での変更点などを知ることができます。</p>
<ul>
<li><a href="http://www.ibm.com/developerworks/jp/java/library/j-solr-update/index.html">Apache Solr の新しい内容 Solr 1.3 の新機能と機能改善を活用する</a></li>
<li><a href="http://www.rondhuit.com/download.html">株式会社ロンウイット／ダウンロード</a>にあるホワイトペーパー<a href="http://www.rondhuit.com/download/RONDHUIT-REPORT-Vol4.pdf">『RONDHUIT REPORT Vol.4 「Solr 1.3の新機能」（全2ページ）』</a></li>
</ul>
<h4 id="start">使ってみる</h4>
<p>今回あらためてGoogleで調べてみましたが、日本語リソースとしては、これからSolr1.3を使う方を対象とした分かりやすいインストール、設定のドキュメントで決定版と言えるものが2009年05月18日現在はまだ無いように思います。</p>
<p>私が昨年Solr1.2の時点で最初に参考にしたのは、以下の情報です。</p>
<dl id="softwaredesign">
<dt>全文検索システム「Solr」徹底活用ガイド(Software Design 2007年12月号)</dt>
<dd>上でも紹介した<a href="http://www.rondhuit.com/download/linuxworld-2008.pdf">リクルートにおける検索エンジンSolrの活用</a>を書かれた方の記事です。</p>
<ul>
<li>LIKE検索と全文検索の違い</li>
<li>形態素解析とN-gramとの違い</li>
<li>Solrのセットアップ</li>
<li>Solrのカスタマイズとチューニング</li>
<li>Solrに付属の同期スクリプト</li>
</ul>
<p>		など、幅広い話題を扱っており、非常に参考になります。
	</dd>
</dl>
<h4 id="refer">開発中、常に参照する</h4>
<dl>
<dt><a href="http://lucene.apache.org/solr/">Apache Solr(公式サイト)</a></dt>
<dd>Solrの公式サイトです。FeaturesやTutorialやJavaDocなどがあります。</dd>
<dt><a href="http://wiki.apache.org/solr/">Solr Wiki</a></dt>
<dd>Solr関連の公式Wikiです。不明な点があれば、Googleよりも最初にここで検索するのがよいと思います。インストール方法、設定、使い方、チューニング、など様々な情報があります。</dd>
<dt><a href="http://lucene.apache.org/solr/version_control.html">ソースコード</a></dt>
<dd>Solrはオープンソースなので、いつでもソースコードを参照できます。私もSolrJを使っていて問題に遭遇しましたが、ソースコードを参照することで問題解決しました。(参考: <a href="http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html">Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する方法(SolrJのバグの対処方法)</a>)<br />
(Thanks to <a href="http://d.hatena.ne.jp/bowez/20090527#p1">ぼうずの日常的雑感</a>様)
    </dd>
</dl>
<h4 id="useful">その他有用なサイト</h4>
<dl>
<dt><a href="http://lucene.jugem.jp/">関口宏司のLuceneブログ</a></dt>
<dd>LuceneおよびSolrのコミッターである関口さんのブログです。国内のブログでは一番と言っていいほどの新しい情報、濃い情報が入手できます。</dd>
<dt><a href="http://d.hatena.ne.jp/knaka20blue/archive?word=*[Solr]">Solr, Python, MacBook Air</a></dt>
<dd>Solrに関する検証記事などが多数あり、参考になります。</dd>
<dt><a href="http://repos.myfinder.jp/wiki/hadoop-and-lucene#5">hadoopとかsolrとかの実験</a></dt>
<dd>Solrに関するいくつかのページがあります。細かい内容も載っているため、参考になりそうです。</dd>
<dt><a href="http://d.hatena.ne.jp/bowez/searchdiary?word=*[Solr]">ぼうずの日常的雑感</a></dt>
<dd>SolrやLuceneに関する検証記事などがあります。1.4の話題や、DataImportHandlerなどの記事があります。</dd>
<dt><a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20090713/333679/?ST=oss">第4回　全文検索エンジン「Lucene/Solr」の用途と良さ</a></dt>
<dd>IT Proで始まった記事です。そもそも全文検索エンジンとは、というところから始まっているので、参考になります。(<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20090609/331558/?ST=oss">連載INDEX</a>)</dd>
</dl>
<h3 id="end">終わりに</h3>
<p>今回はSolr1.3の紹介が主となりましたが、<br />
次回以降、サンプルコードや最低限のチューニング設定などの公開も予定しています。</p>
<p>それではどうぞ楽しいSolr生活を！</p>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html">Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する方法(SolrJのバグの対処方法)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html" />
	</item>
	</channel>
</rss>
