Apache Solr

 

solrjでインデックス生成・検索

solrjでインデックスの生成とインデックス検索をします。インデックス追加・更新・削除・検索、をとりあえず一通り試すことができます。まずはこのサンプルから始め、じょじょに使いこなしていきましょう!

新サイト、tree-mapsを公開しました!!

tree-maps: 地図のWEB TOOLの事ならtree-mapsにお任せ!

地図に関するWEB TOOL専門サイトです!!

大画面で大量の緯度経度を一気にプロット、ジオコーディング、DMS<->DEGの相互変換等ができます!

◯ 広告

solrでインデックスを生成するには、xmlをpostするか、ファイルからxmlやjsonを読み込むか、DBから読み込む等の方法があります。

それらを簡単い行う事ができるAPIがsolrjです。かなり簡単にインデックス生成できます。

apache-solr-3.6.0.zipに含まれているので、すぐ試すことができます。

習うより慣れろ、という事でいきなりインデックス生成とインデックス検索のs2JUnitのテストケースです。

solrのインストールsolrの日本語形態素解析の設定を済ませている事前提のコードです。

solrjのConcurrentUpdateSolrServerを使うのですが、solr3.6に添付されているhttpclientの3系では動きません。

なので、httpclientの4系をダウンロードして下さい。

その中の以下のjarを、solr-test/WebContent/WEB-INF/libにコピーします。

  • httpclient-4.1.1.jar
  • httpcore-4.1.jar
  • httpmime-4.1.1.jar

まずはschema.xmlに、text_ja型のDynamicFieldを追加します。

 <fields>
   <!-- ↓↓↓ 以下のダイナミックフィールドを追加 ↓↓↓ -->
   <dynamicField name="*_text_ja" type="text_ja" indexed="true" stored="true" multiValued="true"/>
 </fields>

続いてDto。

package test.dto;

import java.util.List;

import org.apache.solr.client.solrj.beans.Field;

public class TestDto {

	@Field("id")
	private String id;

	@Field("freeword_text_ja")
	private List<String> freeword;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public List<String> getFreeword() {
		return freeword;
	}

	public void setFreeword(List<String> freeword) {
		this.freeword = freeword;
	}
}

続いてインデックスの生成・検索のテストケースです。

package test.index;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrServer;
import org.apache.solr.client.solrj.impl.LBHttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.junit.Assert;
import org.junit.runner.RunWith;
import org.seasar.framework.unit.Seasar2;
import org.seasar.framework.util.tiger.CollectionsUtil;

import test.dto.TestDto;

@RunWith(Seasar2.class)
public class IndexTest {

	private static String solrServerUrl = "http://localhost:8080/solr-test/core1/";

	public void updateIndex() throws SolrServerException, IOException {
		System.out.println("インデックス生成開始");
		int queueSize = 1;
		int threadCount = 1;
		// インデックス更新時はConcurrentUpdateSolrServerを使う
		SolrServer server = new ConcurrentUpdateSolrServer(solrServerUrl, queueSize, threadCount);

		List<TestDto> list = CollectionsUtil.newArrayList();
		List<String> freewordList;
		TestDto dto;
		// 1件目
		dto = new TestDto();
		dto.setId("1");
		freewordList = CollectionsUtil.newArrayList();
		freewordList.add("当店は宇治にある抹茶でおなじみのお店です!チーズケーキもオススメです!");
		dto.setFreeword(freewordList);
		list.add(dto);
		// 2件目
		dto = new TestDto();
		dto.setId("2");
		freewordList = CollectionsUtil.newArrayList();
		freewordList.add("LeTAOでは現在期間限定で宇治抹茶ケーキを販売しています。");
		dto.setFreeword(freewordList);
		list.add(dto);

		// インデックス全件生成時は既存のインデックスを全削除する
		server.deleteByQuery("*:*");
		// インデックスを生成する
		server.addBeans(list);
		// 生成したインデックスをコミットする
		server.commit();
		// 古いインデックスファイルを削除して最適化する
		server.optimize();
		System.out.println("インデックス生成完了");
		Assert.assertTrue(true);
	}

	public void searchIndex() throws MalformedURLException, SolrServerException {
		SolrQuery query = new SolrQuery();
		String word = "宇治抹茶ケーキ";
		query.setQuery("+freeword_text_ja:" + word);
		query.setStart(0);
		query.setRows(100);

		// インデックス検索時はLBHttpSolrServerを使う
		SolrServer server = new LBHttpSolrServer(solrServerUrl);
		QueryResponse rsp = server.query(query);
		List<TestDto> resultDocList = rsp.getBeans(TestDto.class);
		Assert.assertEquals(1, resultDocList.size());
		for (TestDto doc : resultDocList) {
			System.out.println(doc.id);
			for (String freeword : doc.freeword) {
				System.out.println(freeword);
			}
		}
	}
}

solrの日本語形態素解析の設定の「宇治抹茶ケーキ」の検索でLeTAOの文章1件のみが返ります。

solr adminのページで、Query Stringに「*:*」を指定してSearchを押下します。

*:*は、全フィールドの全ての値を検索する、という意味の検索クエリです。

solr adminでインデックスの中身を確認

以下のようなxmlが返ります。尚、検索結果のlimitはデフォルトで10なので、10件以上返りません。

solr adminでインデックスの中身を確認

◯ 広告