日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Solr 原理、API 使用

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Solr 原理、API 使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度學習實戰(不定時更新)


?

搜索引擎:Elasticsearch、Solr、Lucene

  • ELK中的ES:Elasticsearch
  • SolrCloud 的搭建、使用
  • Solr 高亮顯示
  • Spring Data Solr 使用
  • Solr的安裝與配置
  • Solr 原理、API 使用
  • Lucene 原理、API使用
  • Lucene 得分算法

Solr的概述

1.Solr的下載:官網:http://lucene.apache.org歷史版本下載網址:http://archive.apache.org/dist/lucene/solr/2.Solr的安裝:右鍵解壓到當前文件夾即可,注意:解壓的目錄中一定不要中文和空格。

Solr的的目錄結構

1.我們最需要關注的就是:example目錄。其中就有搭建Solr服務的詳細案例。 2.啟動Solr的jar包:需要使用內置的Jetty服務。Jetty是一個WEB容器。 3.Solr目錄:包含全文檢索要存儲的索引數據以及相關的一些配置文件。 4.solr-webapp和webapps:其實包含的是一樣的內容,都是Solr的內置Web應用,我們可以通過Http請求訪問該應用,實現對Solr服務的管理和訪問 5.start.jar包:web應用需要一個Web容器來啟動,而這個jar包會使用一個叫做Jetty的WEB容器(類似與Tomcat),來啟動Solr的Web服務。

啟動Solr的

第一種方式:碼頭服務器啟動的Solr

步驟:1.第一步:進入 \solr-4.10.2\example 目錄,該目錄下存在“start.jar”用于 Jetty服務器啟動Solr2.第二步:打開命令行窗口,執行“java –jar start.jar”命令,即可啟動Solr服務3.第三步:打開瀏覽器,通過“http://localhost:8983/solr”來訪問Solr管理頁面。(Jetty服務的默認端口是8983)

第二種方式:Tomcat的服務器啟動

步驟:1.第一步:部署Web服務。1.將 \solr-4.10.2\example\webapps目錄下的“solr.war”拷貝到自己的 \apache-tomcat-8.5.16\webapps目錄中。2.兩種方式解壓“solr.war”:第一種解壓方式:直接右鍵解壓“solr.war”第二種解壓方式:運行\apache-tomcat-8.5.16\bin目錄下的“startup.bat”,便會自動解壓webapps目錄中的“solr.war”3.解壓完畢后可以刪除“solr.war”。注意:如果是使用第二種解壓方式啟動了“startup.bat”的話,則必須先執行“shutdown.bat”關閉Tomcat之后,才能再刪除“solr.war”,否則在刪除“solr.war”時,會連解壓后的目錄也一起刪除的2.第二步:1.將“\資料\solr在tomcat運行需要導入的jar包\classes”文件夾下的“log4j.properties”拷貝到“\apache-tomcat-8.5.16\webapps\solr\WEB-INF”目錄下2.將“\資料\solr在tomcat運行需要導入的jar包\lib”文件夾下的jar包拷貝到“\apache-tomcat-8.5.16\webapps\solr\WEB-INF\lib”目錄下

3.第三步:1.將“\solr-4.10.2\example”目錄下的(索引庫)“solr”文件夾 拷貝到 不帶中文/空格的目錄下。比如說拷貝到“E:\solr”(索引庫)。2.到“\apache-tomcat-8.5.16\bin”目錄下,編輯“catalina.bat”文件。在“catalina.bat”文件中的第一行處添加一條配置信息,用于指向我們的索引庫及配置目錄:set "JAVA_OPTS=-Dsolr.solr.home=E:/solr"

3.到“\apache-tomcat-8.5.16\webapps\solr\WEB-INF”下 編輯“web.xml”文件,編輯如下:

4.第四步:1.運行\apache-tomcat-8.5.16\bin目錄下的“startup.bat”2.打開瀏覽器,訪問 http://localhost:8080/solr 進入Solr管理頁面

Solr的教學文檔

2.1、啟動Solr服務的方式 2.1.1、方式一,Jetty服務器啟動Solr(了解) 步驟: 1)進入solr-4.10.2/example目錄 2)打開命令行,執行java –jar start.jar命令,即可啟動Solr服務 3)打開瀏覽器,通過http://localhost:8983/solr來訪問Solr管理頁面。(Jetty服務的默認端口是8983)

