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