Solr的使用-獨立服務(wù)器模式

一、Solr是什么?

  1. Solr是一個開源的、獨立的、快速的、高性能、高可擴(kuò)展的企業(yè)級搜索應(yīng)用服務(wù)器,用于構(gòu)建搜索應(yīng)用程序。它是基于Lucene(全文搜索引擎)的Java搜索應(yīng)用服務(wù)器(是一套war程序),是Lucene的更高一層的擴(kuò)展封裝,底層使用易于擴(kuò)展和修改的Java 來實現(xiàn)。服務(wù)器通信使用標(biāo)準(zhǔn)的HTTP 和XML。同時也易于加入到Web應(yīng)用程序中。
  2. Solr提供了層面搜索(即統(tǒng)計)、命中醒目顯示并且支持多種輸出格式(包括XML/XSLT、JSON、.CSV等格式)。它易于安裝和配置,而且通過基于HTTP的webapp服務(wù)器實現(xiàn)可視化管理界面,方便使用人員配置、訪問和調(diào)用。Solr已經(jīng)在眾多大型的網(wǎng)站中使用,較為成熟和穩(wěn)定。
  3. Solr 包裝并擴(kuò)展了 Lucene的Java API(即內(nèi)部集成了Lucene,apache提供的一些對搜索引擎做支持的jar包),所以Solr的基本上沿用了Lucene的相關(guān)術(shù)語。更重要的是,Solr 創(chuàng)建的索引與 Lucene 搜索引擎庫完全兼容。
  4. 通過對Solr 進(jìn)行適當(dāng)?shù)呐渲茫承┣闆r下可能需要進(jìn)行編碼,Solr 可以閱讀和使用構(gòu)建到其他 Lucene 應(yīng)用程序中的索引。
  5. 此外,很多 Lucene 工具(如Nutch、 Luke)也可以使用Solr 創(chuàng)建的索引。可以使用 Solr 的表現(xiàn)優(yōu)異的基本搜索功能,也可以對它進(jìn)行擴(kuò)展從而滿足企業(yè)的需要。
  6. 使用Solr構(gòu)建的應(yīng)用程序非常復(fù)雜,可提供高性能。
    總之,Solr是一個可擴(kuò)展、可部署、搜索/存儲引擎,優(yōu)化搜索大量以文本為中心的數(shù)據(jù)。

二、Solr的特性

  1. 高級、強(qiáng)大的全文搜索功能;
  2. 專為高通量的網(wǎng)絡(luò)流量進(jìn)行的優(yōu)化;
  3. 基于開放接口(XML和HTTP)的標(biāo)準(zhǔn);
  4. 綜合的HTML管理界面;
  5. 可伸縮性 -- 能夠有效地復(fù)制到另外一個Solr搜索服務(wù)器;
  6. 使用XML配置達(dá)到靈活性和適配性;
  7. 高可擴(kuò)展的插件體系;
  8. 高亮顯示檢索結(jié)果
  9. 動態(tài)集群;
  10. 數(shù)據(jù)庫接口和電子文檔(Word ,PDF 等)的處理;
  11. 數(shù)據(jù)存儲和處理;

三、Lucene是什么?

Lucene 是一個基于 Java 的全文信息檢索工具包,它不是一個完整的搜索應(yīng)用程序,而是為你的應(yīng)用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta(雅加達(dá)) 家族中的一個開源項目。也是目前最為流行的基于 Java 開源全文檢索工具包。目前已經(jīng)有很多應(yīng)用程序的搜索功能是基于 Lucene ,比如 Eclipse 幫助系統(tǒng)的搜索功能。Lucene 能夠為文本類型的數(shù)據(jù)建立索引,所以你只要把你要索引的數(shù)據(jù)格式轉(zhuǎn)化的文本格式,Lucene 就能對你的文檔進(jìn)行索引和搜索。

四、Solr vs Lucene