2.1.2、方式二,Tomcat服務器啟動 步驟: 1)部署Web服務,將solr-4.10.2/example/webapps/solr.war復制到自己的tomcat/webapps目錄中,并解壓,然后刪除solr.war文件

2)在Tomcat中加入相關jar包:將“resource\solr在tomcat運行需要導入的jar包\lib”下的jar包復制tomcat/webapps/solr/WEB-INF/lib下。 并且把class/log4j.properties復制到tomcat/webapps/solr/WEB-INF下

3)修改Tomcat配置文件,指向Solr的索引庫及配置目錄。 注意,這里可以指向solr-4.10.2/example/solr目錄,如果想獨立出來,也可以將這個solr文件夾復制出來到任意位置(不要出現中文),例如:例如:C:/tmp/solr我們這里就把這個文件夾復制出來,獨立使用

進入Tomcat文件夾,用記事本打開:tomcat/bin/catalina.bat文件

添加一條配置信息,指向我們的索引庫及配置目錄:set "JAVA_OPTS=-Dsolr.solr.home=C:/tmp/solr"

4)進入tomcat/bin目錄,雙擊 startup.bat文件啟動服務器

5)打開瀏覽器,訪問 http://localhost:8080/solr 進入Solr管理頁面


第一種啟動方式:java -jar start.jar


Solr的管理頁面

?

面板(儀表盤)

?

日志(日志)

?

核心管理員(核心管理)

在Solr中,每一個Core,代表一個索引庫,里面包含索引數據及其配置信息。 Solr中可以擁有多個Core,也就同時管理多個索引庫!就像在MySQL中可以有多個database一樣!

?

默認核心的目錄

?

JavaProperties和ThreadDump

?


管理索引庫的控制臺

?


CoreSelector(核心選擇器)


核心的配置文件詳解

1.Core的配置文件詳解:1.core.properties2.schemal.xml3.solrconfig.xml2.core.properties 的作用:Core的屬性文件,記錄當前core的名稱、索引位置、配置文件名稱等信息,也可以不寫。一般要求Core名稱跟Core的文件夾名稱一致!這里都是collection1,我們可以手動修改這個屬性,把Core的名字改成我們喜歡的。


添加多個核心

?

1.在solr的目錄下創建新的文件夾的Core2,作為新的核心目錄

2)在核2下創建的conf目錄和數據目錄,并且創建文件core.properties,添加屬性:名稱= core2的

3)從核心-1 / CONF目錄下復制配置文件的Core2 / CONF /下 ?

4)重啟的Tomcat,訪問管理頁面

?



schema.xml中配置詳解

<?xml version="1.0" encoding="UTF-8" ?> <schema name="example" version="1.5"><!-- "_version_" 和 "_root_" 不能刪--> <field name="_version_" type="long" indexed="true" stored="true"/><field name="_root_" type="string" indexed="true" stored="false"/><!-- 唯一鍵id:必須是 type="string"。indexed="true" 創建索引。stored="true" 存儲。multiValued="false" 該字段不能有多個值。 --> <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="age" type="long" indexed="true" stored="true"/><field name="name" type="string" indexed="true" stored="true"/><!-- 使用IK分詞器(中文分詞器):type="text_ik" 關聯 <fieldType name="text_ik" >--> <field name="title" type="text_ik" indexed="true" stored="true"/><!--"text"字段是solrconfig.xml中默認定義的默認搜索字段,由solrconfig.xml中的這一句話來定義:<str name="df">text</str>。如果刪除不使用"text"字段的話,那么也必須修改solrconfig.xml的默認搜索字段。 --><field name="text" type="text_ik" indexed="true" stored="true" multiValued="true"/><!-- 當新插入的字段名 并沒有在schema.xml所定義的話,但只要符合以下規則,照樣可以保存該字段名和字段值數據:新插入字段名的末尾字符 符合“<dynamicField name=“*_s”>規定的”后綴名/末尾字符 為“_s”的話,那么就能動態插入該字段名和字段值數據。 --> <dynamicField name="*_s" type="string" indexed="true" stored="true" /><!-- 唯一主鍵 --> <uniqueKey>id</uniqueKey><!--1.<copyField source=“普通字段名” dest=“復制域字段名text”>:表示把普通字段名 關聯到 復制域字段“text”中。2.此處表示把"title"字段 和 "name"字段 關聯到"text"字段,那么當查詢時,默認把 "title"字段的值 和 "name"字段的值 賦值給"text"字段。3.當不指定查詢字段時,默認查詢"text"字段,也即相當于查詢"text"字段所關聯的 "title"字段的值 和 "name"字段的值 --><copyField source="title" dest="text"/><copyField source="name" dest="text"/><fieldType name="string" class="solr.StrField" sortMissingLast="true" /><fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/> <!-- 定義了IK中文分詞器,那么只要有字段中使用type="text_ik" 關聯 <fieldType name="text_ik" >,那么該字段既可以進行中文分詞 --> <fieldType name="text_ik" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType> </schema>
Solr中會提前對文檔中的字段進行定義,并且在schema.xml中對這些字段的屬性進行約束, 例如:字段數據類型、字段是否索引、是否存儲、是否分詞等等。1.通過Field字段定義字段的屬性信息:

