solr 有几种导入数据的方式

solr 有几种导入数据的方式,第1张

solr数据导入,经过这几天的查资料,我觉得solr数据导入可以有三种方式:

1、编写数据xml文件,通过post.jar导入;

2、通过DIH导入;

3、利用solrj导入数据;

现针对第三种方式进行研究,在第一步中写了一段小的测试代码,可以参考:http://wiki.apache.org/solr/Solrj#Streaming_documents_for_an_update

具体的代码解释如下:

String url = "http://localhost:8080/solr"

HttpSolrServer server = new HttpSolrServer(url)

//If you wish to delete all the data from the index, do this

//server.deleteByQuery( "*:*" )

//Construct a document

SolrInputDocument doc1 = new SolrInputDocument()

doc1.addField( "id", "id1_solrj" )

doc1.addField( "type", "doc1_solrj" )

doc1.addField( "name", "name1_solrj" )

//Construct another document

SolrInputDocument doc2 = new SolrInputDocument()

doc2.addField( "id", "id2" )

doc2.addField( "type", "doc2_solrj" )

doc2.addField( "name", "name2_solrj" )

//Create a collection of documents

Collection<SolrInputDocument>docs = new ArrayList<SolrInputDocument>()

docs.add(doc1)

docs.add(doc2)

//Do a commit

try {

server.add(docs)

server.commit()

} catch (SolrServerException e) {

System.out.println("server commit error, error code:")

e.printStackTrace()

} catch (IOException e) {

System.out.println("server commit error, error code:")

e.printStackTrace()

}

}

该端代码执行后报异常:expect mime type application/octet-stream but got text/html

没找到这个的解决办法,根据提示好像是说期望的类型和服务器反馈的类型不匹配

最后的解决办法是这样的:

之前在配置solr服务器的时候将solr解压路径\solr-4.8.1\example\solr下的solr.xml用\solr-4.8.1\example\multicore下的solr.xml文件进行了替换,目的是为了引入core0和core1,现在需要将这个动作进行回滚,并且修改collection1下的conf下的schema.xml文件,修改为对应的需要的列定义。然后执行以上的代码就不会产生问题。

原因我也不太明白,感觉应该是collection1的配置和core1、core0、乃至之前文章提到过的solrtest的配置应该不太一样。原因待查。不过现在已经可以通过客户端的方式将数据导入solr服务器,并在前端可以查询到相应的数据。

1.查询性能不同。当实时建立索引的时候,solr会产生io阻塞,而es则不会,es查询性能要高于solr

2.检索效率不同。在不断动态添加数据的时候,solr的检索效率会变的低下,而es则没有什么变化

3.管理方式不同。Solr利用zookeeper进行分布式管理,而es自身带有分布式系统管理功能。Solr一般都要部署到web服务器上

4.文件格式不同。Solr支持更多的格式数据[xml,json,csv等],而es仅支持json文件格式

以下资料整理自网络,以及查看solr帮助文档。主要分为两部分,第一部分是对《db-data-config.xml》的配置内容的讲解(属于高级内容),第二部分是DataImportHandler(属于基础),第三部分是对db-data-config.xml的进阶

第一部分是对《db-data-config.xml》

query是获取全部数据的SQL

deltaImportQuery是获取增量数据时使用的SQL

deltaQuery是获取pk的SQL

parentDeltaQuery是获取父Entity的pk的SQL

Full

Import工作原理:

执行本Entity的Query,获取所有数据;

针对每个行数据Row,获取pk,组装子Entity的Query;

执行子Entity的Query,获取子Entity的数据。

Delta

Import工作原理:

查找子Entity,直到没有为止;

执行Entity的deltaQuery,获取变化数据的pk;

合并子Entity

parentDeltaQuery得到的pk;

针对每一个pk

Row,组装父Entity的parentDeltaQuery;

执行parentDeltaQuery,获取父Entity的pk;

执行deltaImportQuery,获取自身的数据;

如果没有deltaImportQuery,就组装Query

限制:

子Entity的query必须引用父Entity的pk

子Entity的parentDeltaQuery必须引用自己的pk

子Entity的parentDeltaQuery必须返回父Entity的pk

deltaImportQuery引用的必须是自己的pk

第二部分是DataImportHandler

关于DataImportHandler的具体使用方法,详见下文,如果你英文超级好,那看这个链接吧:http://wiki.apache.org/solr/DataImportHandler

大多数的应用程序将数据存储在关系数据库、xml文件中。对这样的数据进行搜索是很常见的应用。所谓的DataImportHandler提供一种可配置的方式向solr导入数据,可以一次全部导入,也可以增量导入。

概览

目标

能够读取关系数据库中的数据。

通过可配置的方式,能够将数据库中多列、多表的数据生成solr文档

能够通过solr文档更新solr

提供 通过配置文件就能够导入所有数据的能力