Solr與Lucene 并不是競爭對立關(guān)系,恰恰相反Solr 依存于Lucene,因為Solr底層的核心技術(shù)是使用 Apache Lucene 來實現(xiàn)的,簡單的說Solr是Lucene的服務(wù)器化。
需要注意的是Solr 并不是簡單的對Lucene 進(jìn)行封裝,它所提供的大部分功能都區(qū)別于Lucene 。
Solr和Lucene的本質(zhì)區(qū)別有以下三點:搜索服務(wù)器,企業(yè)級和管理。Lucene本質(zhì)上是搜索庫,不是獨立的應(yīng)用程序,而Solr是。Lucene專注于搜索底層的建設(shè),而Solr專注于企業(yè)應(yīng)用。Lucene不負(fù)責(zé)支撐搜索服務(wù)所必須的管理,而Solr負(fù)責(zé)。所以說,一句話概括 Solr: Solr是Lucene面向企業(yè)搜索應(yīng)用的擴(kuò)展。

Solr 和 Lucene的架構(gòu)圖:(此圖是借用的別的博客上的,后面會寫上鏈接)


Solr與Lucene的架構(gòu)圖.png

這個圖很繁瑣,看不懂,大家不要灰心,在后面的代碼里你就能夠了解了這個圖所講的。

不難看出,綠色的就是lucene的模塊,而藍(lán)色的就是solr擴(kuò)展了lucene。從圖上可以看出以下幾點:

  1. 一個真正的擁有動態(tài)字段(Dynamic Field)和唯一鍵(Unique Key)的數(shù)據(jù)模式(Data Schema)
  2. 對Lucene查詢語言的強(qiáng)大擴(kuò)展!
  3. 支持對結(jié)果進(jìn)行動態(tài)的分組和過濾
  4. 高級的,可配置的文本分析
  5. 高度可配置和可擴(kuò)展的緩存機(jī)制
  6. 性能優(yōu)化
  7. 支持通過XML進(jìn)行外部配置
  8. 擁有一個管理界面
  9. 可監(jiān)控的日志
  10. 支持高速增量式更新(Fast incremental Updates)和快照發(fā)布(Snapshot Distribution)

五、solr兩種部署模式介紹

  1. Standalone Server 獨立服務(wù)器模式(單機(jī)啟動模式):適用于數(shù)據(jù)規(guī)模不大的場景;
  2. SolrCloud 分布式集群模式(集群啟動模式):適用于數(shù)據(jù)規(guī)模大,高可靠、高可用、高并發(fā)的場景;

solr的簡介就到此結(jié)束了,相信大家也對solr有了初步的了解,下面讓我們開始安裝、使用Solr吧,在使用過程中也順便介紹一下solr的常用屬性。

Solr軟件的安裝與使用

一、環(huán)境介紹

  1. 系統(tǒng):Linux、Windows、MacOS;
  2. JDK需在JDK1.7+ 版本(運行標(biāo)準(zhǔn)Solr 服務(wù)只需要安裝JRE 即可,但如果需要擴(kuò)展功能或編譯源碼則需要下載JDK 來完成。從solr6開始只能使用jdk1.8+。);
  3. maven需在Maven3+ 版本;
  4. tomcat服務(wù)器建議在tomcat7+ 版本;
  5. mysql數(shù)據(jù)庫需在mysql5+ 版本;
  6. solr需在solr4+ 版本(solr5.0以上建議tomcat服務(wù)器在tomcat8以上);
    注意:solr4.x版本的核心類及常用的屬性,和solr5.0以上的差不多,但是還有細(xì)微的區(qū)別,請注意!

我這里使用的是MacOS10.14.5、JDK1.8.0_212、Maven3、tomcat9.0.20、mysql5.7、solr8.1.1。

二、安裝Solr

  • 通過brew安裝
  1. 通過brew安裝的,命令如下:
$ brew search solr   # 搜索一下是否有可用的solr軟件
$ brew install solr  # 安裝solr
安裝solr.png
  1. 運行以下命令,啟動Solr服務(wù)器。命令如下:
