日期:2014-05-16  浏览次数:20400 次

senseidb中对zoie的整合
com.senseidb.conf.SenseiServerBuilder.buildCore()方法中开始对zoie进行实例化:

1 构建ZoieConfig实例:
ZoieConfig会设置Analyzer, Similarity实例,这些基本的lucene对象可以在sensei配置文件中自定义。设置batchSize, batchDelay, maxBatthSize, rtIndexing, skipBadRecord, freshness等属性也是在sensei配置中可配的。

2. 构建SenseiZoieFactory
sensei自己实现了一个默认的解释器,实现了ZoieIndxableInterpreter(用于把DataProvider产生的DataEvent转换成lucene Document)

调用constructZoieFactory方法创建SenseiZoieFactory实例:
private SenseiZoieFactory<?> constructZoieFactory(
ZoieConfig zoieConfig,
List<FacetHandler<?>> facetHandlers,
List<RuntimeFacetHandlerFactory<?, ?>> runtimeFacetHandlerFactories,
ZoieIndexableInterpreter interpreter) {
2.1
sensei自己实现了一个默认的IndexReader包装器
SenseiIndexReaderDecorator decorator = new SenseiIndexReaderDecorator(facetHandlers, runtimeFacetHandlerFactories);
这个装饰器整合了linkedIn另一个开源项目Bobo. Bobo提供一中结构化的模式来对索引进行查询。

2.2
构建SenseiZoieSystemFacotry实例
SenseiZoieSystemFactory senseiZoieFactory = new SenseiZoieSystemFactory(idxDir, dirMode, interpreter, decorator, zoieConfig);
idxDir是索引所在的目录
dirMode是目录类型,默认是simple

2.3
实例化一个lucene的Filter实例purgeFilter, 过滤器,是根据时间进行过滤。同样是可配的

2.4
可选的IndexCopier,可能用来实现索引备份的。?
}

3. 在实例化SenseiCore的时候,会传递SenseiZoieSystemFactory实例



SenseiCore在启动的时候,会根据所在node的partition数量,建立相对应的IndexDirecory,每个目录,都有一个Zoie实例进行管理。
for (int part : _partitions){
Zoie<BoboIndexReader,?> zoieSystem = _zoieFactory.getZoieInstance(_id,part);
...
}
所以在sensei.properties中指定的索引目录只是一个父目录,sensei会根据nodeId和partitionId进行子目录,子索引管理。

Sensei会注册每个Zoie实例,通过JMS进行通信。

	public void start() throws Exception {
		if (_started)
			return;
		for (int part : _partitions) {

			Zoie<BoboIndexReader, ?> zoieSystem = _zoieFactory.getZoieInstance(
					_id, part);

			// register ZoieSystemAdminMBean

			String[] mbeannames = zoieSystem.getStandardMBeanNames();
			for (String name : mbeannames) {
				JmxUtil.registerMBean(zoieSystem.getStandardMBean(name),
						"zoie-name", name + "-" + _id + "-" + part);
			}

			if (!zoieSystems.contains(zoieSystem)) {
				zoieSystem.start();
				zoieSystems.add(zoieSystem);
			}

			_readerFactoryMap.put(part, zoieSystem);
		}
		try {
			pluggableSearchEngineManager.start(this);
			logger.info("initializing index manager...");
			if (_indexManager != null) {
				_indexManager.initialize(_readerFactoryMap);
			}
			logger.info("starting index manager...");
			if (_indexManager != null) {
				_indexManager.start();
			}

			logger.info("index manager started...");
		} catch (Exception e) {
			logger.error(
					"Unable to start indexing manager, indexing not started...",
					e);
		}
		_started = true;
	}