一、SolrJ介紹
1. SolrJ是什么?
Solr提供的用於JAVA應用中訪問solr服務API的客戶端jar。在我們的應用中引入solrj:
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>7.3.0</version> </dependency>
2. SolrJ的核心API
SolrClient
SolrRequest
SolrResponse
3. SolrClient 的子類
HttpSolrClient – 與指定的一個solr節點通信的客戶端
LBHttpSolrClient –負載均衡地訪問一組節點的客戶端
CloudSolrClient – 訪問solrCloud的客戶端
ConcurrentUpdateSolrClient –並發更新索引用的客戶端
4. 創建客戶端時通用的配置選項
4.1 Base URL:
http://hostname:8983/solr/core1
http://hostname:8983/solr
4.2 Timeouts
final String solrUrl = "http://localhost:8983/solr"; return new HttpSolrClient.Builder(solrUrl) .withConnectionTimeout(10000) .withSocketTimeout(60000) .build();
5. 用SolrJ索引文檔
//獲取solr客戶端 final SolrClient client = getSolrClient(); //創建一個solr文檔doc添加字段值 final SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", UUID.randomUUID().toString()); doc.addField("name", "Amazon Kindle Paperwhite"); //把solr文檔doc通過客戶端提交到內核techproducts中去 final UpdateResponse updateResponse = client.add("techproducts", doc); // 索引文檔必須被提交 client.commit("techproducts");
6. 用SolrJ查詢
//獲取solr客戶端 final SolrClient client = getSolrClient(); //創建查詢的map參數 final Map<String, String> queryParamMap = new HashMap<String, String>(); queryParamMap.put("q", "*:*"); queryParamMap.put("fl", "id, name"); queryParamMap.put("sort", "id asc"); //把查詢的map參數放到MapSolrParams里面去 MapSolrParams queryParams = new MapSolrParams(queryParamMap); //通過客戶端用查詢參數queryParams去內核techproducts里面查詢數據 final QueryResponse response = client.query("techproducts", queryParams); //從響應結果里面獲取查詢的document final SolrDocumentList documents = response.getResults(); out("Found " + documents.getNumFound() + " documents"); //遍歷document取出結果 for(SolrDocument document : documents) { final String id = (String) document.getFirstValue("id"); final String name = (String) document.getFirstValue("name"); out("id: " + id + "; name: " + name); }
7. Java 對象綁定
public static class TechProduct { @Field public String id; @Field public String name; public TechProduct(String id, String name) { this.id = id; this.name = name; } public TechProduct() {} }
索引:
final SolrClient client = getSolrClient(); final TechProduct kindle = new TechProduct("kindle-id-4", "Amazon Kindle Paperwhite"); final UpdateResponse response = client.addBean("techproducts", kindle); client.commit("techproducts");
查詢:
final SolrClient client = getSolrClient(); final SolrQuery query = new SolrQuery("*:*"); query.addField("id"); query.addField("name"); query.setSort("id", ORDER.asc); final QueryResponse response = client.query("techproducts", query); final List<TechProduct> products = response.getBeans(TechProduct.class);
8.詳細API介紹
SolrClient的API
SolrRequest 的API
SolrRequest 的子類
SolrResponse 的API
SolrResponse 的子類
9. 示例代碼
package com.dongnao.solr.demo.client; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.impl.CloudSolrClient; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.impl.LBHttpSolrClient; import org.apache.solr.client.solrj.response.UpdateResponse; import org.apache.solr.common.SolrInputDocument; public class SolrJClientDemo { // baseSolrUrl 示例 private static String baseSolrUrl = "http://localhost:8983/solr/"; private static String baseSolrUrlWithCollection = "http://localhost:8983/solr/techproducts"; /** * HttpSolrClient:與一個solr Server 通過http進行通信 */ public static SolrClient getHttpSolrClient(String baseSolrUrl) { return new HttpSolrClient.Builder(baseSolrUrl) .withConnectionTimeout(1000).withSocketTimeout(6000).build(); } public static SolrClient getHttpSolrClient() { return new HttpSolrClient.Builder(baseSolrUrl) .withConnectionTimeout(1000).withSocketTimeout(6000).build(); } /** * LBHttpSolrClient: 負載均衡的httpSolrClient <br> * 負載均衡方式: 輪詢給定的多個solr server url。 * 當某個url不通時,url地址會從活躍列表移到死亡列表中,用下一個地址再次發送請求。<br> * 對於死亡列表中的url地址,會定期(默認每隔1分鍾,可設置)去檢測是否變活了,再加入到活躍列表中。 <br> * 注意: <br> * 1、不可用於主從結構master/slave 的索引場景,因為主從結構必須通過主節點來更新。 <br> * 2、對於SolrCloud(leader/replica),使用CloudSolrClient更好。 * 在solrCloud中可用它來進行索引更新,solrCloud中的節點會將請求轉發到對應的leader。 */ public static SolrClient getLBHttpSolrClient(String... solrUrls) { return new LBHttpSolrClient.Builder().withBaseSolrUrls(solrUrls) .build(); } private static String baseSolrUrl2 = "http://localhost:7001/solr/"; public static SolrClient getLBHttpSolrClient() { return new LBHttpSolrClient.Builder() .withBaseSolrUrls(baseSolrUrl, baseSolrUrl2).build(); } /** * 訪問SolrCloud集群用CloudSolrClient<br> * CloudSolrClient 實例通過訪問zookeeper得到集群中集合的節點列表,<br> * 然后通過LBHttpSolrClient來負載均衡地發送請求。<br> * 注意:這個類默認文檔的唯一鍵字段為“id”,如果不是的,通過 setIdField(String)方法指定。 */ public static SolrClient getCloudSolrClient(List<String> zkHosts, Optional<String> zkChroot) { return new CloudSolrClient.Builder(zkHosts, zkChroot).build(); } private static String zkServerUrl = "localhost:9983"; public static SolrClient getCloudSolrClient() { List<String> zkHosts = new ArrayList<String>(); zkHosts.add(zkServerUrl); Optional<String> zkChroot = Optional.empty(); return new CloudSolrClient.Builder(zkHosts, zkChroot).build(); } public static void main(String[] args) throws Exception { // HttpSolrClient 示例: SolrClient client = SolrJClientDemo.getHttpSolrClient(); SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", UUID.randomUUID().toString()); doc.addField("name", "HttpSolrClient"); UpdateResponse updateResponse = client.add("techproducts", doc); // 記得要提交 client.commit("techproducts"); System.out.println("------------ HttpSolrClient ------------"); System.out.println("add doc:" + doc); System.out.println("response: " + updateResponse.getResponse()); client.close(); // LBHttpSolrClient 示例 client = SolrJClientDemo.getLBHttpSolrClient(); doc.clear(); doc.addField("id", UUID.randomUUID().toString()); doc.addField("name", "LBHttpSolrClient"); updateResponse = client.add("techproducts", doc); // 記得要提交 client.commit("techproducts"); System.out.println("------------ LBHttpSolrClient ------------"); System.out.println("add doc:" + doc); System.out.println("response: " + updateResponse.getResponse()); client.close(); // CloudSolrClient 示例 client = SolrJClientDemo.getCloudSolrClient(); doc.clear(); doc.addField("id", UUID.randomUUID().toString()); doc.addField("name", "CloudSolrClient"); updateResponse = client.add("techproducts", doc); // 記得要提交 client.commit("techproducts"); System.out.println("------------ CloudSolrClient ------------"); System.out.println("add doc:" + doc); System.out.println("response: " + updateResponse.getResponse()); client.close(); } }
二、索引 API 詳解
1. Solr提供的數據提交方式簡介
Solr中數據提交進行索引都是通過http請求,針對不同的數據源solr提供了幾種方式來方便提交數據。
1.1 基於Apache Tika 的 solr cell(Solr Content Extraction Library ),來提取上傳文件內容進行索引。
1.2 應用中通過Index handler(即 index API)來提交數據。
1.3 通過Data Import Handler 來提交結構化數據源的數據
2. Index handler 是什么?
Index handler 索引處理器,是一種Request handler 請求處理器。
solr對外提供http服務,每類服務在solr中都有對應的request handler來接收處理,solr中提供了默認的處理器實現,如有需要我們也可提供我們的擴展實現,並在conf/solrconfig.xml中進行配置。
在 conf/solrconfig.xml中,requestHandler的配置就像我們在web.xml中配置servlet-mapping(或spring mvc 中配置controller 的requestMap)一樣:配置該集合/內核下某個請求地址的處理類。
Solrconfig中通過updateHandler元素配置了一個統一的更新請求處理器支持XML、CSV、JSON和javabean更新請求(映射地址為/update),它根據請求提交內容流的內容類型Content-Type將其委托給適當的ContentStreamLoader來解析內容,再進行索引更新。
3. 配置一個requestHandler示例
<requestHandler name=“/update" class="solr.UpdateRequestHandler" />
4. Xml 格式數據索引更新
提交操作可以在solr的web控制台中進行
請求頭中設置 Content-type: application/xml or Content-type: text/xml
4.1 添加、替換文檔
<add> 操作,支持兩個可選屬性:
commitWithin:限定在多少毫秒內完成
overwrite:指定當唯一鍵已存在時是否覆蓋,默認true。
<add> <doc> <field name="authors">Patrick Eagar</field> <field name="subject">Sports</field> <field name="dd">796.35</field> <field name="numpages">128</field> <field name="desc"></field> <field name="price">12.40</field> <field name="title">Summer of the all-rounder</field> <field name="isbn">0002166313</field> <field name="yearpub">1982</field> <field name="publisher">Collins</field> </doc> <doc> ... </doc> </add>
4.2 刪除文檔
<delete> <id>0002166313</id> <id>0031745983</id> <query>subject:sport</query> <query>publisher:penguin</query> </delete>
<delete> 操作,支持兩種刪除方式:
1、根據唯一鍵
2、根據查詢
4.3 組合操作
添加和刪除文檔
<update> <add> <doc><!-- doc 1 content --></doc> </add> <add> <doc><!-- doc 2 content --></doc> </add> <delete> <id>0002166313</id> </delete> </update>
響應結果:Status=0表示成功 Qtime是耗時
<response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">127</int> </lst> </response>
4.4 提交、優化、回滾操作
<commit waitSearcher="false"/> <commit waitSearcher="false" expungeDeletes="true"/> <optimize waitSearcher="false"/> <rollback/>
commit、optimize 屬性說明:
waitSearcher:默認true,阻塞等待打開一個新的IndexSearcher並注冊為主查詢searcher,來讓提交的改變可見。
expungeDeletes: (commit only) 默認false,合並刪除文檔量占比超過10%的段,合並過程中刪除這些已刪除的文檔。
maxSegments: (optimize only) 默認1,優化時,將段合並為最多多少個段
5. JSON 格式數據索引更新
提交操作可以在solr的web控制台中進行
請求頭中設置 Content-Type: application/json or Content-Type: text/json
5.1 添加、替換一個文檔
{
"id": "1",
"title": "Doc 1"
}
5.2 添加、替換多個文檔
[
{
"id": "1",
"title": "Doc 1"
},
{
"id": "2",
"title": "Doc 2"
}
]
5.3 在json中指定操作
{
"add": {
"doc": {
"id": "DOC1",
"my_field": 2.3,
"my_multivalued_field": [ "aaa", "bbb" ]
}
},
"add": {
"commitWithin": 5000,
"overwrite": false,
"doc": {
"f1": "v1",
"f1": "v2"
}
},
"commit": {},
"optimize": { "waitSearcher":false },
"delete": { "id":"ID" },
"delete": { "query":"QUERY" }
}
5.4 根據唯一鍵刪除的簡寫方式
{ "delete":"myid" }
{ "delete":["id1","id2"] }
5.5 針對 JSON 格式數據提供的兩個專用path
不需要在請求頭中設置 Content-Type: application/json or Content-Type: text/json
/update/json
/update/json/docs 專門用於提交json格式的文檔 如:product.json
三、結構化數據導入DIH
1. Solr結構化數據導入簡介
Solr支持從關系數據庫、基於http的數據源(如RSS和ATOM提要)、電子郵件存儲庫和結構化XML 中索引內容。
我們如何觸發solr進行數據導入?
1.1 需要在solrconfig.xml配置一個requestHandler,通過發出http請求來觸發,這個requestHander稱為Data import Handler (DIH)
<requestHandler name="/dataimport" class="solr.DataImportHandler"> <lst name="defaults"> <str name="config">/path/to/my/DIHconfigfile.xml</str> </lst> </requestHandler>
DataImportHandler這個類所在jar並沒有包含在類目錄中,我們需要在solrconfig.xml中引入這個jar; 它還需要一個配置文件
1.2 在solrconfig.xml中引入DataImportHandler的jar
在solrconfig.xml中找到<lib>的部分,加入下面的
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />
solr接到請求后,它如何知道該從何處取什么數據進行索引?
這就需要一個配置文件來定義這些了:
<requestHandler name="/dataimport" class="solr.DataImportHandler"> <lst name="defaults"> <str name="config">dih-data-config.xml</str> </lst> </requestHandler>
配置文件可以是絕對路徑、或相對集合conf/的相對路徑。
2. DIH 核心概念
字段對應規則說明:
1、自動進行名字相同配對;
2、對於名字不同的通過顯式配置 field的column、name屬性指定
配置示例:
在solr安裝目錄中的example/example-DIH/solr/ 下可以看到好幾個導入示例
1、請查看各示例的solrconfig.xml中通過<lib>導入了哪些數據導入相關的jar。
2、請查看各示例的DIH配置文件的定義。
3、請重點看看從關系數據庫導入的示例。
練習:從關系數據庫導入數據到solr實踐
數據庫:mysql
表結構如下:
//商品表 create table t_product( prod_id varchar(64) PRIMARY key, name varchar(200) not null, simple_intro LONGTEXT, price bigint, uptime datetime, brand_id varchar(64), last_modify_time datetime ); //商品的品牌表 create table t_brand( id varchar(64) PRIMARY key, name varchar(200) not null, last_modify_time datetime ); //商品的種類表 create table t_cat( id varchar(64) PRIMARY key, name varchar(200) not null, last_modify_time datetime ); //商品和商品種類的關系映射表 create table t_prod_cat( prod_id varchar(64), cat_id varchar(64) , last_modify_time datetime ); //初始化數據 INSERT INTO t_brand VALUES ('b01', '華為', '2018-5-17 00:00:00'); INSERT INTO t_brand VALUES ('b02', '戴爾', '2018-5-18 00:00:00'); INSERT INTO t_cat VALUES ('c01', '台式機', '2018-5-17 00:00:00'); INSERT INTO t_cat VALUES ('c02', '服務器', '2018-5-17 00:00:00'); INSERT INTO t_product VALUES ('tp001', '華為(HUAWEI)RH2288HV3服務器', '12盤(2*E5-2630V4 ,4*16GB ,SR430 1G,8*2TSATA,4*GE,2*460W電源,滑軌) ', 4699900, '2018-5-8 00:00:00', 'b01', '2018-5-8 00:00:00'); INSERT INTO t_product VALUES ('tp002', '戴爾 DELL R730 2U機架式服務器', '戴爾 DELL R730 2U機架式服務器(E5-2620V4*2/16G*2/2T SAS*2熱/H730-1G緩存/DVDRW/750W雙電/導軌)三年', 2439900, '2018-5-18 15:32:13', 'b02', '2018-5-18 17:32:23'); INSERT INTO t_prod_cat VALUES ('tp001', 'c01', '2018-5-8 14:48:56'); INSERT INTO t_prod_cat VALUES ('tp001', 'c02', '2018-5-8 14:49:15'); INSERT INTO t_prod_cat VALUES ('tp002', 'c01', '2018-5-18 15:32:48'); INSERT INTO t_prod_cat VALUES ('tp002', 'c02', '2018-5-18 18:29:23');
前期准備:
1、創建一個集合或內核 myproducts,配置集用 _default。
D:\solr-7.3.0\bin>solr.cmd create -c myproducts -d _default -p 8983
2、為myproducts添加如下字段定義(分詞的要用中文分詞器)。
2.1 在myproducts的D:\solr-7.3.0\server\solr\myproducts\conf\managed-schema模式文件下配置中文分詞器
<!-- 自定義中文分詞器 begin --> <fieldType name="ik_zh_CN" class="solr.TextField"> <analyzer> <tokenizer class="com.study.lucene.demo.analizer.ik.IKTokenizer4Lucene7Factory" useSmart="true"/> </analyzer> </fieldType> <!-- 自定義中文分詞器 end -->
2.2 在myproducts的D:\solr-7.3.0\server\solr\myproducts\conf\managed-schema模式文件下配置如下字段
prodId:商品id,字符串,索引、存儲;
name: 商品名稱,字符串,分詞、索引、存儲
simpleIntro:商品簡介,字符串,分詞、索引、不存儲
price:價格,整數(單位分),索引,存儲
uptime:上架時間,索引、docValues 支持排序
brand:品牌,不分詞、索引、docValues 支持分面查詢
cat:分類,多值,不分詞、索引、docValues
<field name="prodId" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="name" type="ik_zh_CN" indexed="true" stored="true" required="true" /> <field name="simpleIntro" type="ik_zh_CN" indexed="true" stored="flase" /> <field name="price" type="pint" indexed="true" stored="true" docValues="true" useDocValuesAsStored="true" /> <field name="uptime" type="pdate" indexed="true" stored="true" docValues="true" useDocValuesAsStored="true" /> <field name="brand" type="string" indexed="true" stored="true" docValues="true" useDocValuesAsStored="true" /> <field name="cat" type="strings" indexed="true" stored="true" docValues="true" useDocValuesAsStored="true" />
3、將myproducts模式(D:\solr-7.3.0\server\solr\myproducts\conf\managed-schema)的唯一鍵字段設為 prodId。
<uniqueKey>prodId</uniqueKey>
從新加載內核myproducts可以看到配置生效了
從關系數據庫導入實踐-步驟
1. 拷貝mysql的驅動jar包mysql-connector-java-5.1.34_1.jar到solrD:\solr-7.3.0\server\solr-webapp\webapp\WEB-INF\lib目錄下
2. 在myproducts集合的solrconfig.xml中配置<lib>和DIH
2.1 配置lib
<!--導入mysql結構化數據需要的lib包 begin --> <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" /> <!--導入mysql結構化數據需要的lib包 end -->
2.2 配置DIH
<!--導入mysql結構化數據需要的DIH begin --> <requestHandler name="/dataimport" class="solr.DataImportHandler"> <lst name="defaults"> <str name="config">db-data-config.xml</str> </lst> </requestHandler> <!--導入mysql結構化數據需要的DIH end -->
3. 在myproducts集合的conf/目錄下創建dih配置文件db-data-config.xml
3.1 配置數據源
單數據源
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/dbname" user="db_username" password="db_password"/>
多數據源
<dataSource type="JdbcDataSource" name="ds-1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db1-host/dbname" user="db_username" password="db_password"/> <dataSource type="JdbcDataSource" name="ds-2" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db2-host/dbname" user="db_username" password="db_password"/>
說明:
(1) . name、type 是通用屬性,type默認是jdbcDataSource
(2) 其他屬性是非固定的,不同type可有不同的屬性,可隨意擴展。
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/study?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT" user="root" password="123456" />
說明: serverTimezone=GMT是為解決引入最新版mysql驅動jar報時區錯誤而加入的連接請求參數。
3.2 . 配置document對應的實體(導入的數據)。
<document> 下可包含一個或多個 <entity>數據實體
entity 數據實體通用屬性說明
name (required) : 標識實體的唯一名 processor : 當數據源是非RDBMS 時,必須指定處理器。(默認是SqlEntityProcessor) transformer : 要應用在該實體上的轉換器。 dataSource : 當配置了多個數據源時,指定使用的數據源的名字。 pk : 實體的主鍵列名。只有在增量導入時才需要指定主鍵列名。和模式中的唯一鍵是兩個不同的東西。 rootEntity : 默認document元素的子entity是rootEntity,如果把rootEntity屬性設為false值,則它的子會被作為rootEntity(依次類推)。rootEntity返回的每一行會創建一個document。 onError : (abort|skip|continue) . 當處理entity的行為document的過程中發生異常該如何處理:默認是 abort,放棄導入。skip:跳過這個文檔,continue:繼續索引該文檔。 preImportDeleteQuery : 在全量導入前,如需要進行索引清理cleanup,可以通過此屬性指定一個清理的索引刪除查詢,否則用的是‘*:*’(刪除所有)。只有<document>的直接子Entity設置此屬性有效。 postImportDeleteQuery : 指定全量導入后需要進行索引清理的delete查詢。只有<document>的直接子Entity設置此屬性有效.
SqlEntityProcessor 的 entity 屬性說明
query (required) : 從數據庫中加載實體數據用的SQL語句。 deltaQuery : 僅用於增量導入,指定增量數據pk的查詢SQL。 parentDeltaQuery : 指定增量關聯父實體的pk的查詢SQL。 deletedPkQuery :僅用於增量導入,被刪除實體的pk查詢SQL。 deltaImportQuery : (僅用於增量導入) .指定增量導入實體數據的查詢SQL。如果沒有指定該查詢語句,solr將使用query屬性指定的語句,經修改后來查詢加載增量數據(這很容易出錯)。在該語句中往往需要引用deltaQuery查詢結果的列值,
通過 ${dih.delta.<column-name>} 來引用,如:select * from tbl where id=${dih.delta.id}
3.3. 在實體的query屬性里面配置查詢數據的SQL
7. 配置獲取關聯表數據
entity 關系表示
實體關系(一對一、一對多、多對一、多對多),用子實體來表示,在子實體的SQL查詢語句中可用${parentEntity.columnName}來引用父實體數據的列值。
一個實體可包含多個子實體。
配置完的db-data-config.xml最終內容如下:
<dataConfig> <!--配置數據源 --> <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/study?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT" user="root" password="123456" /> <document> <!--配置document對應的實體(導入的數據) 配置查詢數據的SQL(這里偷了一下懶,用一個sql查出了需要的數據,實際上還可以通過配置子實體關聯到需要的數據)--> <entity name="item" pk="prodId" query="SELECT tp.prod_id prodId,tp.name prodname,tp.simple_intro simpleIntro,tp.price,tp.uptime,tb.name brand,tc.name cat FROM t_product tp LEFT JOIN t_brand tb ON tp.brand_id = tb.id LEFT JOIN t_prod_cat tpc ON tp.prod_id = tpc.prod_id INNER JOIN t_cat tc ON cat_id = tc.id GROUP BY tp.prod_id"> <!--配置sql查詢的列和模式里面定義字段的對應關系 begin --> <field column="prodId" name="prodId" /> <field column="prodname" name="name" /> <field column="simpleIntro" name="simpleIntro" /> <field column="price" name="price" /> <field column="uptime" name="uptime" /> <field column="brand" name="brand" /> <field column="cat" name="cat" /> <!--配置sql查詢的列和模式里面定義字段的對應關系 end --> </entity> </document> </dataConfig>
8.在solr的web控制台從新加載集合myproducts以后執行同步,可以看到數據庫的數據已經成功導入到solr里面來了
3. 增量導入中的特殊變量${dataimporter.last_index_time} 說明
這個變量是上次導入的開始時間。默認存儲在conf/請求處理器名.properties文件中。我們可以在<dataConfig>下配置一個propertyWriter元素來設置它。
<propertyWriter dateFormat="yyyy-MM-dd HH:mm:ss" type="SimplePropertiesWriter" directory="data" filename="dataimport.properties" locale="en_US" />
說明:type在非cloud模式下默認是SimplePropertiesWriter,在cloud模式下默認是ZKPropertiesWriter
4. DIH配置文件中使用請求參數
如果你的DIH配置文件中需要使用請求時傳人的參數,可用${dataimporter.request.paramname}表示引用請求參數。
配置示例:
<dataSource driver="org.hsqldb.jdbcDriver" url="${dataimporter.request.jdbcurl}" user="${dataimporter.request.jdbcuser}" password="${dataimporter.request.jdbcpassword}" />
請求傳參示例:
http://localhost:8983/solr/dih/dataimport?command=full-import&jdbcurl=jdbc:hsqldb:./example-DIH/hsqldb/ex&jdbcuser=sa&jdbcpassword=secret
四、總結
1. Solr支持從很多種數據源導入數據
2. 實現了很多的處理器及轉換器
3. 實際工作過程中如碰到了別的數據源的導入,一定要想到solr中應該有對應的解決方案。參考地址:
http://lucene.apache.org/solr/guide/7_3/uploading-structured-data-store-data-with-the-data-import-handler.html
https://wiki.apache.org/solr/DataImportHandle