0700-6.2.0-使用Solr7對多種格式文件建立全文索引

  • 2019 年 10 月 5 日
  • 筆記

文檔編寫目的

Solr是一個開源搜索平台,用於構建搜索應用程序。它建立在Lucene(全文搜索引擎)之上。Solr是企業級的,快速的和高度可擴展的。使用Solr構建的應用程序非常複雜,可提供高性能 。它提供了層面搜索(就是統計)、命中醒目顯示並且支持多種輸出格式(包括XML/XSLT 和JSON等格式),並且提供了一個完善的功能管理界面,是一款非常優秀的全文搜索引擎。Solr7要求JDK為1.8以上。在Solr7版本中新增了跨核(solr 跨核概念,是建立在solr存儲方式的基礎上,因為使用solr前必須創建Core,Core即為solr的核,那不同的業務有可能在不同的核中,之前版本是不支持跨核搜索的)搜索功能。本文主要介紹如何在CDH6.2.0集群中使用Solr7對多種格式的文件建立全文索引。

  • 內容概述

1.創建Collection

2.建立索引

3.總結

  • 測試環境

1.CM和CDH版本為6.2.0

2.Solr版本為7.4.0

3.集群未啟用kerberos

4.採用root用戶

  • 前置條件

1.CDH集群已安裝成功並正常運行

2.集群已添加Solr服務

3.準備好測試使用的多種類型的文件,pdf、word、text、excel、ppt各十個如下

創建Collection

2.1 創建Config模板

在/opt/cloudera/parcels/CDH/lib/solr目錄下,使用如下命令創建一個自己的Config模板。本次創建模板名稱為testcoreTemplate

solrctl config --create testcoreTemplate managedTemplateSecure -p immutable=false  

模板創建完成後,需要生成模板配置文件

在當前目錄執行如下命令在本地生成testcoreTemplate模板的配置文件

solrctl instancedir --generate testcoreTemplate  

2.2 修改配置文件

1.solrconfig.xml文件

solrconfig.xml配置文件主要定義了Solr的一些處理規則,包括索引數據的存放位置,更新,刪除,查詢的一些規則配置。相當於是基礎配置文件。

注意:該文件中不能有中文,否則會報錯,注釋也不行

在testcoreTemplate/conf目錄下,修改配置文件solrconfig.xml

添加數據源配置,如下所示:

 <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">      <lst name="defaults">        <str name="config">tika-data-config.xml</str>      </lst>    </requestHandler>      <requestHandler name="/select" class="solr.SearchHandler">      <lst name="defaults">        <str name="echoParams">explicit</str>        <int name="rows">10</int>      </lst>  

2.tika-data-config.xml文件(該文件可自定義名稱)

tika-data-config.xml是數據源文件。該文件不存在,需要自己手動創建。其中dataConfig 標籤中,子標籤dataSource 配置數據源,entity 標籤 定義了 操作名稱。

在當前目錄下創建數據源文件tika-data-config.xml,與solrconfig.xml文件在同級目錄下。

然後添加如下內容:

<?xml version="1.0" encoding="UTF-8" ?>  <dataConfig>      <dataSource type="BinFileDataSource"/>      <document>          <entity name="file" processor="FileListEntityProcessor" dataSource="null"                  baseDir="/tmp/solr/file/" fileName=".(doc)|(pdf)|(docx)|(txt)|(csv)|(json)|(xml)|(pptx)|(pptx)|(ppt)|(xls)|(xlsx)"                  rootEntity="false">              <field column="file" name="id"/>              <field column="fileSize" name="fileSize"/>              <field column="fileLastModified" name="fileLastModified"/>              <field column="fileLastModified" name="fileLastModified"/>              <field column="fileAbsolutePath" name="fileAbsolutePath"/>              <entity name="pdf" processor="TikaEntityProcessor" url="${file.fileAbsolutePath}" format="text">                  <field column="Author" name="author" meta="true"/>                  <!-- in the original PDF, the Author meta-field name is upper-cased, but in Solr schema it is lower-cased -->                  <field column="title" name="title" meta="true"/>                  <field column="text" name="text"/>              </entity>          </entity>      </document>  </dataConfig>  

3.managed-schema文件。

managed-schema配置文件決定着solr如何建立索引,每個字段的數據類型,分詞方式等,老版本的schema配置文件的名字叫做schema.xml,配置方式就是手工編輯,5.0以後的版本的schema配置文件的名字叫做managed-schema,配置方式不再是用手工編輯而是使用schemaAPI來配置,官方給出的解釋是使用schemaAPI修改managed-schema內容後不需要重新加載core或者重啟solr,更適合在生產環境下維護。如果使用手工編輯的方式更改配置不進行重加載core有可能會造成配置丟失。

修改managed-schema文件

1)添加索引字段

<field name="title" type="text_cn" indexed="true" stored="true"/>  <field name="text" type="text_cn" indexed="true" stored="true" omitNorms ="true"/> <field name="author" type="string" indexed="true" stored="true"/>  <field name="fileSize" type="plong" indexed="true" stored="true"/>  <field name="fileLastModified" type="pdate" indexed="true" stored="true"/>  <field name="fileAbsolutePath" type="string" indexed="true" stored="true"/>  