能够发现并处理

由insert、update带来的变化(我们假定在表中有一个叫做“last-modified的列”)

能够配置 “完全导入”和“增量导入”的时间

让读取xml文件,并建立索引成为可配置。

能够将

其他的数据源(例如:ftp,scp,etc)或者其他格式的文档(Json,csv)以插件的形式集成到项目中。

设计思路

这个Handler首先要在solrconfig.xml文件中配置下,如下所示。

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">

<lst name="defaults">

<str name="config">/home/username/data-config.xml</str>

</lst>

</requestHandler>

从它的名字上,我们或许也可以猜到,

DataImportHandler正是requestHandler的实现。我们一共需要在两个地方配置文件中进行一些配置。

solrconfig.xml 。

data-config.xml必须在这个文件中配置,datasource也可以。不过,一般将datasource放在data-config.xml文件中。

data-config.xml

怎样获取数据?(查询语句、url等等)

要读什么样的数据(关系数据库中的列、或者xml的域)

做什么样的处理(修改/添加/删除)

跟关系数据库一起使用

下面几个步骤是必要的.

定义一个data-config.xml 文件,并这个它的路径配置到solrconfig.xml

中关于DataImportHandler的配置中。

给出Connection的信息(假设你选择在solrconfig中配置datasource)

打开DataImportHandler页面去验证,是否该配置的都配置好了。http://localhost:8983/solr/dataimport

使用“完全导入”命令将数据从数据库中导出,并提交给solr建立索引

使用“增量导入”命令对数据库发生的变化的数据导出,并提交给solr建立索引。

配置数据源

将dataSource标签直接添加到dataConfig下面,即成为dataConfig的子元素.

<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/dbname" user="db_username" password="db_password"/>

数据源也可以配置在solrconfig.xml中

属性type 指定了实现的类型。它是可选的。默认的实现是JdbcDataSource。

属性 name 是datasources的名字,当有多个datasources时,可以使用name属性加以区分

其他的属性都是随意的,根据你使用的DataSource实现而定。

当然 你也可以实现自己的DataSource。

多数据源

一个配置文件可以配置多个数据源。增加一个dataSource元素就可以增加一个数据源了。name属性可以区分不同的数据源。如果配置了多于一个的数据源,那么要注意将name配置成唯一的。

例如:

<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"/>

然后这样使用 ..

<entity name="one" dataSource="ds-1" ...>

..

</entity>

<entity name="two" dataSource="ds-2" ...>

..

</entity>

..

配置JdbcDataSource

JdbcDataSource中的属性有

driver(必需的):jdbc驱动名称

url(必需的):jdbc链接

user:用户名

password:密码

批量大小:jdbc链接中的批量大小

任何其他的在JdbcDataSource中配置的属性,都会被直接传给jdbc

driver

配置data-config.xml

solr

document是schema,它的域上的值可能来自于多个表.

data-config.xml的根元素是document。一个document元素代表了一种文档。一个document元素中包含了一个或者多个root实体。一个root实体包含着一些子实体,这些子实体能够包含其他的实体。实体就是,关系数据库上的表或者视图。每个实体都能够包含多个域,每个域对应着数据库返回结果中的一列。域的名字跟列的名字默认是一样的。如果一个列的名字跟solr

field的名字不一样,那么属性name就应该要给出。其他的需要的属性在solrschema.xml文件中配置。

为了能够从数据库中取得想要的数据,我们的设计支持标准sql规范。这使得用户能够使用他任何想要的sql语句。root实体是一个中心表,使用它的列可以把表连接在一起。

dataconfig的结构

dataconfig的结构不是一成不变的,entity和field元素中的属性是随意的,这主要取决于processor和transformer。

以下是entity的默认属性

name(必需的):name是唯一的,用以标识entity

processor:只有当datasource不是RDBMS时才是必需的。默认值是SqlEntityProcessor

transformer:转换器将会被应用到这个entity上,详情请浏览transformer部分。

pk:entity的主键,它是可选的,但使用“增量导入”的时候是必需。它跟schema.xml中定义的uniqueKey没有必然的联系,但它们可以相同。

rootEntity:默认情况下,document元素下就是根实体了,如果没有根实体的话,直接在实体下面的实体将会被看做跟实体。对于根实体对应的数据库中返回的数据的每一行,solr都将生成一个document。

一下是SqlEntityProcessor的属性

query (required) :sql语句

deltaQuery : 只在“增量导入”中使用

parentDeltaQuery : 只在“增量导入”中使用

deletedPkQuery : 只在“增量导入”中使用

deltaImportQuery : (只在“增量导入”中使用) .

如果这个存在,那么它将会在“增量导入”中导入phase时代替query产生作用。这里有一个命名空间的用法${dataimporter.delta.}详情请看solr1.4.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11725608.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存