Compass概念:
1:Compass相当于hb的SessionFactory
2:CompassSession相当于hb的Session
3:CompassTransaction相当于hb的transaction。
Compass也是采用CompassConfiguration(装载配置和映射文件)进行创建的。创建Compass时将会链接已经存在的索引或者创建一个新的索引。当Compass创建完后,就可以用compass得到compassSession。compassSession主要是起管理搜索引擎的数据。和hb的SessionFactory一样,compass通常在系统启动时创建,在所有compassSession创建时使用。
当使用CompassSession查询数据时,将会返回CompassHits接口的实例。compassHits可以得到scores,resources和mapped objects.
Compass也提供了CompassTemplate和CompassCallback类处理会话和事务的处理。CompassTemplate template = new CompassTemplate(compass);
为了简化CompassConfiguration的建立,compass提供了CompassConfigurationFactory类来建立CompassConfiguration
CompassConfiguration conf =CompassConfigurationFactory.newConfiguration();
除了通过xml文件设置外,可以通过CompassConfiguration.addXXX方法更改设置,也可以通过CompassSetting来设置。compassSetting和java 的Properties相似。也可以通过CompassEnvironment和LuceneEnvironment类来设置。
Compass中必须设置的项包括:compass.engine.connection。
一个重要的设置方面是组设置。如下面设置一个test的转换器:
org.compass.converter.test.type=eg.TestConverter
org.compass.converter.test.param1=value1
org.compass.converter.test.param2=value2
所有的compass的操作性设置都可以定义在一个配置文件中,文件的名字默认为:compass.cfg.xml,如果取名不一样这在初始化CompassConfiguration时,使用CompassConfiguration.config(fileName)。
因为索引是事务性的。所以在进行操作的过程中,就存在锁的概念。可以设置锁文件的位置,默认为java.io.tmp,<transaction lockDir="/shared/index-lock" />
别名、资源和属性的概念:
资源(Resource):资源表示属性的集合,相当于虚拟文档。一个资源通常和一个别名联系在一起,几个资源可以属于同一个别名。别名担当资源和映射定义的联系角色。属性是指一个键值对。
在OSEM/XSEM中,容易忽视的是资源在何处被使用,因为处理内容都被转换成应用程序的模型或者是xml的结构数据。资源很少被使用。
通过资源和属性,可以采用统一的方式访问相同语义的模型。比如应用程序中有两个模型:学生和教师。我们将学生和教师的名字都设置成相同语义的元数据:name(资源属性名),这样将会允许我们所有的name搜索显示结果在资源层次上。
分析器:该组件主要是预处理输入文本。用于搜索和索引的文本分析上。要求搜索和索引使用相同的分析器。
Compass内置两个分析器名称:default和search。缺省分析器用户没有其它分析器配置时使用。search用于搜索查询的分析。
配置定制的分析器的参数可以通过Setting方式置入:
<analyzer name="deault" type="CustomAnalyzer" analyzerClass="eg.MyAnalyzer">
<setting name="threshold">5</setting>
</analyzer>
分析过滤器:
分析过滤器能够被不同的分析器穿插使用。配置如下:
<analyzer name="deafult" type="Standard" filters="test1, test2" />
<analyzerFilter name="test1" type="eg.AnalyzerTokenFilterProvider1">
<setting name="param1" value="value1" />
</analyzerFilter>
<analyzerFilter name="test2" type="eg.AnalyzerTokenFilterProvider2">
<setting name="paramX" value="valueY" />
</analyzerFilter>
同义处理:同义处理分析过滤器:返回给定词的同义词
<analyzer name="deafult" type="Standard" filters="synonymFilter" />
<analyzerFilter name="synonymFilter" type="synonym">
<setting name="lookup" value="eg.MySynonymLookupProvider" />
</analyzerFilter>
查询分析器:
<queryParser name="test" type="eg.MyQueryParser">
<setting name="param1" value="value1" />
</queryParser>
索引文件的结构:
compass的子索引相当于lucene的一个索引。当compound设置为true时,lucene次采用一个segments文件存储所有索引内容。子索引对事务型操作尤为重要。
compass支持read_committed和serializable、batch_insert级别的事务
compass事务锁用在自索引级别上,这意味着脏操作只发生在各自的子索引上。
compass事务在脏操作(创建,保存,删除)时要求一个锁。搜索时应该只用read only事务。锁超时一般设置为10秒。
<transaction lockTimeout="15" lockPollInterval="200" />
事务隔离:
1:read_committed:当开始该事务时,是不需要锁的。因此速度会快。
2:serializable:和上面一样。只是当事务开始时,对所有的自索引有一个锁。性能降低。
3:batch_insert:使用了lucene提供的快速的批量索引的功能。这个事务操作只支持create操作。如果已经有同名的别名和ids的资源已经存在,那么将会在一个索引中出现两个资源。这种事务是不能回滚的。
FS Transaction Log:存储许多事务数据到文件系统中。
<transaction isolation="read_committed">
<readCommittedSettings>
<fsTransLog path="/tmp" readBufferSize="32" writeBufferSize="4098" />
</readCommittedSettings>
</transaction>
常量子索引hash:
影射别名到子索引的最简单办法是将某个别名的所有的可搜索内容索引到相同的子索引里面。如:
<compass-core-mapping>
<[mapping] alias="test-alias" sub-index="test-subindex">
<!-- ... -->
</[mapping]>
</compass-core-mapping>
test-alias将会影射所有的实例到test-subindex子索引中。如果sub-index没有定义,则将缺省为alias。
Modulo Sub Index Hashing:允许将一个别名代表的实例索引到不同的子索引中。根据给定的大小对索引进行分割。文件名是给定的前缀+“_"+数字。
<compass-core-mapping>
<[mapping] alias="A">
<sub-index-hash type="org.compass.core.engine.subindex.ModuloSubIndexHash">
<setting name="prefix" value="test" />
<setting name="size" value="2" />
</sub-index-hash>
<!-- ... -->
</[mapping]>
</compass-core-mapping>
会产生[test_0]和[test_1]两个子索引文件。
Custom Sub Index Hashing:
ConstantSubIndexHash 和 ModuloSubIndexHash都实现了compass的SubIndexHash接口。定制子索引hash必须实现getSubIndexes和mapSubIndex(String alias,Property[] ids)两个方法。
Optimizers:优化器,每个脏操作提交成功都会在各自的子索引中产生另一个segment,子索引中的segment越多,搜索操作就越慢,因此保持索引优化,控制segment的数量很重要。要做的就是合并小segment到大的segment 。
索引优化器在子索引级别执行。在优化的过程中,优化器将锁定子索引,以便于脏操作。
调度优化:compass的每一个优化器都能包装为调度方式执行。
<optimizer scheduleInterval="90" schedule="true" />
Aggressive Optimizer:通过设置segments的大小,当达到指定的大小时,将所有的segement合并到一个segment。这样搜索的效率最高。
Adaptive Optimizer:和Aggressive Optimizer不同的是,该优化器只合并新的小segment。
Null Optimizer:不做任何优化。当做batch_insert事务时,离线创建索引或已经全部优化索引,一般使用它。
直接访问Lucene:compass提供了LuceneHelper类,该类可以直接访问lucene的api。
posted on 2006-12-01 16:38
不做浮躁的人 阅读(2729)
评论(0) 编辑 收藏