$ solr start  # 開始運行Solr服務(wù)器,默認(rèn)是8983端口
$ solr stop   # 停止運行Solr服務(wù)器
啟動solr服務(wù).png

啟動成功,說明Solr安裝成功。

  1. 在瀏覽器中,輸入“http://localhost:8983/solr/”訪問solr服務(wù)。出現(xiàn)如下圖頁面,說明服務(wù)器已經(jīng)成功啟動了。
    Solr Admin.png
  • Solr官網(wǎng)下載Solr壓縮包
  1. 在Solr官網(wǎng) 下載Solr 壓縮包。
  2. 解壓縮Solr壓縮包到目標(biāo)目錄。
  3. 運行solr命令啟動Solr服務(wù)器(默認(rèn)是8983端口)。
  4. 在瀏覽器中,輸入“http://localhost:8983/solr/”訪問solr服務(wù)。

三、創(chuàng)建Core Admin/Collections

一個solr服務(wù)是可以有多個core的。

  • 通過終端命令創(chuàng)建Core
    通過終端命令的方式創(chuàng)建Core,會自動幫你創(chuàng)建基本的conf、data文件夾及相關(guān)文件、core.properties文件。創(chuàng)建命令如下:
$ solr create -c testdemo
創(chuàng)建Core命令.png
界面查看創(chuàng)建的Core.png
  • 通過Solr可視化管理界面創(chuàng)建Core
  1. 我們先要在“server/solr”目錄下創(chuàng)建必要的配置信息,那么讓我們先進(jìn)入到solr安裝的目錄下,找到server目錄,然后進(jìn)入到server下的solr 目錄(solr目錄是存放創(chuàng)建的Core的目錄),在solr目錄下創(chuàng)建一個名為testdemo2的文件夾,然后將server/solr/configsets/_default目錄下的conf文件夾及文件拷貝到testdemo2文件夾中(conf文件夾及文件可以手動創(chuàng)建,我這里就簡單粗暴一點了),然后再在testdemo2下創(chuàng)建一個名為data的空文件夾,到這里準(zhǔn)備工作就完成了。文件結(jié)構(gòu)如下:
    從其他文件夾中拷貝conf文件夾及文件.png
創(chuàng)建testdemo2文件夾及相關(guān)信息.png
  1. 在Solr可視化管理界面中,選擇Core Admin選項,然后點擊Add Core按鈕,添加Core,填寫要求的基本信息。如下圖:
    Add Core.png

在添加的彈窗下方有個提示信息:instanceDir and dataDir need to exist before you can create the core,意思就是在創(chuàng)建Core之前要保證instanceDir和dataDir這兩個輸入框中填寫的文件夾一定是已經(jīng)存在的,否則就會報錯添加失敗。
在實踐中,dataDir輸入框中填寫的data(可自定義)文件夾可以不存在,它會自動幫你創(chuàng)建名為data的文件夾及其下的文件,但是其他輸入框中的文件是必須要存在的。否則報類似如下錯誤:

錯誤1.png

錯誤2.png
  1. 點擊?? Add Core按鈕,添加testdemo2核心。至此就完成了界面添加Core的過程,如下圖:
    添加核心testdemo2成功.png
testdemo2目錄結(jié)構(gòu).png

四、配置中文分詞器

solr雖然功能非常強(qiáng)大,但是solr還是存在一些不足的,下面我們就說說其中一個較大的問題那就是分詞問題,特別是中英文的混合分詞,處理起來非常棘手。在Solr中如果不配置中文分詞器,則默認(rèn)是不支持中文分詞的。如圖搜索解析:


沒有添加中文分詞器時的搜索解析信息.png

中文分詞的算法:基于字符串配置,基于統(tǒng)計以及機(jī)器學(xué)習(xí)的分詞方式。