1.屬性及含義:name:字段名稱,最好以下劃線或者字母開頭type:字段類型,指向的是本文件中的<fieldType>標簽indexed:是否創建索引stored:是否被存儲multiValued:是否可以有多個值,如果字段可以有多個值,設置為true2.注意:在本文件中,有兩個字段是Solr自帶的字段,絕對不要刪除:_version_節點和_root_節點

2)通過FieldType指定數據類型

1.<fieldType name="" class="">1.name:字段類型的名稱,可以是系統定義的數據類型,也可以是自定義的類型。<field type="">標簽的type屬性則負責引用<fieldType name="">中的name值,用于來指定數據類型或自定義的類型。2.class:字段類型在Solr中的類。class="solr.StrField":字段自動創建索引,但不會進行分詞。class="solr.TextField":字段自動創建索引,并且自動進行分詞,因此必須指定分詞器,比如中文分詞器(IK分詞器)。2.<analyzer>:在<fieldType>標簽體中 使用 <analyzer>子標簽 用來指定分詞器,比如中文分詞器(IK分詞器)。3)唯一主鍵Lucene中本來是沒有主鍵的。刪除和修改都需要根據詞條進行匹配。而Solr卻可以設置一個字段為唯一主鍵,這樣刪改操作都可以根據主鍵來進行!

4)動態字段



Solr的中的修改:本質是先刪除,再插入新的數據


動態域(動態產生域):動態插入字段名和字段值

動態插入字段名和字段值的規則:只要插入字段名的末尾字符 符合“<dynamicField name=“*_s”>規定的”后綴名/末尾字符為_s的話,那么就能動態插入字段名和字段值。


復制域:“文本”字段

復制域的用法:1.首先在schema.xml中配置把其他字段關聯到“text”字段。2.上圖分別有兩個普通字段<field name=“字段名name”>、<field name=“字段名title”>, 和 一個復制域字段<field name=“復制域字段名text”>;使用<copyField source=“普通字段名” dest=“復制域字段名text”>:表示把普通字段名 關聯到 復制域字段“text”中。3.作用:1.普通字段名 關聯到 復制域字段“text”之后,便能自動把所關聯的普通字段的值 賦值給 復制域字段“text”中。2.在查詢時不指定要查詢的具體字段的話,默認使用復制域字段“text”來作為查詢字段,因為在\solr\collection1\conf\solrconfig.xml中配置了<str name="df">text</str>。因為會自動把所關聯的普通字段的值 賦值給 復制域字段“text”,所以當默認使用復制域字段“text”來作為查詢字段進行查詢時,相當于查詢復制域字段“text”所關聯的普通字段的值。

在插入數據時無需給“text”字段插入數據,而在查詢時,自動把“title”和“name”的數據作為“text”字段的數據。 因為schema.xml中配置了“text”字段指定關聯了“title”和“name”字段。

?


IK分詞器(中文分詞器)

1.引入IK分詞器的jar包<!-- 引入IK分詞器 --><dependency><groupId>com.janeluo</groupId><artifactId>ikanalyzer</artifactId><version>2012_u6</version></dependency>2.下面三個配置文件 拷貝到 Tomcat根目錄下的\webapps\solr\WEB-INF\classes 文件中

3.在schemal.xml中自定義fieldType,引入IK分詞器

<fieldType name="text_ik" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType>4.讓字段使用我們的自定義數據類型,引入IK分詞器

