首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate Search惯用注解总结

2012-09-01 
Hibernate Search常用注解总结1. @Indexed? - index 指定索引名称?2. @Field? - name 指定当前属性在Luc

Hibernate Search常用注解总结

1. @Indexed

? -> index 指定索引名称

?

2. @Field

? -> name 指定当前属性在Lucene Document中存储的名称,默认为属性名

? -> store 指定当前属性是否被存储在Lucene index中,可选值为:

? ? ?1) Store.YES ?占用大量的索引空间,支持"投影(projection)"

? ? ?2) Store.COMPRESS 压缩方式,消耗大量CPU

? ? ?3) Store.NO (default)

? -> index 指定元素索引方式和信息存储类型,可选值为:

? ? ?1) Index.NO 不索引,只有通过设置store才可以访问其内容

? ? ?2) Index.TOKENIZED (default) 使用analyzer

? ? ?3) Index.UN_TOKENIZED 不使用analyzer

? ? ?4) Index.NO_NORMS (advanced)

? ? ?是否采用分词可依据,是要查询数据本身还是它所包含的内容(文字);

? ? ?用来排序的域不需要分词。

? -> termVector 检索统计信息

? ? ?1) TermVector.YES

? ? ?2) TermVector.NO (default)

? ? ?3) TermVector.WITH_OFFSETS

? ? ?4) TermVector.WITH_POSITIONS

? ? ?5) TermVector.WITH_POSITION_OFFSETS

? -> indexNullAs

? ? ?1) Field.DO_NOT_INDEX_NULL

? ? ? ?通过hibernate.search.default_null_token指定,默认为_null_

? ? ? ?查询时使用相同的分词来查找空值,建议Index.UN_TOKENIZED时使用

? ? ?2) Field.DEFAULT_NULL_TOKEN (default)

? -> boost 用法形如:boost=@Boost(2f),详见@Boost

