Hibernate Search常用注解总结

Hibernae Search中的@IndexedEmbedded和@ContainedIn应当是成对出现的一对注解。

  1. @IndexedEmbedded指定在主业务实体的索引中包含关联业务实体的搜索内容,可以通过搜索关联业务实体的内容得到主业务实体的查询结果。

  2. @ContainedIn指定更新关联实体时同时更新主业务实体中索引的内容,如果不指定@ContainedIn会导致关联实体内容修改后得到错误的搜索结果。

  3. @IndexedEmbedded和@ContainedIn可以同时出现在一个属性上,意味着其关联的业务实体对应的属性上也应当同时出现这两个注解。

  4. 应注意在@IndexedEmbedded上设置depth,避免创建关联索引进入死循环。

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 适合索引大量的文本而不需要以原始形式重新获得它,如网页主题或各种文本文档;

  1. @NumericField
    @Field的联合注解,用于Integer, Long, Float和Double属性,索引时采用字典树结构(Trie structure).
    Lucene将此API标记为experimental,未来版本未必支持。Hibernate Search将尽量掩盖底层的API变化,但也未必能有效保证。
    -> forField
    -> precisionStep (default值4)

  2. @DocumentId
    用于保证索引实体的单一性。必须存储而且必须不能被分词(相当于加了@Field(store=Store.YES, index=Index.UN_TOKENIZED))
    采用JPA方式时,如果指定了@Id则不再需要标注该注解。

  3. @Fields
    同一个域采用不同的索引策略。需要为每个Field指定name属性(非强制).
    当使用@Fields时,@Field将支持两个有用的属性:
    -> analyzer 为每个field定义@Analyzer而非为属性定义
    -> bridge 每个field定义@FieldBridge而非为属性定义

  4. @IndexedEmbedded
    对象有组合关系时使用。
    -> depth 关联的深度,存在循环的依赖时使用。
    -> prefix 索引fields的前缀,默认为”属性名.”,如address.city中的”address.”
    -> targetElement 被标注的域不是实际对象类型(如声明类型为接口)时使用,用来指定实际对象类型
    1) 关联对象会自动被设为@Indexed
    2) 相当于在当前实体对应的Document下创建一个或多个名为”前缀+被组合实体中标注了@Field的域”的Field
    3) 对集合、Map、对象数组同样生效
    4) 成本很高,尽量不要过多的使用该注解

  5. @ContainedIn
    双相关联的对象中,另一方配合@IndexedEmbedded使用,保证Lucene document的联动更新。
    当前类被用JPA方式标注为@Embeddable时不需要使用@ContainedIn

  6. @Boost
    静态索引加速。与被索引实体的运行时状态无关。
    1) 可用在@Field的boost属性中、方法级、类级
    2) 不同方式指出的加速系数会累积,不能重复使用。如
    @Field(boost=@Boost(1.5f))
    @Boost(2f)
    public String getSummary() { return summary; }
    则summary系数为3,比普通域重要3倍
    3) 提升因数的指定并非精确的,可用来标注相对重要的实体或域。

  7. @DynamicBoost
    动态索引加速。
    -> impl 指定具体的加速策略实现类
    1) 用于class或field级别
    2) 使用该标注时,需要自定义加速策略类并实现BoostStrategy接口:
    public interface BoostStrategy {
    public float defineBoost(Object value);
    }
    value是被标注的类型实例或属性值。
    3) 可以和@Boost混合使用

  8. @Analyzer
    -> impl 指定具体的Analyzer实现类
    -> definition 指向@AnalyzerDef标注中name属性定义的值

    • 类方式:
      1) 可以作用于实体、属性甚至每个域
      2) 同一实体中使用不同的混合的Analyzer通常是一种坏的做法,尤其是在使用QueryParser查询时
      3) 必须保证在同一域上,索引和查询使用的是同一个Analyzer.
  9. @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”);

  10. @CharFilterDef
    定义CharFilter,一般配合@AnalyzerDef使用。
    -> factory
    -> params

  11. @TokenizerDef
    定义Tokenizer,一般配合@AnalyzerDef使用。
    -> factory
    -> params
  12. @TokenFilterDef
    定义TokenFilter,一般配合@AnalyzerDef使用。
    -> factory
    -> params

  13. @DateBridge
    日期型存储格式为 yyyyMMddHHmmssSSS
    -> resolution
    1) Resolution.DAY
    2) Resolution.HOUR
    3) Resolution.MILLISECOND
    4) Resolution.MINUTE
    5) Resolution.MONTH
    6) Resolution.SECOND
    7) Resolution.YEAR

  14. @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

  15. @ClassBridge
    用于一个实体对应的多个属性的联合索引,且该索引通常需要采用一种特殊的索引方式
    -> impl
    -> name
    -> store
    -> analyzer
    -> index
    -> termVector
    -> boost
    -> params

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值