1. 程式人生 > >solr的基礎安裝配置和使用以及solrj的簡介

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/

下載版本:4.10.3 Linux下需要下載lucene-4.10.3.tgz,windows下需要下載lucene-4.10.3.zip。 在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

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的查詢語法
  1. 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]

  1. sort - 排序,格式:sort=+<desc|asc>[,+<desc|asc>]… 。示例: 在這裡插入圖片描述 按價格降序

  2. start - 分頁顯示使用,開始記錄下標,從0開始

  3. rows - 指定返回結果最多有多少條記錄,配合start來實現分頁。 實際開發時,知道當前頁碼和每頁顯示的個數最後求出開始下標。

  4. fl - 指定返回那些欄位內容,用逗號或空格分隔多個。 在這裡插入圖片描述 顯示商品圖片、商品名稱、商品價格

  5. df-指定一個搜尋Field 在這裡插入圖片描述 也可以在SolrCore目錄 中conf/solrconfig.xml檔案中指定預設搜尋Field,指定後就可以直接在“q”查詢條件中輸入關鍵字。

在這裡插入圖片描述

  1. wt - (writer type)指定輸出格式,可以有 xml, json, php, phps, 後面 solr 1.3增加的,要用通知我們,因為預設沒有開啟。

  2. 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("=====================");
}

}