這里我們使用兩種方式解決。

  • 使用Solr自帶的Smartcn中文分詞器
    Smartcn是Lucene自帶的一款基于統(tǒng)計規(guī)則來分詞的中文分詞器。
  1. libexec?/contrib?/analysis-extras?/?lucene-libs?目錄下找到Smartcn的jar包,如下圖:

    smartcn的jar包.png

  2. 將Smartcn的jar包拷貝到?server?/solr-webapp?/webapp?/WEB-INF??/lib?目錄下,如下圖:

    粘貼smartcn的jar到WEB-INF:lib目錄下.png

  3. 切換到創(chuàng)建的Core testdemo目錄下,配置conf目錄下的managed-schema文件(模式配置文件),在文件中添加如下信息,并保存。

<fieldType name="text_cn" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory" />
        </analyzer>
        <analyzer type="query">
            <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory" />
        </analyzer>
</fieldType>
  1. 添加完成,在終端運行$ solr restart -force命令重啟solr服務(wù)。
  2. 回到Solr管理界面,重新加載testdemo Core。然后再次進(jìn)行搜索解析,如下圖:


    重新加載testdemo Core.png
添加中文分詞解析器后的搜索解析信息.png
添加中文分詞解析器后的搜索解析信息2.png
  • 使用IK-Analyzer中文分詞器
    雖然solr自帶了支持中文分詞的Smartcn,但是其效果不是很好,擴(kuò)展性比較差不能自定義擴(kuò)展中文詞庫,所以推薦使用IK-Analyzer進(jìn)行分詞,IK-Analyzer支持屏蔽關(guān)鍵詞、新詞匯的配置。
  1. 下載IK-Analyzer分詞器的jar包。然后將jar包拷貝到server/solr-webapp/webapp/WEB-INF/lib目錄下(如果使用了tomcat,那么該jar包應(yīng)該拷貝到apache-tomcat-9.0.20/webapps/solr/WEB-INF/lib/目錄下)。
  2. 配置server/solr/testdemo/conf目錄下的managed-schema文件,在文件中添加如下內(nèi)容:
<fieldType name="text_ik" class="solr.TextField">
      <!-- 生成索引時使用的分詞器 -->
      <analyzer type="index">
        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf" />
        <filter class="solr.LowerCaseFilterFactory" />
      </analyzer>
      <!-- 查詢時使用的分詞器 -->
      <analyzer type="index">
        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf" />
        <filter class="solr.LowerCaseFilterFactory" />
      </analyzer>
</fieldType>
  1. 添加完成,在終端運行$ solr restart -force命令重啟solr服務(wù)。
  2. 回到Solr管理界面,重新加載testdemo Core。然后再次進(jìn)行搜索解析


    IKAnalyzer搜索解析結(jié)果.png

五、DIH導(dǎo)入索引數(shù)據(jù)并創(chuàng)建索引文件

DIH簡介:
DIH全稱是Data Import Handler 數(shù)據(jù)導(dǎo)入處理器,顧名思義這是向solr中導(dǎo)入數(shù)據(jù)的,我們的solr目的就是為了能讓我們的應(yīng)用程序更快的查詢出用戶想要的數(shù)據(jù),而數(shù)據(jù)存儲在應(yīng)用中的各種地方入xml、pdf、關(guān)系數(shù)據(jù)庫中,那么solr首先就要能夠獲取這些數(shù)據(jù)并在這些數(shù)據(jù)中建立索引來達(dá)成快速搜索的目的,這里就列舉我們最常用的從關(guān)系型數(shù)據(jù)庫中向solr導(dǎo)入索引數(shù)據(jù)。

  • 使用Solr可視化管理界面到如數(shù)據(jù)
  1. libexec/dist目錄下的solr-dataimporthandler-8.1.1.jarsolr-dataimporthandler-extras-8.1.1.jar兩個jar包拷貝到server/solr-webapp/webapp/WEB-INF/lib目錄下。

  2. 進(jìn)入testdemo Core目錄下的conf目錄,然后在solrconfig.xml文件中配置DIH,配置信息如下:

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">db-dataconfig.xml</str> <!-- 數(shù)據(jù)庫配置文件的路徑,根據(jù)你的配置文件的位置填寫路徑,可是寫相對路徑,也可以寫絕對路徑 -->
    </lst>
