`
田智伟
  • 浏览: 206809 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Solr中DIH模式的使用

    博客分类:
  • Solr
阅读更多

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是索引字段

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论
2 楼 lzj0327 2016-04-29  
我刚学solr,感觉没法跟踪代码,都是封装好的,所以我对作者的“艰苦卓绝的跟踪代码”这个步骤很感兴趣,能说说步骤吗?
1 楼 wsh525354 2015-07-06  
你好,我用的solr版本是4.9的,现在我自定义了一个TestTransformer extands Transformer,然后在data-import-config.xml中使用了这个transformer,启动solr就报无法找到该类,请问,我改如何自定义transformer,并且将这个类放在哪里才能被solr找到??

相关推荐

    solr4.7中文企业开发参考文档

    7. **处理多种数据格式**:Solr支持多种数据源,包括JSON、XML、CSV等,可以通过DataImportHandler(DIH)从关系型数据库中导入数据,实现对非结构化数据的检索。 8. **更新和优化索引**:Solr提供了实时索引更新和...

    linux环境下 使用的solr

    Solr的DataImportHandler(DIH)会定期或实时从MySQL中抽取数据并索引。 6. **其他数据库同步** 如果需要同步其他类型的数据库,比如Oracle或PostgreSQL,只需更改数据源配置,确保Solr能正确连接到目标数据库,并...

    最新版linux solr-8.8.2.tgz

    为了方便使用 Solr 的命令行工具,可以将 Solr 的 bin 目录添加到系统的 PATH 环境变量中。例如,在 `.bashrc` 或 `.bash_profile` 文件中添加: ``` export SOLR_HOME=/path/to/solr-8.8.2 export PATH=$PATH:$...

    Solr-ik分词

    通过以上步骤,你可以在Solr中使用Ik分词器对中文内容进行高效索引和查询,同时结合MySQL数据库实现数据的实时同步和检索。 总结一下,Ik分词器是Solr处理中文文本的关键组件,它通过动态词汇表和两种分词模式提供...

    solr定时同步jar包.zip

    在这个特定的jar包——"solr-dataimportscheduler-1.2.jar"中,它扩展了DIH的功能,实现了定时同步。这意味着你可以设置一个时间计划,让Solr自动在指定的时间点执行全量或增量同步。这极大地方便了系统维护,减少了...

    solr-7.4.0.zip

    它是基于Java的,因此在使用Solr之前,确保你的系统已经安装了Java 8或更高版本是至关重要的。标题"solr-7.4.0.zip"表明这是一个包含了Solr 7.4.0版本的压缩包文件,该版本发布于2018年,包含了完整的Solr服务器及其...

    最新版windows solr-8.8.2.zip

    6. **Cloud模式**:在Solr 8.8.2中,SolrCloud模式允许在Zookeeper协调下进行集群管理,实现动态分片和故障恢复。 7. **搜索功能**:Solr支持丰富的查询语法,如标准查询解析器、布尔操作符、通配符查询、短语匹配...

    solr课件还有安装原件

    在使用Solr时,通常需要一个后端数据库来存储原始数据,Solr通过数据导入工具(Data Import Handler, DIH)从这些数据库中提取数据并建立索引。这个SQL脚本可能用于初始化一个电子商务平台的商品数据库,这些商品...

    solr解压版安装包

    在标题中提到的"solr解压版安装包",通常是指下载的Solr源码包或预编译的二进制包,无需通过安装程序进行安装,只需将其解压到指定目录即可开始使用。这种部署方式简单快捷,适用于测试环境和轻量级应用。以下是Solr...

    solr各种最近的jar包

    在本压缩包中,包含了Solr的各种最新版本的jar包,这些jar包对于理解和使用Solr至关重要。 1. **Solr核心组件**:Solr的核心组件包括索引库、查询解析器、排序机制、分词器等。索引库是Solr存储数据的地方,采用倒...

    windows版本的单机solr

    Solr支持多种导入工具,如DataImportHandler(DIH),可以方便地从关系型数据库中导入数据。 Solr还提供了一套强大的查询语法,允许你构建复杂的查询条件,实现精确的搜索匹配。同时,它支持多种排序、高亮显示、 ...

    mongodb-solr

    要实现Solr与MongoDB的定时同步,我们可以使用Solr的DataImportHandler(DIH)或者第三方工具如`mongo-solr-sync`。DIH允许Solr从外部数据源导入数据,通过定义数据源和映射,可以将MongoDB中的文档转换为Solr可索引...

    solr深入浅出

    性能调优是Solr使用中的重要环节。这涉及到Schema设计(如哪些字段应被索引,哪些应被存储),配置优化(mergeFactor、缓存设置等),内存管理(防止内存溢出,合理分配JVM内存),以及更新频率和查询响应压缩等方面...

    solr-5.5.5 linux安装包

    3. **导入数据**:使用Solr的DataImportHandler (DIH) 或者通过HTTP接口批量导入数据。 4. **查询数据**:通过Solr的API发送查询请求,获取匹配的结果。 5. **优化索引**:定期执行优化操作,如`optimize`,以提高...

    全文搜索技术solr Demo

    "代码.rar"可能包含了一个示例数据导入工具,通常Solr使用DataImportHandler(DIH)从外部数据库导入数据并建立索引。配置好数据源和映射后,运行`bin/post -c myCollection /path/to/data`命令即可导入数据。 六、...

    solr_3.5_配置及应用

    在《使用 Apache Solr 实现更加灵巧的搜索,第 1 部分 基本特性和 Solr 模式》文档中,你可能会学习到更多关于 Solr 的基础特性,如查询优化、分词器选择、查询分析过程以及如何利用 Solr 的模式设计来提升搜索体验...

    solr6.0+mysql+IK分词集成

    3. **数据同步**:通过Solr的DIH定期或实时从MySQL中抽取数据,更新到Solr索引,实现数据库和搜索索引的同步。 **IK分词器** 1. **IK Analyzer介绍**:IK分词器支持自定义词典,具备动态扩展性,可以处理中文的...

    solr-7.7.3配置详解,跟springboot整合 (二)

    - 在分布式环境中,Solr运行在SolrCloud模式下,使用Zookeeper进行集群管理和状态协调。你需要在`solr.in.sh`或`solr.in.cmd`中配置Zookeeper地址。 4. **数据导入处理程序(DIH)** - DIH允许你从外部数据源导入...

    solr所需要配置的资源.zip

    3. `managed-schema`(在较新版本的Solr中替代了`schema.xml`):这是一个动态管理的模式,允许在运行时添加或修改字段定义,而无需重启Solr。 4. `data-config.xml`(可选):用于配置数据驱动的索引(Data Import...

    solr-4.10.3.tgz

    在你提供的信息中,“solr-4.10.3.tgz”是一个在Linux系统上使用的安装包,但在Windows环境下进行了初步解压。这是因为在Windows上,通常需要使用像7-Zip或WinRAR这样的工具来处理.tar.gz(也被称为tgz)格式的文件...

Global site tag (gtag.js) - Google Analytics