5.可以正確分詞了:


自定義字段的數據類型:定義有IK分詞器(中文分詞器)

<field type="text_ik">標簽的type屬性則負責引用<fieldType name="text_ik">中的name值,用于來指定數據類型或自定義的類型。 該字段使用到“帶有IK分詞器的”字段類型,那么該字段“title”就能分詞了。 如果字段不使用“帶有IK分詞器的”字段類型,而使用string類型聲明(type=string)的話,是無法中文分詞的。


solrconfig.xml中

這個配置文件主要配置跟索引庫和請求處理相關的配置。 solr服務的優化主要通過這個配置文件進行。

<LIB />標簽

1.用途:配置插件依賴的jar包 2.注意事項:如果引入多個jar包,要注意包和包的依賴關系,被依賴的包配置在前面這里的jar包目錄如果是相對路徑,那么是相對于core所在目錄。3.例如 在配置文件中默認有以下配置:這些是Solr中插件所依賴的Jar包

4.這里的相對路徑其實是相對于 core所在目錄。我們把所引來的Jar包復制到solr的HOME中:

然后修改配置文件:

效果:


處理日志中的警告信息

該警告信息:表示索引庫目錄(E:\solr\collection1\conf)下找不到contrib和dist文件夾。 解決:1.第一步:把“\solr-4.10.2”目錄下的contrib和dist文件夾 拷貝到 索引庫目錄(E:\solr\collection1\conf)下即可。2.第二步:修改“E:\solr\collection1\conf”下的solrconfig.xml文件:將“../../../”修改為“../”。

索引庫目錄:E:\ Solr的\ collection1 \的conf目錄下的solrconfig.xml中

修改“E:\ Solr的\ collection1 \的conf”下的solrconfig.xml中文件:將“../../../”修改為“../”

最終修改為“../”

1.到\apache-tomcat-8.5.16\bin目錄下,先執行“shutdown.bat”停止Tomcat,再執行“startup.bat”啟動Tomcat 2.打開瀏覽器,訪問 http://localhost:8080/solr 進入Solr管理頁面


<requestHandler />標簽

1.用途:配置Solr處理各種請求(搜索/select、更新索引/update、等)的各種參數 2.主要參數:name:請求類型,例如:select、query、get、updateclass:處理請求的類initParams:可選。引用<initParams>標簽中的配置<lst name="defaults">:定義各種缺省的配置,比如缺省的parser、缺省返回條數3.例子:負責搜索請求的Handler

1.<int name="rows">10</int>:不進行分頁查詢的話,默認只查詢出10條數據2.<str name="df">text</str>:1.在查詢時不指定要查詢的具體字段的話,默認使用復制域字段“text”來作為查詢字段,因為會自動把所關聯的普通字段的值 賦值給 復制域字段“text”,所以當默認使用復制域字段“text”來作為查詢字段進行查詢時,相當于查詢復制域字段“text”所關聯的普通字段的值。2.<str name="df">默認搜索的字段</str> 默認設置為:text。我們可以設置為title:


<initParams在/>標簽

1.用途:為一些requestHandlers定義通用的配置,以便在一個地方修改后,所有地方都生效 2.主要參數:path:指明該配置應用于哪些請求路徑,多個 的話用逗號分開,可以用通配符(*表示一層子路徑,**表示無限層)name:如果不指定path,可以指定一個name,然后在<requestHander>配置中可以引用這個name 3.例子(配置一個缺省的df):?<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell,/browse">? ? <lst name="defaults">? ? ? <str name="df">_text_</str>? ? </lst>? </initParams>如果配置name,在<requestHander>中引用的例子:<requestHandler name="/dump1" class="DumpRequestHandler" ?initParams="myParams"/>

<updateHandler />標簽

