solr的基礎安裝配置和使用以及solrj的簡介
Solr 全文檢索伺服器
1 前言
今天博主將會從solr的簡單介紹,與lucene的區別開始為大家講解,圍繞solr的安裝配置,基本使用進行講解以及後面會涉及solrJ的使用! 如果對大家有用的話,可以關注,點贊文章以及歡迎評論喔~
2 Solr介紹
2.1 什麼是solr
Solr是apache的頂級開源專案,它是使用java開發 ,基於lucene的全文檢索伺服器。
Solr比lucene提供了更多的查詢語句,而且它可擴充套件、可配置,同時它對lucene的效能進行了優化。
Solr是如何實現全文檢索的呢?
索引流程:solr客戶端(瀏覽器、java程式)可以向solr服務端傳送POST請求,請求內容是包含Field等資訊的一個xml文件,通過該文件,solr實現對索引的維護(增刪改)
搜尋流程:solr客戶端(瀏覽器、java程式)可以向solr服務端傳送GET請求,solr伺服器返回一個xml文件。
Solr同樣沒有檢視渲染的功能。
2.2 Solr和lucene的區別
Lucene是一個全文檢索引擎工具包,它只是一個jar包,不能獨立執行,對外提供服務。
Solr是一個全文檢索伺服器,它可以單獨執行在servlet容器,可以單獨對外提供搜尋和索引功能。Solr比lucene在開發全文檢索功能時,更快捷、更方便。
3 Solr安裝配置
3.1 下載solr
Solr和lucene的版本是同步更新的,最新的版本是5.2.1 本課程使用的版本:4.10.3
下載地址:http://archive.apache.org/dist/lucene/solr/
3.2 執行環境
- Jdk:1.7及以上
- Solr:4.10.3
- Mysql:5X
- Web伺服器:tomcat 7
3.2.1 初始化資料庫指令碼
3.3 Solr安裝配置
3.3.1 Solr的安裝部署
第一步:安裝tomcat 第二步:將以下的war包,拷貝到tomcat的webapps目錄下 第三步:解壓縮war包 解壓縮之後,將war包刪掉 第四步:新增solr的擴充套件服務包
將以上jar包,新增到以下目錄
第五步:新增log4j.properties 將以下目錄的檔案進行拷貝
複製到以下目錄
第六步:在web.xml中指定solrhome的目錄
3.3.2 Solrcore的安裝
3.3.2.1 Solrcore和solrhome
Solrhome是solr服務執行的主目錄,一個solrhome目錄裡面包含多個solrcore目錄,一個solrcore目錄裡面了一個solr例項執行時所需要的配置檔案和資料檔案。
每一個solrcore都可以單獨對外提供搜尋和索引服務。 多個solrcore之間沒有關係。
3.3.2.2 Solrcore和solrhome的目錄結構 Solrhome的目錄結構
Solrcore目錄
3.3.2.3 Solrcore的安裝
安裝solrcore需要先安裝solrhome
將以下目錄的檔案進行拷貝
複製到以下目錄
這樣solrhome和solrcore就安裝成功了。
3.3.2.4 Solrcore配置
在solrcore的conf目錄下,有一個solrconfig.xml的配置檔案,該配置檔案,配置來solrcor的執行資訊
在該檔案中,主要配置三個標籤:lib標籤、datadir標籤、requestHandler標籤
如果對該檔案不進行配置也可以,即使用預設的配置項。
3.3.2.4.1 Lib 標籤
Solrcore需要新增一個擴充套件依賴包,通過lib標籤來指定依賴包的地址
solr.install.dir:表示solrcore的安裝目錄
將以下目錄的檔案進行拷貝
複製到以下目錄
修改lib標籤
3.3.2.4.2 datadir標籤
每個SolrCore都有自己的索引檔案目錄 ,預設在SolrCore目錄下的data中。 data資料目錄下包括了index索引目錄 和tlog日誌檔案目錄。 如果不想使用預設的目錄也可以通過solrConfig.xml更改索引目錄 ,如下:
3.3.2.4.3 requestHandler標籤
requestHandler請求處理器,定義了索引和搜尋的訪問方式。 通過/update維護索引,可以完成索引的新增、修改、刪除操作。 提交xml、json資料完成索引維護,索引維護小節詳細介紹。
通過/select搜尋索引。 設定搜尋引數完成搜尋,搜尋引數也可以設定一些預設值,如下:
<requestHandler name="/select" class="solr.SearchHandler">
<!-- 設定預設的引數值,可以在請求地址中修改這些引數-->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int><!--顯示數量-->
<str name="wt">json</str><!--顯示格式-->
<str name="df">text</str><!--預設搜尋欄位-->
</lst>
</requestHandler>
3.4 solr介面介紹
3.4.1 Dashboard
儀表盤,顯示了該Solr例項開始啟動執行的時間、版本、系統資源、jvm等資訊。
3.4.2 Logging
Solr執行日誌資訊
3.4.3 Cloud
Cloud即SolrCloud,即Solr雲(叢集),當使用Solr Cloud模式執行時會顯示此選單,該部分功能在第二個專案,即電商專案會講解。
3.4.4 Core Admin
Solr Core的管理介面。在這裡可以新增SolrCore例項。
3.4.5 java properties
Solr在JVM 執行環境中的屬性資訊,包括類路徑、檔案編碼、jvm記憶體設定等資訊。
3.4.6 Tread Dump
顯示Solr Server中當前活躍執行緒資訊,同時也可以跟蹤執行緒執行棧資訊。
3.4.7 Core selector(重點)
選擇一個SolrCore進行詳細操作,如下:
3.4.7.1 Analysis(重點)
通過此介面可以測試索引分析器和搜尋分析器的執行情況。 注:solr中,分析器是繫結在域的型別中的。
3.4.7.2 dataimport
可以定義資料匯入處理器,從關係資料庫將資料匯入到Solr索引庫中。 預設沒有配置,需要手工配置。
3.4.7.3 Document(重點)
通過/update表示更新索引,solr預設根據id(唯一約束)域來更新Document的內容,如果根據id值搜尋不到id域則會執行新增操作,如果找到則更新。
通過此選單可以建立索引、更新索引、刪除索引等操作,介面如下:
- overwrite=“true” : solr在做索引的時候,如果文件已經存在,就用xml中的文件進行替換
- commitWithin=“1000” : solr 在做索引的時候,每個1000(1秒)毫秒,做一次文件提交。為了方便測試也可以在Document中立即提交,後新增“”
3.4.7.4 Query(重點)
通過/select執行搜尋索引,必須指定“q”查詢條件方可搜尋。
3.5 多solrcore的配置
配置多solrcore的好處: 1、 在進行solrcloud的時候,必須配置多solrcore 2、 每個solrcore之間是獨立的,都可以單獨對外提供服務。不同的業務模組可以使用不同的solrcore來提供搜尋和索引服務。
新增
第一步:複製solrhome下的collection1目錄到本目錄下,修改名稱為collection2
第二步:修改solrcore目錄下的core.properties
這樣多solrcore就配置完成了。
4 Solr的基本使用
4.1 Schema.xml
在schema.xml檔案中,主要配置了solrcore的一些資料資訊,包括Field和FieldType的定義等資訊,在solr中,Field和FieldType都需要先定義後使用。
4.1.1 Filed
定義Field域
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
Name:指定域的名稱 Type:指定域的型別 Indexed:是否索引 Stored:是否儲存 Required:是否必須 multiValued:是否多值,比如商品資訊中,一個商品有多張圖片,一個Field像儲存多個值的話,必須將multiValued設定為true。
4.1.2 dynamicField
動態域
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
Name:指定動態域的命名規則
4.1.3 uniqueKey
指定唯一鍵
id
其中的id是在Field標籤中已經定義好的域名,而且該域要設定為required為true。
一個schema.xml檔案中必須有且僅有一個唯一鍵
4.1.4 copyField
複製域
Source:要複製的源域的域名 Dest:目標域的域名
由dest指的的目標域,必須設定multiValued為true。
4.1.5 FieldType
定義域的型別
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<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.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Name:指定域型別的名稱 Class:指定該域型別對應的solr的型別 Analyzer:指定分析器 Type:index、query,分別指定搜尋和索引時的分析器 Tokenizer:指定分詞器 Filter:指定過濾器
4.2 中文分詞器
使用ikanalyzer進行中文分詞
第一步:將ikanalyzer的jar包拷貝到以下目錄
第二步:將ikanalyzer的擴充套件詞庫的配置檔案拷貝到 目錄
第三步:配置FieldType
第四步:配置使用中文分詞的Field
第五步:重啟tomcat
4.3 配置業務Field
4.3.1 需求
對案例中的products表的資料進行索引,所以需要先定義對應的Field域。
4.3.2 分析配置
Products的表結構
需要往索引庫新增的欄位有: pid、name、catalog、catalog_name、price、description、picture
FieldType: 經分析,由於中文分詞器已經配置完FieldType,所以目前FieldType已經滿足需要,無需配置。
Field: Pid: 由於pid在products表中是唯一鍵,而且在solr的shema.xml中已有一個id的唯一鍵配置,所以不需要再重新定義pid域。
Name:
Catalog、catalog_name:
<field name="product_catalog" type="string" indexed="true" stored="true"/>
<!-- 商品分類名稱 -->
<field name="product_catalog_name" type="string" indexed="true" stored="false"/>
Price:
<field name="product_price" type="float" indexed="true" stored="true"/>
Description:
<field name="product_description" type="text_ik" indexed="true" stored="false"/>
Picture:
<field name="product_picture" type="string" indexed="false" stored="true"/>
4.4 Dataimport
該外掛可以將資料庫中指定的sql語句的結果匯入到solr索引庫中。
4.4.1 第一步:新增jar包
- Dataimport的jar包 複製以下目錄的jar包
新增到以下目錄
修改solrconfig.xml檔案,新增lib標籤
- MySQL資料庫驅動包 將mysql的驅動包,複製到以下目錄
修改solrconfig.xml檔案,新增lib標籤
4.4.2 第二步:配置requestHandler
在solrconfig.xml中,新增一個dataimport的requestHandler
4.4.3 第三步:建立data-config.xml
在solrconfig.xml同級目錄下,建立data-config.xml
4.4.4 重啟tomcat
5 Solrj的使用
5.1 什麼是solrj
Solrj就是solr伺服器的java客戶端。
5.2 環境準備
- Jdk
- Ide
- Tomcat
- Solrj
5.3 搭建工程
- Solrj的依賴包和核心包
- Solr的擴充套件服務包
5.4 使用solrj完成索引維護
5.4.1 新增/修改索引
在solr中,索引庫中都會存在一個唯一鍵,如果一個Document的id存在,則執行修改操作,如果不存在,則執行新增操作。
5.4.2 刪除索引
5.4.2.1 根據指定ID來刪除
5.4.2.2 根據條件刪除
5.4.3 查詢索引
5.4.3.1 簡單查詢
5.4.3.2 複雜查詢
5.4.3.2.1 solr的查詢語法
- q - 查詢關鍵字,必須的,如果查詢所有使用*?。 請求的q是字串
2. fq - (filter query)過慮查詢,作用:在q查詢符合結果中同時是fq查詢符合的,例如:: 請求fq是一個數組(多個值)
過濾查詢價格從1到20的記錄。 也可以在“q”查詢條件中使用product_price:[1 TO 20],如下: 也可以使用“*”表示無限,例如: 20以上:product_price:[20 TO ] 20以下:product_price:[ TO 20]
-
sort - 排序,格式:sort=+<desc|asc>[,+<desc|asc>]… 。示例: 按價格降序
-
start - 分頁顯示使用,開始記錄下標,從0開始
-
rows - 指定返回結果最多有多少條記錄,配合start來實現分頁。 實際開發時,知道當前頁碼和每頁顯示的個數最後求出開始下標。
-
fl - 指定返回那些欄位內容,用逗號或空格分隔多個。 顯示商品圖片、商品名稱、商品價格
-
df-指定一個搜尋Field 也可以在SolrCore目錄 中conf/solrconfig.xml檔案中指定預設搜尋Field,指定後就可以直接在“q”查詢條件中輸入關鍵字。
-
wt - (writer type)指定輸出格式,可以有 xml, json, php, phps, 後面 solr 1.3增加的,要用通知我們,因為預設沒有開啟。
-
hl 是否高亮 ,設定高亮Field,設定格式字首和字尾。
5.4.3.2.2 程式碼
@Test public void search02() throws Exception { // 建立HttpSolrServer HttpSolrServer server = new HttpSolrServer(“http://localhost:8080/solr”); // 建立SolrQuery物件 SolrQuery query = new SolrQuery();
// 輸入查詢條件
query.setQuery("product_name:小黃人");
// query.set("q", "product_name:小黃人");
// 設定過濾條件
// 如果設定多個過濾條件的話,需要使用query.addFilterQuery(fq)
query.setFilterQueries("product_price:[1 TO 10]");
// 設定排序
query.setSort("product_price", ORDER.asc);
// 設定分頁資訊(使用預設的)
query.setStart(0);
query.setRows(10);
// 設定顯示的Field的域集合
query.setFields("id,product_name,product_catalog,product_price,product_picture");
// 設定預設域
query.set("df", "product_keywords");
// 設定高亮資訊
query.setHighlight(true);
query.addHighlightField("product_name");
query.setHighlightSimplePre("<em>");
query.setHighlightSimplePost("</em>");
// 執行查詢並返回結果
QueryResponse response = server.query(query);
// 獲取匹配的所有結果
SolrDocumentList list = response.getResults();
// 匹配結果總數
long count = list.getNumFound();
System.out.println("匹配結果總數:" + count);
// 獲取高亮顯示資訊
Map<String, Map<String, List<String>>> highlighting = response
.getHighlighting();
for (SolrDocument doc : list) {
System.out.println(doc.get("id"));
List<String> list2 = highlighting.get(doc.get("id")).get(
"product_name");
if (list2 != null)
System.out.println("高亮顯示的商品名稱:" + list2.get(0));
else {
System.out.println(doc.get("product_name"));
}
System.out.println(doc.get("product_catalog"));
System.out.println(doc.get("product_price"));
System.out.println(doc.get("product_picture"));
System.out.println("=====================");
}
}