Solr學習筆記---部署Solr到Tomcat上,可視化界面的介紹和使用,Solr的基本內容介紹,SolrJ的使用


學習Solr前需要有Lucene的基礎

Lucene的一些簡單用法:https://www.cnblogs.com/dddyyy/p/9842760.html

1.部署Solr到Tomcat(Windows)

  Solr自帶小型服務器jetty,但在我們開發環境中,習慣使用Tomcat,所以把Solr部署到Tomcat上(Tomcat 8.0以上,jdk 1.8以上)

  其實步驟相同,但在windows配置要方便一些,所以第一次還是使用Windows來部署。

  1.1 准備工作

    Solr下載地址:http://archive.apache.org/dist/lucene/solr/

    Tomcat下載地址:http://tomcat.apache.org/  

   1.2 把 solr-7.5.0\server\solr-webapp下的webapp文件夾移到apache-tomcat-9.0.12\webapps下並改名solr(這個名字隨便起)

 

  1.3 導入運行時候需要的依賴包,把solr-7.5.0\server\lib\ext下的包放到apache-tomcat-9.0.12\webapps\solr\WEB-INF\lib下,

              把solr-7.5.0\server\lib下m開頭的五個jar和gmetric4j-1.0.7.jar放到apache-tomcat-9.0.12\webapps\solr\WEB-INF\lib下

  1.4 在任意地方創建一個solrHome,里面有一個solrCore,個人和我們的數據庫類似,一個用戶下可以創建很多個不同的數據庫

  1.5 把solr-7.5.0\server下的solr文件夾下的內容復制到solrHome下

 

  1.6 修改默認的solrHome,在apache-tomcat-9.0.12\webapps\solr\WEB-INF的web.xml修改 加上

    

<env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>D:\Solr\solrHome</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
</env-entry>

  env-entry-value寫自己的solrHome位置

  並注釋以下這段話,不然會報403

  

  <!-- Get rid of error message -->
  <!--<security-constraint>
    <web-resource-collection>
      <web-resource-name>Disable TRACE</web-resource-name>
      <url-pattern>/</url-pattern>
      <http-method>TRACE</http-method>
    </web-resource-collection>
    <auth-constraint/>
  </security-constraint>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Enable everything but TRACE</web-resource-name>
      <url-pattern>/</url-pattern>
      <http-method-omission>TRACE</http-method-omission>
    </web-resource-collection>
  </security-constraint>-->

  1.7 把solr-7.5.0\server\resources的log4j2.xml放到apache-tomcat-9.0.12\webapps\solr\WEB-INF的classes文件夾下,classes文件剛開始沒有,自己創建一個。

  1.8 啟動Tomcat

  

2.界面的簡單介紹

    

  2.1.Dashboard

    儀表盤,顯示了系統資源,jvm等信息

  2.2.Logging

    Solr運行的日志

  2.3 Core Admin

    Solr Core的管理頁面

  2.4 java properties

    Solr在JVM 運行環境中的屬性信息,包括類路徑、文件編碼、jvm內存設置等信息

  2.5 Thread Dump

    顯示Solr Server中當前活躍線程信息,同時也可以跟蹤線程運行棧信息

3.創建一個solrCore

  既然之前說類似於數據庫,使用數據庫之前肯定就要先創建數據庫,我們使用Solr就要先創建一個solrCore,直接使用可視化界面創建

  

  報錯了,解決方法:solr-7.5.0\server\solr\configsets\_default下的config文件移到solrHome\new_core下

  

  重啟Tomcat

  在點擊下add core 就出現了

 

  一個MySql實例可以創建多個數據庫,所以我們當然可以創建多個solrCore啦

  

   修改core.properties

    

 

   

  重啟Tomcat

  

4.Solr中的重要信息配置

    在增刪查改前,我們要先了解一點Solr的信息配置

    在Lucenc中有域和索引的概念,域是由域名和域的內容構成的,域名經過分詞,形成索引。

    在Lucene中域是有類型的,比如StringField,LongField類型等,那么在Solr中域的類型由寫在solrHome\new_core\conf\managed-schema中 

  4.1 fieldType 域類型

    

   <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymGraphFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        <filter class="solr.FlattenGraphFilterFactory"/>
        -->
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

 

    name:類型名字

    class:指定該域類型對應的solr類型

    analyzer:指定分詞器(中文使用ikanalyzer)屬性type index,query表示在創建索引和查詢索引時使用的分詞器

    tokenizer:分詞器的類型

    filter:過濾器的類型

  4.2 fieldtype 域

    

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />

    name:域的名字

    type:域的類型(自己定義的)

    indexed:是否索引

    stroed:是否存儲

    required:是否必須

    multiValued:是否多值

  4.3 dynamicField 動態域

    

<dynamicField name="*_i"  type="pint"    indexed="true"  stored="true"/>

    例子:為文檔增加域的時候,你可以用 “隨便起的_i”當做域名, 凡是以_i結尾的 type都是pint,需要indexed,需要stored  

  4.4 uniqueKey 唯一鍵

  

<uniqueKey>id</uniqueKey>

    表示id唯一

