背景
仕事柄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(中身は空で良い)
ソース
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の機能についてメモしていきたいと思います。