-------------------------------------------------------------------------Stored ?Indexed ?Tokenized? ?Y ? ? ? Y ? ? ? ? N ? ? ?适合原始值需要保持原样的字段,如URL、文件系统路径、日期、个人名称、电话号码等;? ?Y ? ? ? N ? ? ? ? N ? ? ?适合需要和搜索结果一起显示的字段,但从不直接搜索它的值,如URL或数据库主键;? ?N ? ? ? Y ? ? ? ? Y ? ? ?适合索引大量的文本而不需要以原始形式重新获得它,如网页主题或各种文本文档;-------------------------------------------------------------------------
3. @NumericField? @Field的联合注解,用于Integer, Long, Float和Double属性,索引时采用字典树结构(Trie structure).? Lucene将此API标记为experimental,未来版本未必支持。Hibernate Search将尽量掩盖底层的API变化,但也未必能有效保证。? -> forField? -> precisionStep (default值4)
4. @DocumentId? 用于保证索引实体的单一性。必须存储而且必须不能被分词(相当于加了@Field(store=Store.YES, index=Index.UN_TOKENIZED))? 采用JPA方式时,如果指定了@Id则不再需要标注该注解。
5. @Fields? 同一个域采用不同的索引策略。需要为每个Field指定name属性(非强制).? 当使用@Fields时,@Field将支持两个有用的属性:? ? -> analyzer 为每个field定义@Analyzer而非为属性定义? ? -> bridge ?每个field定义@FieldBridge而非为属性定义
6. @IndexedEmbedded? 对象有组合关系时使用。? ?-> depth 关联的深度,存在循环的依赖时使用。? ?-> prefix 索引fields的前缀,默认为"属性名.",如address.city中的"address."? ?-> targetElement 被标注的域不是实际对象类型(如声明类型为接口)时使用,用来指定实际对象类型? ? 1) 关联对象会自动被设为@Indexed? ? 2) 相当于在当前实体对应的Document下创建一个或多个名为"前缀+被组合实体中标注了@Field的域"的Field? ? 3) 对集合、Map、对象数组同样生效? ? 4) 成本很高,尽量不要过多的使用该注解
7. @ContainedIn? 双相关联的对象中,另一方配合@IndexedEmbedded使用,保证Lucene document的联动更新。? 当前类被用JPA方式标注为@Embeddable时不需要使用@ContainedIn
8. @Boost? 静态索引加速。与被索引实体的运行时状态无关。? ? 1) 可用在@Field的boost属性中、方法级、类级? ? 2) 不同方式指出的加速系数会累积,不能重复使用。如? ? ? ? ?@Field(boost=@Boost(1.5f))? ? ? ? ?@Boost(2f)? ? ? ? ?public String getSummary() { return summary; }? ? ? ?则summary系数为3,比普通域重要3倍? ? 3) 提升因数的指定并非精确的,可用来标注相对重要的实体或域。
9. @DynamicBoost? 动态索引加速。? -> impl 指定具体的加速策略实现类? ? 1) 用于class或field级别? ? 2) 使用该标注时,需要自定义加速策略类并实现BoostStrategy接口:? ? ? ? ?public interface BoostStrategy {? ? ? ? ? ?public float defineBoost(Object value);? ? ? ? ?}? ? ? ?value是被标注的类型实例或属性值。? ? 3) 可以和@Boost混合使用
10. @Analyzer? -> impl 指定具体的Analyzer实现类? -> definition 指向@AnalyzerDef标注中name属性定义的值? * 类方式:? ? ?1) 可以作用于实体、属性甚至每个域? ? ?2) 同一实体中使用不同的混合的Analyzer通常是一种坏的做法,尤其是在使用QueryParser查询时? ? ?3) 必须保证在同一域上,索引和查询使用的是同一个Analyzer.
11. @AnalyzerDef? Hibernate Search采用Solr framework做分词。? 版本3.3.0.Beta2之前需添加Solr依赖,之后被囊入org.hibernate:hibernate-search-analyzers中? -> name (Required) 定义该分词器的唯一字符串? -> charFilters (Optional) 负责对分词前的输入流预处理? -> tokenizer (Required) 负责拆分输入流为单词或单字? -> filters (Optional) 负责对分词后的输入流做一些额外处理? 通过@AnalyzerDef声明的Analyzer实例可以在SearchFactory中得到:? ? Analyzer analyzer = fullTextSession.getSearchFactory().getAnalyzer("customanalyzer");
12. @CharFilterDef? 定义CharFilter,一般配合@AnalyzerDef使用。? -> factory? -> params13. @TokenizerDef? 定义Tokenizer,一般配合@AnalyzerDef使用。? -> factory? -> params14. @TokenFilterDef? 定义TokenFilter,一般配合@AnalyzerDef使用。? -> factory? -> params
15. @DateBridge? 日期型存储格式为 yyyyMMddHHmmssSSS? -> resolution? ? ?1) Resolution.DAY? ? ?2) Resolution.HOUR? ? ?3) Resolution.MILLISECOND? ? ?4) Resolution.MINUTE? ? ?5) Resolution.MONTH? ? ?6) Resolution.SECOND? ? ?7) Resolution.YEAR
16. @FieldBridge? -> impl 所使用Bridge的实现类名,该实现类需实现以下接口之一,且所有实现必须是线程安全的:? ? 1) StringBridge? ? ? ? ?最简单的Bridge,作用于普通的field/getter/class? ? ? ? ?需要实现objectToString(Object object)方法,以便自定义对象到String的转换过程? ? 2) TwoWayStringBridge? ? ? ? ?作用于: 1.标注了@DocumentId的属性(通常为id属性)? ? ? ? ? ? ? ? ?2.需要从index中读回的属性? ? ? ? ?需要提供双向转换,且object = stringToObject(objectToString(object))要成立? ? 3) FieldBridge? ? ? ? ?可灵活操作Lucene Document.例如需要对日期分年、月、日存储在3个field时.? ? ? ? ?需要实现set(String name,Object value,Document document,LuceneOptions luceneOptions)方法? ? 可选接口:? ? ? ?ParameterizedBridge 用来获得参数? ? ? ?AppliedOnTypeAwareBridge 用来获得被标注为@FieldBridge的类型? -> params?
17. @ClassBridge? 用于一个实体对应的多个属性的联合索引,且该索引通常需要采用一种特殊的索引方式? -> impl? -> name? -> store? -> analyzer? -> index? -> termVector? -> boost? -> params

热点排行