參考資料:
https://cwiki.apache.org/confluence/display/solr/Uploading+Structured+Data+Store+Data+with+the+Data+Import+Handler
https://wiki.apache.org/solr/DataImportHandler
http://wiki.apache.org/solr/TikaEntityProcessor
Solr 通過Dataimport可以對各種文件類型(包括郵件)建索引,也可以對關系型數據庫建索引。
前提依賴Jar包
Dataimport從關系型數據庫建索引時,依賴以下jar包,這些Jar包位於Solr安裝包下面的solr-6.1.0\dist\目錄下目錄下:
本實例是SQL Server關系型數據庫,所以還要添加sqljdbc42.jar到指定路徑下。
Dataimport為普通文件建索引時,依賴以下jar包,這些jar包位於Solr安裝包的solr-6.1.0\contrib\extraction\lib目錄下
這些jar包在本機上的統一存放位置為:/var/lib/solr/lib/
在solrconfig.xml文件中添加以上jar包的引用。
<lib dir="/var/lib/solr/lib/" regex=".*\.jar" />
一、配置solrconfig.xml
<requestHandler name="/dataimport" class="solr.DataImportHandler"> <lst name="defaults"> <str name="config">tika-data-config.xml</str> <str name="update.chain">uuid</str> </lst> </requestHandler>
二、配置tika-data-config.xml
在文件solrconfig.xml同級目錄下,新建文件tika-data-config.xml,tika-data-config.xml文件中的內容配置如下:
<dataConfig>
<!--可以配置多個dataSource,每個都有唯一一個name--> <dataSource name="sqldb2" driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://10.2.8.170:1433" user="xxx" password="xxxxxxx"/> <dataSource type="BinFileDataSource" name="f1"/> <dataSource type="FileReaderDataSource" name="f2"/> <document>
<!--可以配置多個Entity,每個Entity通過name屬性來區分-->
<!--Entity數據源為文件--> <entity name="files" dataSource="f1" rootEntity="false" processor="FileListEntityProcessor" baseDir="/usr/local/solr/files/" fileName=".*.(doc)|(pdf)|(xls)|(ppt)|(docx)|(txt)|(pptx)|(xlsx)|(xml)|(csv)|(json)|(html)|(sh)|(css)|(png)" recursive="true"> <field column="fileAbsolutePath" name="url" /> <field column="fileSize" name="size" /> <field column="fileLastModified" name="lastModified" /> <field column="file" name="fname"/> <entity name="documentImport" processor="TikaEntityProcessor" url="${files.fileAbsolutePath}" format="text"> <field column="Author" name="author" meta="true"/> <field column="title" name="title" meta="true"/> <field column="subject" name="subject" meta="true"/> <field column="Content-Type" name="content_type" meta="true"/> <field column="text" name="content"/> </entity> </entity>
<!--Entity數據源為SQL Server數據庫--> <entity name="DimOrganization" dataSource="sqldb2" query="SELECT [物料類型名稱] as 名稱 FROM [GreeBGDW].[dbo].[Dim_MaterielType]"> <field column="名稱" name="name"/> </entity>
<!--Entity數據源為SQL Server數據庫-->
<entity name="180119" dataSource="sqldb2"
query="SELECT [name] as name , [name] as cat ,name as manu FROM [GreeBGDW].[dbo].[180119]"> <field column="name" name="name"/> <field column="cat" name="cat"/> <field column="manu" name="manu"/> </entity> </document> </dataConfig>
一個簡單的實體處理程序,可以用於枚舉標准文件系統中的文件列表,它不需要使用DataSource.屬性如下:
- fileName:(必填) 用正則表達式來標記文件名
- baseDir:(必填) 基礎目錄,絕對路徑.
- recursive:是否遞歸文件列表,默認為false.
- excludes:不包括的文件名的正則表達式
- newerThan:日期參數,格式: (yyyy-MM-dd HH:mm:ss),它也可以是一個數學日期,如('NOW-3DAYS'),其中的單引號是必填的.也可以是一個有效的變量格式,如(${var.name}).
- olderThan :日期格式,規則同上.
- biggerThan:整型參數.
- smallerThan:整型參數.
- rootEntity:它一般情況下都是false(除非你只索引文件名).直屬於<document>下的實體才是根實體.那就意味着,根實體發出的每一行都會被solr/lucene創建.但是在這種情況下,我們不希望一個文件對應一個文檔(document).我們希望生成一個文檔(document),每一行的發出都是由下面的實體'x'來完成的.因為實體'f'包含了rootEntity=false,直屬實體f下的實體就變成了一個根實體.
- dataSource:數據源
【錯誤一】 org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /configs/collection2/dataimport.properties

【解決方法】在配置文件conf/目錄下添加一個空的dataimport.propertie文件。