- 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 不存储正常化数据
- 是否采用分词可依据,是要查询数据本身还是它所包含的内容(文字);
- 用来排序的域不需要分词。
- -> 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
- 3. @NumericField
- @Field的联合注解,用于Integer, Long, Float和Double属性,索引时采用字典树结构(Trie structure).
- Lucene将此API标记为experimental,未来版本未必支持。Hibernate Search将尽量掩盖底层的API变化,但也未必能有效保证。
- -> forField
- -> precisionStep (default值4)
- 4. @DocumentId
- 用于保证索引实体的单一性。必须存储而且必须不能被分词。采用JPA方式时,如果指定了@Id则不再需要标注该注解。
- 5. @Fields
- 同一个域采用不同的索引策略。需要为每个Field指定name属性(非强制).
- 当使用@Fields时,@Field将支持两个有用的属性:
- -> analyzer 为每个field定义@Analyzer而非为属性定义
- -> bridge 每个field定义@FieldBridge而非为属性定义
- 6. @IndexedEmbedded
- 对象有组合关系时使用。
- -> depth 关联的深度,存在循环的依赖时使用。
- -> prefix 索引fields的前缀,默认为"属性名.",如address.city中的"address."
- -> targetElement 被标注的域不是实际对象类型(如声明类型为接口)时使用,用来指定实际对象类型
- 关联对象会自动被设为@Indexed
- 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
- -> factory
- -> params
- 13. @TokenizerDef
- -> factory
- -> params
- 14. @TokenFilterDef
- -> 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
- 作用于标注了@DocumentId的属性(通常为id属性)
- 需要提供双向转换,且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