</requestHandler>
  1. 創(chuàng)建db-dataconfig.xml數(shù)據(jù)庫配置文件,然后配置數(shù)據(jù)庫信息,
<dataConfig>
    <!-- 配置數(shù)據(jù)庫,參數(shù)之間需要用 &amp; 連接 -->
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/artbase_30?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false" user="xxx" password="xxx" />

    <document>
        <!-- 配置entity( entity的name可以隨便起),可以把它當(dāng)作與數(shù)據(jù)庫中一個表對應(yīng),在query中書寫查詢sql -->
        <entity name="art_course_info" query="select Member_ID,Course_Name,Add_Time from art_course_info where Member_ID=0099">
            <field column="Course_ID" name="id"/>
            <field column="Member_ID" name="memberID"/>
            <field column="Course_Name" name="courseName"/>
            <field column="Synopsis" name="synopsis"/>
            <field column="Course_Photo" name="coursePhoto"/>
        </entity>
    </document>
</dataConfig>

注意:這里容易與schema中的配置混淆,我的理解是schema中配置的是創(chuàng)建索引的配置,而索引的創(chuàng)建需要有數(shù)據(jù)基礎(chǔ),而現(xiàn)在講的數(shù)據(jù)導(dǎo)入文件就是建立索引的數(shù)據(jù)基礎(chǔ),他是創(chuàng)建索引的元數(shù)據(jù)。現(xiàn)在配置文件完成后可以用DIH命令執(zhí)行了。

  1. 配置managed-schema文件,此文件中需要配置我們的業(yè)務(wù)域(即需要存儲的數(shù)據(jù)結(jié)構(gòu)),配置信息如下:
<!-- 配置字段域 -->
<field name="id" type="string" indexed="false" stored="true" required="true" multiValued="false" />
<field name="memberID" type="string" indexed="true" stored="true" />
<field name="courseName" type="string" indexed="true" stored="true" />
<field name="synopsis" type="string" indexed="true" stored="true" />
<field name="coursePhoto" type="string" indexed="true" stored="true" />

<!-- 關(guān)鍵詞  定義復(fù)制域字段,將課程名稱和課程描述都復(fù)制到 course_keywords這一個字段上 -->
<field name="course_keywords" type="text" indexed="false" stored="false" multiValued="true" />
<copyField source="courseName" dest="course_keywords" />
<copyField source="synopsis" dest="course_keywords" />

注意:配置的name的值必須與db-dataconfig.xml文件中的name一致。

  1. 以上文件配置完成,重啟solr服務(wù)。然后訪問Solr可視化管理后臺,在界面左側(cè)的下拉框中選擇testdemo Core,然后選擇Dataimport選項,然后選擇你的 Entity(即在db-dataconfig.xml文件中定義的entity的name) ,點擊execute按鈕,在右側(cè)查看信息。具體如下圖:
    導(dǎo)入數(shù)據(jù).png

如果導(dǎo)如失敗,會在Raw Status-Output下的statusMessages參數(shù)下提示"Full Import Failed": 2019-07-05 09:11:52

執(zhí)行導(dǎo)入操作后,會自動生成索引文件、日志文件和dataimport屬性文件,如下圖:


dataimport屬性文件.png
生成的索引文件.png
日志文件.png
  1. 選擇Query選項,查詢導(dǎo)入的數(shù)據(jù),操作如下圖:
    查詢所有的數(shù)據(jù).png
查詢指定條件的數(shù)據(jù).png

六、solrJ的集成和使用

solrJ是一個用來訪問solr的java客戶端,提供了索引和搜索的方法(將一些常用的命令封裝進(jìn)去了),通過solrJ提供的API 接口來操作solr服務(wù)。
在solr5系之后跟solr4最大的區(qū)別是被發(fā)布成了一個獨立的應(yīng)用。而不再需要tomcat等容器。在其內(nèi)部集成了jetty服務(wù)器,他可以通過bin目錄的腳本直接運行啟動。solr5有兩種運行模式,獨立模式和云模式,獨立模式是以core來管理,云模式是以collection來管理。

  • 構(gòu)建solrJ應(yīng)用程序
    我這里使用Maven集成的solrJ 8.1.1,具體代碼如下:
<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>8.1.1</version>
</dependency>

如果需要連接數(shù)據(jù)庫、注解等jar包,請自行添加依賴,這里只對solrJ做簡單的使用。

  • solrJ的使用
  1. 創(chuàng)建一個名為CourseInfo的Entity,CourseInfo中聲明的變量是和managed-schema中定義的field(字段域)的name是一致的。代碼如下:
public class CourseInfo {
    // 課程id
    @Field("id") // 如果field中的name和entity中的變量名不一致,則需要建立映射
    private String courseID;

    // 會員id
    @Field
    private String memberID;

    // 課程名稱
    @Field
    private String courseName;

    // 課程簡介
    @Field
    private String synopsis;

    // 課程logo
    @Field
    private String coursePhoto;


    /**
     * set / get 方法
     */
    public void setCourseID(String courseID) {
        this.courseID = courseID;
    }

    public String getCourseID() {
        return courseID;
    }

    public void setMemberID(String memberID) {
        this.memberID = memberID;
    }

    public String getMemberID() {
        return memberID;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setSynopsis(String synopsis) {
        this.synopsis = synopsis;
    }

    public String getSynopsis() {
        return synopsis;
    }

    public void setCoursePhoto(String coursePhoto) {
        this.coursePhoto = coursePhoto;
    }

    public String getCoursePhoto() {
        return coursePhoto;
    }

    /**
     * 空構(gòu)造函數(shù)
     */
    public CourseInfo() {}

    /**
     * 有參構(gòu)造函數(shù)
     * @param courseID
     * @param memberID
     * @param courseName
     * @param synopsis
     * @param coursePhoto
     */
    public CourseInfo(String courseID, String memberID, String courseName, String synopsis,
                      String coursePhoto) {
        super();

        this.courseID = courseID;
        this.memberID = memberID;
        this.courseName = courseName;
        this.synopsis = synopsis;
        this.coursePhoto = coursePhoto;
    }
}
  1. 創(chuàng)建CourseController,并使用solrJ。
    2.1 聲明需要的常量和變量
// Solr的基鏈接
private static final String SOLR_URL = "http://localhost:8983/solr";
private static final String SOLR_CORE = "testdemo";

// 聲明solrJ客戶端
private HttpSolrClient solrClient;

2.3 創(chuàng)建solr客戶端的方式

// 不同solr版本solrj 的創(chuàng)建方式有所不同
// solr4創(chuàng)建方式
SolrServer solrServer = new HttpSolrServer("http://127.0.0.1:8080/solr");
// solr5創(chuàng)建方式,在url中指定core名稱:core1
HttpSolrClient solrServer=new HttpSolrClient("http://127.0.0.1:8080/solr/core1");
// solr7/8創(chuàng)建方式,在url中指定core名稱:core1
HttpSolrClient solrServer= new HttpSolrClient.Builder("http://127.0.0.1:8080/solr/core1").build();

2.2 添加/創(chuàng)建索引

/**
     * 添加索引(創(chuàng)建索引)
     * @param courseInfo
     * @throws Exception
     */
    public void addDocument(CourseInfo courseInfo) throws Exception {
        // 創(chuàng)建solrJ客戶端實例,并指定與solr通信的連接和讀取的超時時間,不指定走默認(rèn)配置
        solrClient = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();

        // 創(chuàng)建SolrInputDocument,并添加
        SolrInputDocument solrInputDocument = new SolrInputDocument();
        // 添加內(nèi)容
        solrInputDocument.addField("id", "2342131");
        solrInputDocument.addField("Member_ID", "10");
        solrInputDocument.addField("Course_Name", "dfadf");
        solrInputDocument.addField("synopsis", "簡介的方框拉風(fēng)的靜安寺附近為餓哦就我if抗菌素到哪里去卡");
        solrInputDocument.addField("coursePhoto", "http://www.dsdf.com/1234.png");
        // 添加到client
        solrClient.add(SOLR_CORE, solrInputDocument);

        // 索引文檔必須commit
        solrClient.commit(SOLR_CORE);
        // 關(guān)閉資源
        solrClient.close();
    }

2.4 查詢信息

/**
     * solrJ之查詢
     * @param condition
     * @throws Exception
     */
    public void query() throws Exception {
        // 創(chuàng)建solrJ客戶端實例,并指定與solr通信的連接和讀取的超時時間,不指定走默認(rèn)配置
        solrClient = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();

        // 封裝查詢參數(shù)
        SolrQuery solrQuery = new SolrQuery("*:*");
        // 添加需要回顯得內(nèi)容
        solrQuery.addField("id");
        solrQuery.addField("courseName");
        solrQuery.addField("synopsis");
        // 設(shè)置每頁顯示多少條
        solrQuery.setStart(0);
        solrQuery.setRows(20);

        // 執(zhí)行查詢返回QueryResponse
        QueryResponse queryResponse = solrClient.query(SOLR_CORE, solrQuery);

        // 獲取doc文檔
        SolrDocumentList documentList = queryResponse.getResults();

        // 內(nèi)容遍歷
        for (SolrDocument document: documentList) {
            System.out.println("courseID: " + document.get("id")
                    + "\t memberID: " + document.get("memberID")
                    + "\t courseName: " + document.get("courseName")
                    + "\t synopsis: " + document.get("synopsis")
                    + "\t coursePhoto: " + document.get("coursePhoto"));
        }

        // 關(guān)閉資源
        solrClient.close();
    }

2.5 刪除數(shù)據(jù)

/**
     * solrJ之單個id 的刪除索引(一)
     * @param id
     * @throws Exception
     */
    public void deleteById(String id) throws Exception {
        // 創(chuàng)建solrJ客戶端實例,并指定與solr通信的連接和讀取的超時時間,不指定走默認(rèn)配置
        solrClient = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();

        // 通過id刪除
        solrClient.deleteById("1002");

        // 提交
        solrClient.commit(SOLR_CORE);
        // 關(guān)閉資源
        solrClient.close();
    }