1.用途:定義一些更新索引相關的參數,比如定義commit的時機 2.主要參數:autoCommit:定義自動commit的觸發條件。如果沒配置這個參數,則每次都必須手動commit ? maxDocs ? maxTime(毫秒) ? penSearcher:autoCommit結束后,是否開啟一個新的searcher讓更改生效。缺省為falseautoSoftCommit:定義自動softCommit的觸發條件。相關參數同autoCommitlistener:配置事件監聽器 ? event:監聽哪個事件,比如:event="postCommit",?event="postOptimize" ? class:處理的類,可以是自己的實現類。如果是RunExecutableListener,可以配置下面的參數: ? exe:可執行文件,包括Solr Home的相對路徑和文件名 ? dir:工作目錄,缺省是“.” ? wait: 調用者是否等待可執行文件執行結束,缺省是true ? args:傳遞給可執行文件的參數 ? env:其他所需要的環境變量updateLog:配置log的保存路徑、等 ? dir:保存路徑 ? numRecordsToKeep:一個log保存的記錄數,缺省為100 ? maxNumLogsToKeep:log的數量,缺省為10 ? numversionBuckets:追蹤max version的bucket數量(?),缺省為65535配置這些參數要考慮到搜索的準確度和性能的平衡。^_^注:commit和softCommit: ? commit:正式提交、對索引的修改會被保存到永久存儲中(比如磁盤),會比較耗時 ? softCommit:軟提交,對索引的修改會被立即應用到工作中的索引中,即立即生效,但沒有保存進磁盤

<查詢/>標簽

1.用途:配置Solr如何處理和返回搜索的相關參數 2.主要參數:filterCache:當搜索帶有“fq”參數時,使用這個配置,它保存未經過排序的所有文檔 ? class:實現類,有三種:solr.search.LRUCache, solr.search.FastLRUCache,?solr.search.LFUCache ? size:最大保存的記錄數量 ? initialSize:初始數量 ? autowarmCount:新Index Searcher啟動的時候從舊的Index Searcher緩存拷貝過來的數據量queryResultCache:存儲最終的搜索結果(排序后的、有范圍的文檔id) ? class:實現類,有三種:solr.search.LRUCache, solr.search.FastLRUCache,?solr.search.LFUCache ? size:最大保存的記錄數量 ? initialSize:初始數量 ? autowarmCount:新Index Searcher啟動的時候從舊的Index Searcher緩存拷貝過來的數據量 ? maxRamMB:最大分配的容量(兆)documentCache:緩存Lucene Document對象(就是每個文檔的fields) ? class:實現類,有三種:solr.search.LRUCache, solr.search.FastLRUCache,?solr.search.LFUCache ? size:最大保存的記錄數量 ? initialSize:初始數量 ? autowarmCount:因為Lucene的內部文檔 id 是臨時的,所以這個緩存不應該被auto-warm,這個值應該為“0”cache:配置自定義的緩存,通過SolrIndexSearcher類的getCache()方法和name參數調用這個緩存 ? name:被調用時的標識 ? 其他參數同上maxBooleanClauses:BooleanQuery的最大子句數量enableLazyFieldLoading:沒有知道被請求的field是否懶加載,true/falseuseFilterForSortedQuery:如果不是按照score排序,是否從filterCache中獲取數據queryResultWindowsize:配合queryResultCache使用,緩存一個超集。如果搜索請求第10到19條記錄,而這個參數是50,那么會緩存0到49條記錄queryResultMaxDocsCached:queryResultCache緩存的最大文檔數量useColdSearcher:但一個新searcher正在warm-up的時候,新請求是使用舊是searcher(true)還是等待新的search(false)maxWarmingSearchers:定義同時在warn-up的searcher的最大數量listener:監聽一些事件并指定處理的類,比如在solr啟動時加載一些數據到緩存中,相關參數: ? event:被監聽的事件,比如:firstSearcher是第一個searcher啟動、也就是solr啟動的事件,newSearcher是當已經有searcher在運行的時候有新searcher啟動的事件 ? class:處理類 ? name:="queries"就是需要處理的是query ? lst, name:針對哪些搜索條件需要處理

<RequestDispatcher的/>標簽

1.用途:控制Solr HTTP RequestDispatche r響應請求的方式,比如:是否處理/select url、是否支持對流的處理、上傳文件的大小、如何處理帶有cache頭的HTTP請求、等等 2.主要參數:handleSelect:true/false,如果是false,則由requestHandler來處理/select請求。因為現在的requestHandler中/select是標配,所以這里應該填falserequestParsers: ? enableRemoteStreaming:是否接受流格式的內容,缺省為ture ? multipartUploadLimitInKB:multi-part POST請求,上傳文件的大小上限(K) ? formdataUploadLimitInKB:HTTP POST的form data大小上限(K) ? addHttpRequestToContext:原始的HttpServletRequest對象是否應該被包含在SolrQueryRequest的httpRequest中……一般自定義的插件使用這個參數……httpCaching:如何處理帶有cache control頭的HTTP請求 ? nerver304:如果設為true(開發階段),則就算所請求的內容沒被修改,也不會返回304,并且下面兩個參數會失效 ? lastModFrom:最后修改時間的計算方式,openTime:Searcher啟動的時刻;dirLastMod:索引更新的時刻 ? etagSeed:HTTP返回的ETag頭內容 ? cacheControl:HTTP返回的Cache-Control頭內容

