Solr中使用DIH(DataImportHandler)模式
最早只是使用全量导入功能,即full-import
网上能搜索到的大部分demo多采用的情况是建立索引,查询,都是在同一个容器内操作,即开启同一个tomcat/jetty等
通过http请求中加入相应的参数即完成了相关操作,如:
http://localhost:8080/dataimport?command=full-import
http://localhost:8080/dataimport?command=delta-import
http://localhost:8080/solr/select/?q=*:*&version=2.2&start=0&rows=100&indent=on&group=true&group.field=albumId&group.ngroups=true
group用来分组,group.ngroups用来统计命中的数量,不过貌似这个东西比较慢
或者通过代码
private static final String DEFAULT_URL = "http://localhost:8983/solr/";
@Before
public void init() {
try {
server = new CommonsHttpSolrServer(DEFAULT_URL);
httpServer = new CommonsHttpSolrServer(DEFAULT_URL);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
这样做的前提就是必须先启动一个容器,非常不便于单元测试;
如果不启动容器,则无法完成上述操作
而在代码中如果不通过jetty等来进行操作,Solr提供了如下方式:
private void initCore(){
System.setProperty("solr.solr.home", "/home/admin/solr");
CoreContainer.Initializer init = new CoreContainer.Initializer();
try {
core = init.initialize().getCore(CORE_NAME);
} catch (Exception e){
logger.error("error occur when create core:{}", CORE_NAME);
}
}
首先建立初始化一个core,你可以设置一个全局的
SolrCore core = null;
如果有全量的操作
如下所示:
if(core==null){
initCore();
}
try {
SolrRequestHandler requestHandler = core.getRequestHandler("/dataimport");
NamedList params = new NamedList();
params.add("command", DataImporter.FULL_IMPORT_CMD);
params.add("synchronous", Boolean.TRUE);
params.add("clean", Boolean.TRUE);
SolrQueryRequest req = new LocalSolrQueryRequest(core,params) ;
SolrQueryResponse rsp = new SolrQueryResponse();
requestHandler.handleRequest(req, rsp);
} catch (Exception e) {
result = Boolean.FALSE;
logger.error("error",e);
}
这样便完成了数据的全量导入,你太幸运了,不过在这之前你必须完成以下操作
第一:配置schema.xml,其中主要配置一下东西:
1 <fields></fields>这个是你要建立索引所需要的所有的字段
2 <uniqueKey>id</uniqueKey>(可选,如果你不打算在后续的db-data-config.xml)中配置pk,那么这里就是必须的,
如果你在db-data-config.xml中配置了pk那么这个就不是必须的了
第二:配置solrconfig.xml,这个当中要做的事情是
添加:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">db-data-config.xml</str>
</lst>
</requestHandler>
既然这里配置了
db-data-config.xml
那么
第三:配置db-data-config.xml
这个文件中主要配置了大量的field的属性
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test"
user="test" password="test" /><!-- 这里定义datasource(数据源)solr默认采用JdbcDataSource,这里你可以使用自己的自定义的XXXDataSource-->
<document>
<entity name="item"
query="select * from student where studentnum > 1" pk="id"
deltaImportQuery="select * from student where id='${dataimporter.delta.id}'"
deltaQuery="select id from studentwhere gmt_modified > '${dataimporter.last_index_time}'">
<field column="id" name="id" />
<field column="username" name="username" />
<field column="studentnum" name="studentnum" />
<field column="birthday" name="birthday" />
<field column="pic" name="pic" />
<entity name="course" transformer="com.my.dump.test.transformer.CourseTransformer" pk="id"
query="select id,CONTENT from course where studentnum='${item.studentnum}'"
deltaQuery="select id,studentnum from course where gmt_modified > '${dataimporter.last_index_time}'"
parentDeltaQuery="select id from student where studentnum='${course.studentnum}'">
<field name="prop" column="content" />
</entity>
</entity>
</document>
</dataConfig>
dataSource可以自定义,只需要继承
public class JdbcDataSource extends
DataSource<Iterator<Map<String, Object>>> {
例如:
<dataSource type="com.my.test.dataimport.StudentDataSource"/>
document中使用的是自己要被加入到索引中的field
query,被用来做为全量导入的时候使用
deltaImportQuery 这个是在增量时使用的修改语句,其中需要注意的是dataimporter.delta这个前缀一定要带
pk,根据我艰苦卓绝的跟踪代码知道这个pk其实作用只是用来对deltaQuery查询出来的内容放入到一个map中的时候作为key用的
如果你不想deltaQuery查询出来的结果最后出现混乱,那么最好保证pk是唯一的
deltaQuery,这个是用来查询需要被更新的对象的主键,一边deltaImportQuery使用
transformer:很多时候数据库中的字段不能满足你的需要,比如存储了用户生日,那么你需要将他的生肖存储,则此时需要对生日做自己的处理
那么你需要一个
public class PropTransformer extends Transformer {
这样实现它的
@Override
public Object transformRow(Map<String, Object> row, Context context) {
System.out.println("--------------------------------------");
String content = (String)row.get("CONTENT");
//转换处理逻辑
if(content==null){
return null;
}
try {
row.put(BABYNICK, kvMap.get(BABYNICK));
return row;
} catch (Exception e) {
return null;
}
}
这样就可以使用自己的操作了
parentDeltaQuery:这个是当子类发生变化是同时要通知主类,因为solr现在还没有能够只修改对应document中的个别属性的能力,通常是删除后重新插入
所以在这里也是要查询出子类对应的主类的主键id
Solr的DIH功能工作过程如下:
1.加载配置文件,确定命令类型,加载datasource
2.如果是full-import,则执行全量导入,依据配置文件或代码中的query配置执行
3.如果是delta-import,首先从根entity的下一级中执行detlaQuery,查找满足的row,同时根据pk从row中取出pk的value,然后以value作为键,以row作为值存入到map中,检测是否含有parentDeltaQuery,如果存在,从上一个map中取出parentDeltaQuery需要的参数值,查处parent的pk,依次递归,知道拿到根元素的pk,最终将所有的根元素的pk放入到一个map中,依次执行deltaImportQuery,这样所有相关的数据将被更新
其中让人头疼的是,在加载dataimport.properties文件时,通过查看文件发现只有如下配置:
#Wed Feb 08 10:56:12 CST 2012
item.last_index_time=2012-02-08 10\:56\:11
last_index_time=2012-02-08 10\:56\:11
那么我就这样处理
deltaQuery="select id,user_id from user_profile where gmt_modified > '${last_index_time}'"
结果发现执行后的sql中last_index_time是空的,经过艰苦卓绝的跟踪代码发现,原来最后生成的 resolver对象中存放的数据(map)的key没有以last_index_time开头的,只有以dataimport为key的map为value,其中value中有lasta_index_time和item.last_index_time,所以当加上dataimport前缀后预期的结果出现了,也就是说其中的一些配置并不是随意的,有些属于固定配置,
还有就是pk的作用一直没搞懂,也是通过跟踪代码发现pk本身的作用只是保证查询出来的row放入map中的时候作为key使用的,所以么个entiy如果涉及到增量你就得有pk属性存在
具体的操作过程详见Solr中的DocBuilder这个类
solr搜索的时候使用类sql的group如下:
group=true&group.field=sellerId&group.format=simple
其中sellerId是索引字段
分享到:
相关推荐
7. **处理多种数据格式**:Solr支持多种数据源,包括JSON、XML、CSV等,可以通过DataImportHandler(DIH)从关系型数据库中导入数据,实现对非结构化数据的检索。 8. **更新和优化索引**:Solr提供了实时索引更新和...
Solr的DataImportHandler(DIH)会定期或实时从MySQL中抽取数据并索引。 6. **其他数据库同步** 如果需要同步其他类型的数据库,比如Oracle或PostgreSQL,只需更改数据源配置,确保Solr能正确连接到目标数据库,并...
为了方便使用 Solr 的命令行工具,可以将 Solr 的 bin 目录添加到系统的 PATH 环境变量中。例如,在 `.bashrc` 或 `.bash_profile` 文件中添加: ``` export SOLR_HOME=/path/to/solr-8.8.2 export PATH=$PATH:$...
通过以上步骤,你可以在Solr中使用Ik分词器对中文内容进行高效索引和查询,同时结合MySQL数据库实现数据的实时同步和检索。 总结一下,Ik分词器是Solr处理中文文本的关键组件,它通过动态词汇表和两种分词模式提供...
在这个特定的jar包——"solr-dataimportscheduler-1.2.jar"中,它扩展了DIH的功能,实现了定时同步。这意味着你可以设置一个时间计划,让Solr自动在指定的时间点执行全量或增量同步。这极大地方便了系统维护,减少了...
它是基于Java的,因此在使用Solr之前,确保你的系统已经安装了Java 8或更高版本是至关重要的。标题"solr-7.4.0.zip"表明这是一个包含了Solr 7.4.0版本的压缩包文件,该版本发布于2018年,包含了完整的Solr服务器及其...
6. **Cloud模式**:在Solr 8.8.2中,SolrCloud模式允许在Zookeeper协调下进行集群管理,实现动态分片和故障恢复。 7. **搜索功能**:Solr支持丰富的查询语法,如标准查询解析器、布尔操作符、通配符查询、短语匹配...
在使用Solr时,通常需要一个后端数据库来存储原始数据,Solr通过数据导入工具(Data Import Handler, DIH)从这些数据库中提取数据并建立索引。这个SQL脚本可能用于初始化一个电子商务平台的商品数据库,这些商品...
在标题中提到的"solr解压版安装包",通常是指下载的Solr源码包或预编译的二进制包,无需通过安装程序进行安装,只需将其解压到指定目录即可开始使用。这种部署方式简单快捷,适用于测试环境和轻量级应用。以下是Solr...
在本压缩包中,包含了Solr的各种最新版本的jar包,这些jar包对于理解和使用Solr至关重要。 1. **Solr核心组件**:Solr的核心组件包括索引库、查询解析器、排序机制、分词器等。索引库是Solr存储数据的地方,采用倒...
Solr支持多种导入工具,如DataImportHandler(DIH),可以方便地从关系型数据库中导入数据。 Solr还提供了一套强大的查询语法,允许你构建复杂的查询条件,实现精确的搜索匹配。同时,它支持多种排序、高亮显示、 ...
要实现Solr与MongoDB的定时同步,我们可以使用Solr的DataImportHandler(DIH)或者第三方工具如`mongo-solr-sync`。DIH允许Solr从外部数据源导入数据,通过定义数据源和映射,可以将MongoDB中的文档转换为Solr可索引...
性能调优是Solr使用中的重要环节。这涉及到Schema设计(如哪些字段应被索引,哪些应被存储),配置优化(mergeFactor、缓存设置等),内存管理(防止内存溢出,合理分配JVM内存),以及更新频率和查询响应压缩等方面...
3. **导入数据**:使用Solr的DataImportHandler (DIH) 或者通过HTTP接口批量导入数据。 4. **查询数据**:通过Solr的API发送查询请求,获取匹配的结果。 5. **优化索引**:定期执行优化操作,如`optimize`,以提高...
"代码.rar"可能包含了一个示例数据导入工具,通常Solr使用DataImportHandler(DIH)从外部数据库导入数据并建立索引。配置好数据源和映射后,运行`bin/post -c myCollection /path/to/data`命令即可导入数据。 六、...
在《使用 Apache Solr 实现更加灵巧的搜索,第 1 部分 基本特性和 Solr 模式》文档中,你可能会学习到更多关于 Solr 的基础特性,如查询优化、分词器选择、查询分析过程以及如何利用 Solr 的模式设计来提升搜索体验...
3. **数据同步**:通过Solr的DIH定期或实时从MySQL中抽取数据,更新到Solr索引,实现数据库和搜索索引的同步。 **IK分词器** 1. **IK Analyzer介绍**:IK分词器支持自定义词典,具备动态扩展性,可以处理中文的...
3. `managed-schema`(在较新版本的Solr中替代了`schema.xml`):这是一个动态管理的模式,允许在运行时添加或修改字段定义,而无需重启Solr。 4. `data-config.xml`(可选):用于配置数据驱动的索引(Data Import...
在你提供的信息中,“solr-4.10.3.tgz”是一个在Linux系统上使用的安装包,但在Windows环境下进行了初步解压。这是因为在Windows上,通常需要使用像7-Zip或WinRAR这样的工具来处理.tar.gz(也被称为tgz)格式的文件...
7. **数据导入与处理**:Solr支持多种数据导入方式,如CSV、XML、JSON等,可以使用DataImportHandler(DIH)从关系型数据库中导入数据。压缩包可能包含示例数据和导入配置,让用户学习如何将数据导入到Solr。 8. **...