Solr系列四:Solr(solrj 、索引API 、 结构化数据导入)
个人博客请访问http://www.x0100.top
一、SolrJ介绍
1. SolrJ是什么?
Solr开发了一个用于Java应用程序访问其服务API的客户端库。我们引入了一个基于Solr的服务API访问库:
<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
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请求数据提交系统。根据不同的数据源类型,在不同场景下都可以选择相应的配置选项来实现便捷的数据操作。
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 服务功能,并对各类服务都设置了相应的 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 添加、替换文档
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>
代码解读
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 属性说明:
wait_for_searcher: 默认设置为true,在阻塞地打开一个新的IndexSearcher后将其注册为主查询, 从而影响提交更改的可见性.
expurgeDeletes: (commit only)默认false,在合并过程中移除这些已删除的段。
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或text/json值
/update/json
/update/json/docs 专门用于提交json格式的文档 如:product.json
三、结构化数据导入DIH
1. Solr结构化数据导入简介
Solr能够处理包括关系数据库、基于HTTP的数据源(如RSS和ATOM提要)以及结构化XML存储在索引中。
我们如何触发solr进行数据导入?
在 solrconfig.xml 文件中设置一个名为 Data import Handler(DIH)的请求处理器,并通过发起 HTTP 请求的方式进行触发
<requestHandler name="/dataimport" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">/path/to/my/DIHconfigfile.xml</str>
</lst>
</requestHandler>
代码解读
该类所处的jar并未存在于类目录中;我们需将此jar添加到solrconfig.xml中,并为它配置相应的参数。
1.2 在solrconfig.xml中引入DataImportHandler的jar
在solrconfig.xml中找到
<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/ 中可识别为几个导入样例
请查看各个示例中的solrconfig.xml文件中通过
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服务器目录下的配置文件夹内部署中文分词器参数设置
<!-- 自定义中文分词器 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" />
代码解读
配置myproducts模式(指定路径D:\solr-7.3.0\server\solr\myproducts\conf\managed-schema)的唯一标识字段为prodId
<uniqueKey>prodId</uniqueKey>
代码解读
从新加载内核myproducts可以看到配置生效了

从关系数据库导入实践-步骤
复制mysql的JDBC驱动包mysql-connector-java-5.1.34_1.jar至solr server directory下的指定位置。
2. 在myproducts集合的solrconfig.xml中配置
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" />
代码解读
为了应对引入最新版mysql驱动jar时出现的时间相关报错问题,在连接请求参数中设置了时间区字段设置为GMT值。
3.2 . 配置document对应的实体(导入的数据)。
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}引用父 entities对应的数据列。
一个实体可包含多个子实体。
配置完的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>
代码解读
通过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" />
代码解读
说明:在非云模式下,默认配置参数类型为SimplePropertiesWriter;而在云模式下,默认配置参数类型为ZKPropertiesWriter。
4. DIH配置文件中使用请求参数
如果在你的DIH配置文件中需要引用请求时传人的参数,则可以使用${dataimporter.request.paramname}来表示该变量名。
配置示例:
<dataSource driver="org.hsqldb.jdbcDriver" url="${dataimporter.request.jdbcurl}" user="${dataimporter.request.jdbcuser}" password="${dataimporter.request.jdbcpassword}" />
代码解读
请求传参示例:
四、总结
1. Solr支持从很多种数据源导入数据
2. 实现了很多的处理器及转换器
在实际工作中遇到其他数据源导入的情况时,则要考虑Solr中应有相应的解决方案。参考地址:
该手册描述了如何通过Data Import Handler将结构化数据上传至Solr实例。该组件是一个由Solr提供的功能模块,在您直接将数据存储于搜索索引的同时实现了这一目标。此组件具备存储多种类型的结构化数据的能力(包括但不限于文本、数字和日期)。特别地,在需要高效率的大规模数据集成项目中具有其不可替代的价值。当与外部系统集成时,请确保数据的一致性和更新性得以维护。$import_handler可以配置以处理不同类型的结构化数据。这将使您能够实现与外部系统及数据库的无缝集成。该组件支持JSON、XML以及CSV等多种格式的数据导入与存储操作。对于开发大型分布式系统而言这是一个不可或缺的关键组件。通过采用此组件您可以确保自身索引中的数据存储既高效又可靠。
https://wiki.apache.org/solr/DataImportHandle
更多精彩内容扫描下方二维码进入网站。。。。。

关注微信公众号。。。。。



