在嵌入式环境下启动Apache Solr

背景 – 背景资料或历史环境。

我使用Apache Solr来处理工作,但我一直希望能在家里(本地)也能轻松运行,最近我了解到它可以通过嵌入式方式启动,所以我将其记录在备忘录中。

Apache Solr是什么?

以下是Apache提供的全文搜索引擎库。其特点是提供了管理界面、高亮显示、Facet搜索、缓存和复制等功能,并且还是一个富有特色的开源库。

準備所需的事物 suǒ xū de shì wù)

・solr.xml – Solr的整体设置。由于假设在本地运行,所以将主机设置为“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的功能。

bannerAds