solr中filelistentityprocessor处理器怎么生成<field >

solr中filelistentityprocessor处理器怎么生成<field >,第1张

以下资料整理自网络,以及查看solr帮助文档。主要分为两部分,第一部分是对《db-data-config.xml》的配置内容的讲解(属于高级内容),第二部分是DataImportHandler(属于基础),第三部分是对db-data-config.xml的进阶第一部分是对《db-data-config.xml》query是获取全部数据的SQLdeltaImportQuery是获取增量数据时使用的SQLdeltaQuery是获取pk的SQLparentDeltaQuery是获取父Entity的pk的SQLFullImport工作原理:执行本Entity的Query,获取所有数据;针对每个行数据Row,获取pk,组装子Entity的Query;执行子Entity的Query,获取子Entity的数据。DeltaImport工作原理:查找子Entity,直到没有为止;执行Entity的deltaQuery,获取变化数据的pk;合并子EntityparentDeltaQuery得到的pk;针对每一个pkRow,组装父Entity的parentDeltaQuery;执行parentDeltaQuery,获取父Entity的pk;执行deltaImportQuery,获取自身的数据;如果没有deltaImportQuery,就组装Query限制:子Entity的query必须引用父Entity的pk子Entity的parentDeltaQuery必须引用自己的pk子Entity的parentDeltaQuery必须返回父Entity的pkdeltaImportQuery引用的必须是自己的pk第二部分是DataImportHandler关于DataImportHandler的具体使用方法,详见下文,如果你英文超级好,那看这个链接吧:dataimport使用“完全导入”命令将数据从数据库中导出,并提交给solr建立索引使用“增量导入”命令对数据库发生的变化的数据导出,并提交给solr建立索引。配置数据源将dataSource标签直接添加到dataConfig下面,即成为dataConfig的子元素.数据源也可以配置在solrconfig.xml中属性type指定了实现的类型。它是可选的。默认的实现是JdbcDataSource。属性name是datasources的名字,当有多个datasources时,可以使用name属性加以区分其他的属性都是随意的,根据你使用的DataSource实现而定。当然你也可以实现自己的DataSource。多数据源一个配置文件可以配置多个数据源。增加一个dataSource元素就可以增加一个数据源了。name属性可以区分不同的数据源。如果配置了多于一个的数据源,那么要注意将name配置成唯一的。例如:然后这样使用........配置JdbcDataSourceJdbcDataSource中的属性有driver(必需的):jdbc驱动名称url(必需的):jdbc链接user:用户名password:密码批量大小:jdbc链接中的批量大小任何其他的在JdbcDataSource中配置的属性,都会被直接传给jdbcdriver配置data-config.xmlsolrdocument是schema,它的域上的值可能来自于多个表.data-config.xml的根元素是document。一个document元素代表了一种文档。一个document元素中包含了一个或者多个root实体。一个root实体包含着一些子实体,这些子实体能够包含其他的实体。实体就是,关系数据库上的表或者视图。每个实体都能够包含多个域,每个域对应着数据库返回结果中的一列。域的名字跟列的名字默认是一样的。如果一个列的名字跟solrfield的名字不一样,那么属性name就应该要给出。其他的需要的属性在solrschema.xml文件中配置。为了能够从数据库中取得想要的数据,我们的设计支持标准sql规范。这使得用户能够使用他任何想要的sql语句。root实体是一个中心表,使用它的列可以把表连接在一起。dataconfig的结构dataconfig的结构不是一成不变的,entity和field元素中的属性是随意的,这主要取决于processor和transformer。以下是entity的默认属性name(必需的):name是唯一的,用以标识entityprocessor:只有当datasource不是RDBMS时才是必需的。默认值是SqlEntityProcessortransformer:转换器将会被应用到这个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.

提升软件性能,通常喜欢去调整各种启动参数,这没有多大意义,小伎俩。性能优化要从架构和策略入手,才有可能得到较大的收益Solr的查询是基于Field的,以Field为基本单元,例如一个文章站要索引classArticle{StringtitleStringcontentStringtags}查询参数:q=title:big&&content:sixSolr会顺序执行两次field查询,这个开销非常大。实际例子:50万条记录,一次在6,7个字段上检索,24core的服务器也需要10-20ms如果把title和content合并,那只需要查询一次,性能可以提升50%在生成索引xml的时候,把title和content填入同一个字段,就能达到这种效果,但是产生新的问问题无法对title和content的查询分别指定权重了,一般来说,title的权重要高于contentSolr给出一种解决方法:在schema中使用copyField上述的ArticleSchema可以写成如下这种格式,就能达到效果这种schema定义方式,既可以对单个field指定查询权重,也可以在泛查询的时候提升性能,同时生成索引数据的时候不需要多写任何代码

下面看看其实现原理:

和solr的写入document相关的两个类是SolrInputDocument 和SolrInputField,其中SolrInputDocument 是和整条document有关,SolrInputField 是和field相关(属性包含field的名称,值和boost值)。

SolrInputDocument 类中和document添加的方法主要有addField 和setField,其中setField是覆盖前面的value,addField是追加value.

看看其具体实现:

public SolrInputDocument() {

_fields = new LinkedHashMap <String,SolrInputField>()// 通过构造方法构建一个map,value是SolrInputField

}

private final Map<String,SolrInputField>_fields

public void addField(String name, Object value, float boost ) //addFiled的方法中,参数value是个object

SolrInputField field = _fields.get( name )// name是指field的名称,value是指field的值,判断map中是否已经有这个field的信息

if( field == null || field.value == null ) { // 如果filed或者filed value为空,就用本类的setField(即第一次添加有效地值,类似于overwrite)


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

原文地址:https://54852.com/bake/11418487.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存