其中field是創建索引用的字段,如果想要這個字段生成索引需要配置他的indexed屬性為true,stored屬性為true表示存儲該索引。

2)配置中文分詞

<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>  

fieldType:為field定義類型,最主要作用是定義分詞器,分詞器決定着如何從文檔中檢索關鍵字。

analyzer:fieldType下的子元素,這就是分詞器,由一組tokenizer和filter組成,如下圖所示

修改了自定義模板配置後,保存配置,然後在目錄/opt/cloudera/parcels/CDH/lib/solr下執行下面的命令將配置更新到solr

solrctl instancedir --update testcoreTemplate testcoreTemplate  

2.3 準備jar包

在所有節點創建目錄/opt/cloudera/parcels/CDH/lib/solr/contrib/extraction/lib

下載以下幾個jar包

lucene-analyzers-smartcn-7.4.0-cdh6.2.0.jar下載地址:

https://archive.cloudera.com/cdh6/6.2.0/maven-repository/org/apache/lucene/lucene-analyzers-smartcn/7.4.0-cdh6.2.0/lucene-analyzers-smartcn-7.4.0-cdh6.2.0.jar  

solr-dataimporthandler-7.4.0.jar下載地址:

https://repo1.maven.org/maven2/org/apache/solr/solr-dataimporthandler-extras/7.4.0/solr-dataimporthandler-extras-7.4.0.jar  

solr-dataimporthandler-extras-7.4.0.jar下載地址:

https://repo1.maven.org/maven2/org/apache/solr/solr-dataimporthandler-extras/7.4.0/solr-dataimporthandler-extras-7.4.0.jar  

tika-app-1.19.1.jar(版本要求1.19以上)下載地址:

https://repo1.maven.org/maven2/org/apache/tika/tika-app/1.19.1/tika-app-1.19.1.jar  
將lucene-analyzers-smartcn-7.4.0-cdh6.2.0.jar拷貝到所有節點的/opt/cloudera/parcels/CDH/lib/hadoop-yarn目錄和/opt/cloudera/parcels/CDH/lib/solr/server/solr-webapp/webapp/WEB-INF/lib/目錄  

將solr-dataimporthandler-7.4.0.jar、solr-dataimporthandler-extras-7.4.0.jar和tika-app-1.19.1.jar三個jar包拷貝到集群所有節點的/opt/cloudera/parcels/CDH/lib/solr/contrib/extraction/lib/目錄

2.4 創建collection

在Solr Web頁面,選擇左側的【Collections】,然後單擊【Add collection】。創建一個Collection

Collection創建成功

建立索引並測試

3.1 創建索引

瀏覽器登錄Solr Web UI,默認端口為8983。

選擇創建好的collection,點擊模板下的【dataimport】菜單,選擇【full-import】命令,然後單擊下方的【Execute】,將本地的50個數據文件導入到solr並創建index

3.2 查詢測試

1.查找文件名

2.查找文件作者

3.按文件大小範圍查找,例如5000-10000

4.按時間範圍查找

5.按文件內容查找

由以上測試可見,solr對pdf、word、text、excel、ppt文件都能夠建立索引,並且在配置了中文分詞之後,可以對中英文進行檢測。

總結

1.Solrcloud需要利用公共的Zookeeper保持所有的Solr主機的註冊信息(將每一個core中的conf目錄的內容進行公共存儲)。一旦搭建了Solrcloud集群,那麼所有的數據的操作都將以Collection為主,在一個Collection下可以有若干個Shard(分片),而後每一個分片上都會有Core(每一個Core都會存在有主從關係)。這些Collection、Shared、Core的分片的信息都會自動的在Zookeeper上進行存儲。對於整體的Solr而言,需要提供統一的認證信息,這些信息也需要保持在Zookeeper上。

2.Solr7中自帶了一些中文分詞器,比較好用的是SmartChineseAnalyzer。但是本次測試時失敗,所以額外又下載一個中文分詞包lucene-analyzers-smartcn-7.4.0-cdh6.2.0.jar,看網上很多成功示例不需要下載,可能某一部分操作失誤所致,後續再驗證。

3.如果由於配置文件異常導致Solr功能使用異常時,可以將自定義的模板刪除

solrctl config --delete testcoreTemplate  solrctl instancedir --delete testcoreTemplate  

4.tika-app-1.19.1.jar可以支持Solr對pdf、word、text、excel、ppt等格式文件建立索引。

5.在將需要的jar包下載到執行目錄下後,需要對solr服務進行重啟,否則jar包不會生效,運行時會報錯找不到jar包中的類。

在對自定義模板的配置進行更新後,需要使用命令來將模板的配置更新到solr中去,

solrctl instancedir --update testcoreTemplate testcoreTemplate  

Fayson的github: https://github.com/fayson/cdhproject