solr 之 实体处理器(不懂)

yProcessor(实体处理器)

默认的情况下,每个实体都会被sqlEntityProcessor处理。在系统 使用RDBMS作为数据源的时候,它很适用。对于其他的数据源,例如 REST 或者不是sql的数据源 ,你可以选择 继承org.apache.solr.handler.dataimport.Entityprocessor. 这个抽象类。它被设计成从实体中一行一行的读取数据。最简单的实现自己的实体处理器的方式是 继承EntityProcessorBase ,然后重写方法 public Map nextRow()method。 'EntityProcessor'依赖于 数据源来获取数据。数据源的返回类型对实体处理器来说是很重要的。下面是一些内嵌的实体处理器。

SqlEntityProcessor

它是默认的,数据源必须是DataSource类型的,在这里默认的情况下使用的是jdbcDataSource。

XPathEntityProcessor

处理XML类型的数据源。数据源的类型必须是DataSource类型的,这种类型的数据源有HttpDataSource和FileDatasource类型。

FileListEntityProcessor

简单的处理器,它能够从文件系统中得到文件的集合。这个系统基于一些标准,它不使用数据源,下面是实体的属性:

  • fileName :(必须) 辨别文件的正则表达式

  • baseDir : (必须) 根目录(虚拟路径)

  • recursive : 是否要递归的获取文件,默认是false。

  • excludes : 匹配文件名的正则表达式

  • newerThan : 一个数字参数 . 使用格式 (yyyy-MM-dd HH:mm:ss) . 它可以是一个datemath 类型的字符串,例如:('NOW-3DAYS'). 需要加单引号。它也可以是一个变量,像${var.name}这样。

  • olderThan : 一个数字参数 . 跟上一条的规则是一样的

  • rootEntity :根实体的值必须是false,除非你想索引文件名。位置直接在下面的是根实体,这就意味着根实体产生的行都将被当成一个document存放在lucene里面。但是,在这个例子里面,我们并不想为每个文件建立一个 document,我们想对x实体产生的行建立document,因为实体f的属性rootEntiry等于false,所以在直接位于实体f下面的实体将成为根实体,它所产生的行将会被当成一个document。

  • dataSource :它必须被设为null值,因为这里并不需要使用任何的数据源,即是说,我们将不会创建Datasource的实例。(在大多数的情况下,只有一个数据源,jdbc数据源,所有的实体都用,在这里,数据源是没有必要的。)

例子:

<dataConfig>
    <dataSource type="FileDataSource" />
    <document>
        <entity name="f" processor="FileListEntityProcessor" fileName=".*xml" newerThan="'NOW-3DAYS'" recursive="true" rootEntity="false" dataSource="null">
            <entity name="x" processor="XPathEntityProcessor" forEach="/the/record/xpath" url="${f.fileAbsolutePath}">
                <field column="full_name" xpath="/field/xpath"/> 
            </entity>
        </entity>
    <document>
<dataConfig>

千万要注意rootEntiry这个属性,由这个处理器所产生的域有fileAbsolutePath,fileSize,fileLastModified,fileName.

CachedSqlEntityProcessor

应该说,这是SqlEntityProcessor的一个扩展,这个处理器通过缓存一些行,来减少数据库查询。它几乎对根实体没有用,因为这个实体中只有一个sql语句被执行了。

Example 1.

<entity name="x" query="select * from x">
    <entity name="y" query="select * from y where xid=${x.id}" processor="CachedSqlEntityProcessor">
    </entity>
<entity>

这个例子的用法跟下面的是一样的,一个查询被执行完,它的结果被存储起来,下次这个查询再被执行的的时候,它将会从缓存中取出结果并返回。

Example 2:

<entity name="x" query="select * from x">
    <entity name="y" query="select * from y" processor="CachedSqlEntityProcessor"  where="xid=x.id">
    </entity>
<entity>

这个例子跟前一个的区别在于属性‘where’。这个例子中,查询语句将从表中取回所有的数据,并把他们都放在缓存中。其中的关键就在域 属性‘where’。缓存使用y中的xid作为键值,实体被查询的时候x.id的值就会被计算出来,我们首先会在缓存中找匹配的数据,接着返回。

 

在属性where中,=号之前的值是y中的列,=号之后的值是计算出来的要在缓存中查找的值。

posted @ 2014-12-08 09:06  清晰-模块-组合-优化  阅读(443)  评论(0编辑  收藏  举报