Apache SolrをEmbeddedで起動する。

# 背景
仕事柄Apache solrを使っているのですが、自宅（ローカル）でも簡単に動かせたらいいなと思っていたところ、Embeddedで立ち上げられる事を最近知ったのでメモしておきます。

# Apache solrとは
Apacheが提供している全文検索エンジンライブラリです。管理画面を設けたり、ヒットハイライト、ファセット検索、キャッシュ、複製を備えたオープンソースでもリッチなライブラリとなっている事が特徴です。

# 準備するもの
・solr.xml - solr全般設定。
　ローカルで動かす事を前提にしたので、hostには"localhost"を設定しました。
　https://lucene.apache.org/solr/guide/6_6/format-of-solr-xml.html
・solrj - java上でsolrにクエリを発行するためのライブラリ（"pom.xml"を参照）。
・solr-core - solrのコア情報向けライブラリ（"pom.xml"を参照）。
・コアフォルダ - 作成したコアのデータを格納するフォルダ（"コアフォルダの階層"を参照）。
    
### pom.xml
```
	<!-- https://mvnrepository.com/artifact/org.apache.solr/solr-solrj -->
	<dependency>
	    <groupId>org.apache.solr</groupId>
	    <artifactId>solr-solrj</artifactId>
	    <version>7.7.1</version>
	</dependency>

	<dependency>
	    <groupId>org.apache.solr</groupId>
	    <artifactId>solr-core</artifactId>
	    <version>7.7.1</version>
	</dependency>
```

### コアフォルダの階層
今回はsrc/main/resources配下に次のフォルダを作成しました。
src/main/resources
　　┗ solrフォルダ
　　　　┣ solr.xml
　　　　┗ test_coreフォルダ
　　　　　　┗ core.properties（中身は空で良い）


# ソース
```embeddedSolr.java

	private static CoreContainer container;
	private static SolrClient client;
	
	// 設定情報を格納するディレクトリ
	private final static String solrFolder = "src/main/resources/solr";

	// solr起動
	public static void init(String coreName) {

		// 設定情報を読み込む
		container = new CoreContainer("src/main/resources/solr");
		container.load();

		try {
			// コアを指定して立ち上げる
			client = new EmbeddedSolrServer(container, coreName);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// データ追加
	public static void add() {

		// 追加用リスト
		List<SolrInputDocument> docList = new ArrayList<>();

		SolrInputDocument doc = new SolrInputDocument();
		doc.setField("id", "1");
		doc.addField("content_txt_ja", "太郎は野菜を買った。");
		docList.add(doc);

		doc = new SolrInputDocument();
		doc.setField("id", "2");
		doc.addField("content_txt_ja", "次郎はフルーツを売った。");
		docList.add(doc);

		doc = new SolrInputDocument();
		doc.setField("id", "3");
		doc.addField("content_txt_ja", "三郎はパンを買う予定。");
		docList.add(doc);

		doc = new SolrInputDocument();
		doc.setField("id", "4");
		doc.addField("content_txt_ja", "五郎は何も買わない。");
		docList.add(doc);

		try {
			// データを追加、コミットする。
			client.add(docList);
			client.commit();
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
	}

	// データ検索
	public static void select(String keyword) {

		// クエリ作成
		SolrQuery query = new SolrQuery();
		query.add("q", "content_txt_ja:\""+keyword+"\"");
		query.add("fl", "*,score");

		log.info("【Solr検索】query[{}]", query.toString());

		// 検索
		QueryResponse response = null;
		try {
			response = client.query(query);
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}

		// 検索結果取得
		SolrDocumentList list = response.getResults();
		for(SolrDocument doc : list) {
			String id = doc.getFieldValue("id").toString();
			String text = doc.getFieldValue("content_txt_ja").toString();
			String score = doc.getFieldValue("score").toString();
			log.info("【取得結果】 id[{}], text[{}] score[{}]", id, text, score);
		}
	}
	
	// solr停止
	public static void stop() {
		container.shutdown();
	}

```



# 実行結果
"買う"で検索した結果、次のデータがヒットしました。

```
【取得結果】 id[1], text[太郎は野菜を買った。] score[0.38845786] (EmbettedSolrInit.java:111)
【取得結果】 id[3], text[三郎はパンを買う予定。] score[0.3472057] (EmbettedSolrInit.java:111)
【取得結果】 id[4], text[五郎はお菓子を買って、家に帰る。] score[0.31387395] (EmbettedSolrInit.java:111)
```

とりあえず動かす事には成功したので、今後は動かしつつSolrの機能についてメモしていきたいと思います。