博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
企业搜索引擎开发之连接器connector(三十)
阅读量:6414 次
发布时间:2019-06-23

本文共 3413 字,大约阅读时间需要 11 分钟。

连接器里面采用的什么样的数据结构,我们先从Document迭代器开始入手,具体的Document迭代器类都实现了DocumentList接口,该接口定义了两个方法

public interface DocumentList {  public Document nextDocument() throws RepositoryException;  public String checkpoint() throws RepositoryException;}

前者用于获取Document对象,后者获取断点状态

上文中分析的DiffingConnectorDocumentList类即实现了DocumentList接口,从List<CheckpointAndChange> guaranteedChanges集合的迭代器中迭代获取CheckpointAndChange对象然后包装为Document类型对象

Document也是一接口类型

public interface Document {  public Property findProperty(String name) throws RepositoryException;  public Set
getPropertyNames() throws RepositoryException;}

从Document接口定义的方法可以看出,Document接口类似于Map容器结构,如果进一步考察String类型的key对应的value类型Property,可以发现Document接口很类似于HashMap结构

public interface Property {  public Value nextValue() throws RepositoryException;}

下面继续考察Document接口的具体实现类,以JsonDocument类说明: 

/** *省略了其他部分成员属性及方法 * A simple {
@link Document} implementation created from a {
@link JSONObject}. */public class JsonDocument implements Document { private final Map
> properties;/** * Constructor used by {
@link DBHandle} when deserializing a * {
@code DocumentHandle} from the recovery file. */ public JsonDocument(JSONObject jsonObject) { this(buildJsonProperties(jsonObject), jsonObject); } /** * Constructor used by the {
@link DocumentBuilder} for creating a * {
@link JsonDocument} object used by {
@link RepositoryHandler} * for building a collection over JsonDocument. */ public JsonDocument(Map
> properties, JSONObject jsonObject) { this.properties = properties; this.jsonObject = jsonObject; objectId = getSingleValueString(SpiConstants.PROPNAME_DOCID); if (Strings.isNullOrEmpty(objectId)) { throw new IllegalArgumentException( "Unable to parse for docID from the properties:" + properties); } }@Override public Set
getPropertyNames() { return properties.keySet(); } @Override public Property findProperty(String name) throws RepositoryException { List
property = properties.get(name); if (name.equals(SpiConstants.PROPNAME_CONTENT) && filterMimeType()) { property = null; } return (property == null) ? null : new SimpleProperty(property); }}

JsonDocument类还有什么好说的呢,内部实际是对Map<String, List<Value>> properties的封装

属性类型SimpleProperty实现了Property接口

/** * Simple implementation of the {
@link Property} interface. * Implementors may use this directly or for reference. * * @since 1.0 */public class SimpleProperty implements Property { final Iterator
iterator; /** * Constructs a property with a single value. * * @param value the property's {
@link Value} * @since 2.4 */ public SimpleProperty(Value value) { this(Collections.singletonList(value)); } /** * Constructs a property with multiple values. * * @param values a {
@code List} of the property's {
@link Value Values} */ public SimpleProperty(List
values) { this.iterator = values.iterator(); } @Override public Value nextValue() { return (iterator.hasNext()) ? iterator.next() : null; }}

成员属性final Iterator<Value> iterator保存值的迭代器,功能与HashMap的entry链表类似

---------------------------------------------------------------------------

本系列企业搜索引擎开发之连接器connector系本人原创

转载请注明出处 博客园 刺猬的温驯

本人邮箱: chenying998179@163#com (#改为.)

本文链接  

你可能感兴趣的文章
高效前端优化工具--Fiddler入门教程
查看>>
【翻译】我钟爱的HTML5和CSS3在线工具
查看>>
Java多线程学习(吐血超详细总结)
查看>>
css3 变形
查看>>
Win7 64bit 安装Mysql5 出错 无法启动服务。
查看>>
嵌入式 H264参数语法文档: SPS、PPS、IDR以及NALU编码规律
查看>>
初识Opserver,StackExchange的监控解决方案
查看>>
给大家讲解一下JavaScript与后台Java天衣无缝相结合
查看>>
探索HTML5之本地文件系统API - File System API
查看>>
javascript有用代码块(1)
查看>>
libevent 笔记
查看>>
PHP实现人人OAuth登录和API调用
查看>>
redis源码笔记 - initServer
查看>>
FindBugs工具常见问题
查看>>
ECSHOP报错误Deprecated: preg_replace(): The /e modifier is depr
查看>>
【iOS】iOS之Button segue弹出popOver消除(dismiss)问题
查看>>
java多线程系列5-死锁与线程间通信
查看>>
数据库分库分表
查看>>
腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...
查看>>
小程序模板嵌套以及相关遍历数据绑定
查看>>