<updateProcessor />和<updateProcessorChain />標簽

1.用途:配置處理update請求的處理器、處理器鏈。如果不配置的話,Solr會使用缺省的三個處理器:LogUpdateProcessorFactory:追蹤和記錄日志DistributedUpdateProcessorFactory:分流update請求到不同的node,比如SolrCloud的情況下把請求分配給一個shard的leader,然后把更新應用到所有replica中RunUpdateProcessorFactory:調用Solr的內部API執行update操作 2.如果需要自定義update處理器:updateProcessor: ? class:負責處理的類 ? name:名字,給updateProcessorChain引用是使用updateProcessorChain: ? name:自己的名字標記 ? processor:指定updateProcessor的name,多個的話用逗號“,”分開

SolrJ的使用(用于操作的Solr)

pom.xml中添加依賴:<dependencies><!-- Junit單元測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</artifactId><version>4.10.2</version></dependency><!-- Solr底層會使用到slf4j日志系統 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.22</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency></dependencies><build><plugins><!-- java編譯插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.7</source><target>1.7</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build> 1.添加數據到solr中的某個core(數據庫)中//當前處于java程序,solr core交由tomcat啟動的solr服務器管理//solr對外提供接口,用戶通過http請求調用接口,進行數據的CRUD@Testpublic void addDateToSolr() throws SolrServerException, IOException{// URL為http://localhost:8080/solr項目名/core的名字String url = "http://localhost:8080/solr/core2";//solrj連接對象:連接到solr中的某個core(數據庫)中,然后可以往該core(數據庫)中對數據進行增刪查改HttpSolrServer server = new HttpSolrServer(url);//數據封裝對象: SolrInputDocumentSolrInputDocument document = new SolrInputDocument();// 新增數據:SolrInputDocument數據封裝對象 提供了addField("字段名稱", "字段值")設置數據document.addField("id", 2);document.addField("name", "solr");document.addField("age", 27L);document.addField("title", "solr是獨立的企業級搜索服務器");//第一種保存方式:單個SolrInputDocument 插入保存//server.add(document);//第二種保存方式:批量多個SolrInputDocument 插入保存List<SolrInputDocument> list = new ArrayList<SolrInputDocument>();list.add(document);//批量添加數據server.add(list);//提交數據server.commit();}2.使用javaBean向solr中的某個core(數據庫)中添加數據//使用注解:先定義JavaBean對象中的字段 和 core(數據庫)中的字段名 相關聯public class User {//@Field("core中的字段名"):使用 @Field注解顯示聲明javaBean中屬性所對應的solr中的core(數據庫)中的字段名@Field("id")private String id;@Field("name")private String name;@Field("title")private String title;@Field("age")private Long age;}@Testpublic void addJavaBeanToSolrCore() throws IOException, SolrServerException{// URL為http://localhost:8080/solr項目名/core的名字String url = "http://localhost:8080/solr/core2";//solrj連接對象:連接到solr中的某個core(數據庫)中,然后可以往該core(數據庫)中對數據進行增刪查改HttpSolrServer server = new HttpSolrServer(url);//同時新增多條數據,批量多條數據插入保存List<User> list = new ArrayList<User>();for(int i = 3;i<30;i++){User user = new User();user.setId(""+i);user.setName("程序員"+i+"號");user.setAge(Long.valueOf(""+i));user.setTitle("機智聰明勤奮工程師"+i);list.add(user);}//第一種保存方式:直接插入保存單個javaBean對象,添加單條數據//server.addBean(user);//第二種保存方式:批量插入保存多個javaBean對象,添加多條數據server.addBeans(list);//提交server.commit();}3.修改/更新solr中的某個core(數據庫)中的數據//solr中并沒有更新數據的方法,沒有更新這個概念。//通過唯一字段來判斷:schema.xml中定義了uniqueKey,uniqueKey就是唯一字段。//如果新增數據的唯一鍵已經存在,新增時會直接全覆蓋,即存在的話便便先刪除原來的數據再增加新的數據。//如果新增數據時唯一鍵不存在,直接新增。@Testpublic void updateSolrCore() throws IOException, SolrServerException{// URL為http://localhost:8080/solr項目名/core的名字String url = "http://localhost:8080/solr/core2";//solrj連接對象:連接到solr中的某個core(數據庫)中,然后可以往該core(數據庫)中對數據進行增刪查改HttpSolrServer server = new HttpSolrServer(url);//使用JavaBean對象封裝數據User user = new User();user.setId("7");user.setName("典韋");user.setTitle("勇戰士典韋");//直接插入保存單個javaBean對象,添加單條數據server.addBean(user);server.commit();}4.刪除solr中的某個core(數據庫)中的數據//根據id刪除對應的數據@Testpublic void deleteById() throws SolrServerException, IOException{// URL為http://localhost:8080/solr項目名/core的名字String url = "http://localhost:8080/solr/core2";//solrj連接對象:連接到solr中的某個core(數據庫)中,然后可以往該core(數據庫)中對數據進行增刪查改HttpSolrServer server = new HttpSolrServer(url);//根據id刪除對應的數據server.deleteById("2");server.commit();}//根據 集合中保存的多個id 同時刪除多條數據@Testpublic void deleteByIds() throws SolrServerException, IOException{// URL為http://localhost:8080/solr項目名/core的名字String url = "http://localhost:8080/solr/core2";//solrj連接對象:連接到solr中的某個core(數據庫)中,然后可以往該core(數據庫)中對數據進行增刪查改HttpSolrServer server = new HttpSolrServer(url);//根據id刪除對應的數據List<String> ids = new ArrayList<String>();ids.add("1");ids.add("3");//根據 集合中保存的多個id 同時刪除多條數據server.deleteById(ids);server.commit();}//根據查詢條件刪除@Testpublic void deleteByQuery() throws SolrServerException, IOException{// URL為http://localhost:8080/solr項目名/core的名字String url = "http://localhost:8080/solr/core2";//solrj連接對象:連接到solr中的某個core(數據庫)中,然后可以往該core(數據庫)中對數據進行增刪查改HttpSolrServer server = new HttpSolrServer(url);//查詢條件的格式:"*:*"。會刪除所有數據,能夠成功執行。安全越界,慎用。String query = "*:*"; //String query = "title:聰明"; //查詢條件的格式:“字段名:字段值”//deleteByQuery(查詢條件):根據指定的查詢條件刪除所有匹配的結果server.deleteByQuery(query);server.commit();}5.查詢solr中的某個core(數據庫)中的數據\solr\collection1\conf\solrconfig.xml中配置了如下信息:<lst name="defaults"><str name="echoParams">explicit</str><int name="rows">10</int>//不進行分頁查詢的話,默認只查詢出10條數據<str name="df">text</str>//不寫指定查詢的字段名的話,則默認查詢text字段的字段值數據,即查詢符合該“text字段名=字段值”的數據</lst>//@Testpublic void searchSolrCore() throws SolrServerException{// URL為http://localhost:8080/solr項目名/core的名字String url = "http://localhost:8080/solr/core2";//solrj連接對象:連接到solr中的某個core(數據庫)中,然后可以往該core(數據庫)中對數據進行增刪查改HttpSolrServer server = new HttpSolrServer(url);//-----------------------------------------//1.new SolrQuery("*:*"):查詢該core(數據庫)中的所有//2.new SolrQuery("字段名:字段值"):指定查詢符合該“字段名=字段值”的數據//3.new SolrQuery("字段值"):不寫指定查詢的字段名的話,則默認查詢text字段的字段值數據,即查詢符合該“text字段名=字段值”的數據。SolrQuery query = new SolrQuery("*:*");//4.new SolrQuery("字段名:字段值?"):表示匹配出現的位置//5.new SolrQuery("字段名:字段值*"):表示匹配任意字符SolrQuery query = new SolrQuery("title:互*");//布爾搜索:AND、OR和NOT布爾操作(推薦使用大寫,區分普通字段)//例子:new SolrQuery("字段名:字段值 OR 字段名:字段值")。//使用OR表示:表示并集,符合任意一個"字段名:字段值"的數據 都能查詢出來//使用AND表示:表示交集,符合兩方的"字段名:字段值"的數據 才能查詢出來SolrQuery query = new SolrQuery("title:solr OR title:iphone");//子表達式查詢:(字段名:字段值 OR 字段名:字段值) OR (字段名:字段值)SolrQuery query = new SolrQuery("(title:solr OR title:聰明) OR (title:iphone)");//相似度搜索:使用“~”字符,表示最大允許編輯次數為2次//core數據庫中存儲的是“iphone”,那么輸入要搜索的"iphon~q",編輯兩次后,仍然可以得到“iphone” SolrQuery query = new SolrQuery("iphon~q");//數字范圍搜索,包含起始值和結束值:"字段名:[字段值 TO 字段值]"。//[字段值 TO 字段值]:表示包含兩邊字段值//{字段值 TO 字段值}:表示不包含兩邊字段值SolrQuery query = new SolrQuery("age:[1 TO 5]");//-----------------------------------------//根據id字段倒敘排列query.setSort("id", ORDER.desc);//-----------------------------------------//執行查詢,獲取出查詢結果集QueryResponse response = server.query(query);//---------------- 解析查詢結果集的方式一 -------------------------SolrDocumentList list = response.getResults(); //默認只查詢出10條數據:因為\solr\collection1\conf\solrconfig.xml中配置了<int name="rows">10</int>//不進行分頁查詢的話,默認只查詢出10條數據for(SolrDocument sd : list){System.out.println("id===="+sd.get("id"));System.out.println("name===="+sd.get("name"));System.out.println("title===="+sd.get("title"));System.out.println("===========next===========");}//---------------- 解析查詢結果集的方式二 -------------------------//解析搜索結果集的方式二:// 直接返回javaBean的方式。// JavaBean類中的字段上必須定義有@Field("core中的字段名")List<User> list = response.getBeans(User.class);for(User u : list){System.out.println(u);}}6.分頁查詢:\solr\collection1\conf\solrconfig.xml中配置了如下信息:<lst name="defaults"><str name="echoParams">explicit</str><int name="rows">10</int>//不進行分頁查詢的話,默認只查詢出10條數據<str name="df">text</str>//不寫指定查詢的字段名的話,則默認查詢text字段的字段值數據,即查詢符合該“text字段名=字段值”的數據</lst>//搜索結果集的分頁// 分頁關鍵:需要頁碼和每頁顯示條數// 獲取結果集時,指定開始位置start和結束位置end@Testpublic void searchSolrCorePageList() throws SolrServerException{// URL為http://localhost:8080/solr項目名/core的名字String url = "http://localhost:8080/solr/core2";HttpSolrServer server = new HttpSolrServer(url);Integer page = 2;//頁碼Integer pageSize = 15;//每頁顯示條數Integer start = (page -1 ) * pageSize;//從第幾條開始獲取Integer end = page * pageSize;//獲取到第幾條結束//字段名:參數值SolrQuery query = new SolrQuery("title:聰明");//分頁查詢:設置從第幾條開始獲取 和 每頁顯示條數query.setStart(start);//從第幾條開始獲取query.setRows(pageSize);//每頁顯示條數//根據id字段倒敘排列query.setSort("id", ORDER.desc);//開啟高亮顯示query.setHighlight(true);//高亮顯示的標簽前綴query.setHighlightSimplePre("<em color='red'>");//高亮顯示的標簽后綴query.setHighlightSimplePost("</em>");//添加需要高亮顯示的字段query.addHighlightField("title");query.addHighlightField("name");QueryResponse response = server.query(query);//解析搜索結果集的方式一:獲取高亮顯示的結果集Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();//遍歷的方式獲取高亮的結果集for(String key : highlighting.keySet()){Map<String, List<String>> map = highlighting.get(key);for(String key2 : map.keySet()){List<String> list = map.get(key2);for(String str : list){System.out.println(str);}}}//解析搜索結果集的方式二:// 直接返回javaBean的方式。// JavaBean類中的字段上必須定義有@Field("core中的字段名")List<User> list = response.getBeans(User.class);for(User u : list){String highlightTilte = highlighting.get(u.getId()).get("title").get(0);System.out.println(highlightTilte);u.setTitle(highlightTilte);System.out.println(u);}}

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的Solr 原理、API 使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。