    /**
     * solrJ之多個id 的list集合 刪除索引(二)
     * @param id
     * @throws Exception
     */
    public void deleteById2(String id) throws Exception {
        // 創(chuàng)建solrJ客戶端實例,并指定與solr通信的連接和讀取的超時時間,不指定走默認(rèn)配置
        solrClient = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();

        // 通過多個id刪除
        ArrayList<String> ids = new ArrayList<String>();
        ids.add("1002");
        ids.add("1003");

        solrClient.deleteById(SOLR_CORE, ids);

        // 提交
        solrClient.commit(SOLR_CORE);
        // 關(guān)閉資源
        solrClient.close();
    }

    /**
     * solrJ之通過deleteByQuery刪除索引(三)
     * @param query
     * @throws Exception
     */
    public void deleteByQuery(String query) throws Exception {
        // 創(chuàng)建solrJ客戶端實例,并指定與solr通信的連接和讀取的超時時間,不指定走默認(rèn)配置
        solrClient = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();

        // 執(zhí)行刪除
        solrClient.deleteByQuery(SOLR_CORE, "id:1002");
        // 提交操作
        solrClient.commit(SOLR_CORE);
        // 關(guān)閉資源
        solrClient.close();
    }




參考文章:
solr教程
Solr Apache Solr 初級教程(介紹、安裝部署、Java接口、中文分詞)
項目中如何使用solr
solr-部署詳解(solr兩種部署模式介紹、獨立服務(wù)器模式詳解、SolrCloud分布式集群模式詳解)
Centos7安裝配置單機(jī)solr-8.1.1+ik-analyzer8.1.0+mysql中文分詞

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內(nèi)容