LoginSignup
0
0

More than 5 years have passed since last update.

Apache SolrをEmbeddedで起動する。

Posted at

背景

仕事柄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の機能についてメモしていきたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0