5.配置中文分詞器 ikanalyzer

  既然要添加索引,添加索引之前需要luncenc幫我們分詞,而官方的分詞器對中文的分詞基本是稀爛的,所以我們需要使用第三方的分詞器 ikanalyzer

  5.1 下載ikanalyzer

  下載地址:https://github.com/magese/ik-analyzer-solr7

  5.2 配置ikanalyzer 

  首先把ik-analyzer-7.5.0.jar放到apache-tomcat-9.0.12\webapps\solr\WEB-INF\lib目錄下

  然后:

  

  5.3 使用ikanalyzer

  在solrHome\new_core\conf\managed-schema中自定義fieldtype和field,使用中文分詞器來分詞

  

 <!--IKAnalyzer-->
    <fieldType name="text_ik" class="solr.TextField">
      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    </fieldType>
  <!--IKAnalyzer Field-->
   <field name="title_ik" type="text_ik" indexed="true" stored="true" />
   <field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>

  5.4 測試一下

    重啟tomcat

      

    

    問題來了,我的名字沒有加到詞庫,但是如果隨着新的詞語出現,我們就沒辦法分詞了,ik分詞器給我們提供了可以手動或自動加入詞匯的方法

    apache-tomcat-9.0.12\webapps\solr\WEB-INF\classes下的ext.dic加入自己的詞匯,重啟Tomcat

    

    

6.使用可視化界面增刪查改文檔

   增加文檔

  

  更新文檔

  

 

   刪除文檔

  

  查詢文檔

    首先查詢所有  *:*

  

      加上過濾條件等一系列條件

    

      

 

 

      q: 查詢關鍵字 查詢所有*:* 查詢固定的 就用 域名:域值

      fq:過濾查詢

      sort:排序  格式   :  先寫域名然后加升序或降序 ,不同域用逗號隔開        id desc,title_ik desc

      start row : 用於分頁

      fl:返回指定的域和域值,不同域用逗號隔開

      df:指定一個搜索域,用處:比如有的時候你在百度查 “Solr”,你輸入的應該直接是Solr,不會輸一個Content:Solr吧,那么我們就可以指定默認搜索域Content,你輸入Solr就默認加上域值。

      wt:指定輸出格式 

      hi:是否高亮,在指定的域中,比如我搜索中國,經過分詞,在title_ik域中找到了中國,那么在中國這兩個字之前就加上pre前綴,在后面加上post后綴

7.使用SolrJ

   Solr和SolrJ的關系類似於MySQL和JDBC,用java代碼來完成文檔的增加。

  7.1壞境搭建    

<dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-solrj</artifactId>
        <version>7.5.0</version>
</dependency>

  7.2 代碼

package com.dingyu.sSolrJ;

import java.io.IOException;

import org.apache.commons.math3.geometry.partitioning.BSPTreeVisitor.Order;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;

/**
 * SolrJ的簡單使用
 * 
 * @author 丁宇
 *
 */
public class SolrJTest {
    /**
     * 獲得連接
     * 
     * @return 連接對象
     */
    private HttpSolrClient getClient() {
        HttpSolrClient client = new HttpSolrClient.Builder("http://127.0.0.1:8080/solr/new_core").build();
        return client;
    }

    /**
     * 增加/修改文檔
     * 
     * @throws SolrServerException
     * @throws IOException
     */
    @Test
    public void addOrUpdateDoc() throws SolrServerException, IOException {
        // 獲得連接對象
        HttpSolrClient client = getClient();
        // 創建一個文檔對象
        SolrInputDocument document = new SolrInputDocument();
        // 加域
        document.addField("id", "521");
        document.addField("title_ik", "張三說的在理");
        // 提交
        client.commit();
        client.close();
    }

    /**
     * 刪除文檔
     * 
     * @throws SolrServerException
     * @throws IOException
     */
    @Test
    public void deleteDoc() throws SolrServerException, IOException {
        // 獲得連接對象
        HttpSolrClient client = getClient();
        // 根據id刪除
        client.deleteById("521");
        client.commit();
        client.close();
    }
    /**
     * 查詢文檔
     * @throws SolrServerException
     * @throws IOException
     */
    @Test
    public void selectDoc() throws SolrServerException, IOException {
        // 獲得連接對象
        HttpSolrClient client = getClient();
        // 搜索條件
        SolrQuery query = new SolrQuery("*:*");
        //設置過濾條件
        query.setFilterQueries("title_ik:[10 TO 20]");
        //排序
        query.setSort("title_ik",ORDER.asc);
        //分頁
        query.setStart(0);
        query.setRows(10);
        //要顯示的域
        query.setFields("id","title_ik");
        // 設置默認搜索域
        query.set("df", "product_name");
        // 設置高亮
        query.setHighlight(true);
        query.addHighlightField("title_ik");
        query.setHighlightSimplePre("<em>");
        query.setHighlightSimplePost("</em>");
        
        //執行查詢
        QueryResponse response = client.query(query);
        //查詢結果,一個文檔集合
        SolrDocumentList results = response.getResults();
        //遍歷
        for (SolrDocument solrDocument : results) {
            //根據key 獲得value
            System.out.println(solrDocument.get("id"));
        }
        client.close();
    }

}

  7.3測試結果

  

  

 

  

  

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM