我们在创建lucene索引的时候经常是从数据库取出相关的记录封装成一个JavaBean,然后将JavaBean的相关字段分别再创建索引.如果JavaBean增加和删除一个字段的话,我们必须修改我们创建索引的程序对应的增加和删除索引字段.如果我们索引创建分布不同程序中,这样修改就比较麻烦,下面是我运用Annotation写的一个lucene 创建索引工具类.希望对学习Annotation和创建索引有用.
索引字段声明注解类,可以扩展此类来增加自己想要的相关属性
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.FIELD })
public @interface IndexAnnotation {
//存储
public boolean store() default false;
//分词
public boolean analyse() default false;
//删除HTML代码
public boolean parseHtml() default true;
//权重分
public float boost() default 10;
}
//工具类--解析注解。生成索引字段
@SuppressWarnings("unchecked")
public final class IndexDocumentUtils {
private final static Logger log = LoggerFactory
.getLogger(IndexDocumentUtils.class);
/**
* 创建索引
*
* @param idataIndex
* @return
*/
public static Document createDocument(IdataIndex idataIndex) {
Class clzss = idataIndex.getClass();
Document doc = new Document();
Field[] fields = clzss.getDeclaredFields();
for (Field field : fields) {
if (field.getName().equals("serialVersionUID"))
continue;
String value = getFieldValue(idataIndex, field.getName());
org.apache.lucene.document.Field indexField = new org.apache.lucene.document.Field(
field.getName(), value, getStore(idataIndex, field
.getName()), getIndex(idataIndex, field.getName()));
//设置权重值
indexField.setBoost(getBoost(idataIndex, field.getName()));
doc.add(indexField);
}
return doc;
}
/**
* 通过反射获取字段值
*
* @param idataIndex
* @param fieldName
* @return
*/
private static Pattern tagPattern = Pattern
.compile("<.*?>", Pattern.DOTALL);
private static String getFieldValue(IdataIndex idataIndex, String fieldName) {
try {
boolean isMatcher = false;
String value = StringUtil.defaultIfEmpty(BeanUtils.getProperty(
idataIndex, fieldName));
StringBuffer sb = new StringBuffer();
if (isParseHtml(idataIndex, fieldName)) {// 是否解析html内容
if (StringUtils.isNotEmpty(value)) {
Matcher matcher = tagPattern.matcher(value);
while (matcher.find()) {
isMatcher = true;
matcher.appendReplacement(sb, "");
}
matcher.appendTail(sb);
} else {
return "";
}
}
return isMatcher ? sb.toString() : value;
} catch (Exception e) {
log.error(e);
return "";
}
}
/**
* 返回索引字段是否存储
*
* @param idataIndex
* @param fieldName
* @return
*/
private static Store getStore(IdataIndex idataIndex, String fieldName) {
Class clzss = idataIndex.getClass();
try {
Field field = clzss.getDeclaredField(fieldName);
IndexAnnotation ia = field.getAnnotation(IndexAnnotation.class);
if (ia != null) {// 检查注解的值
if (ia.store()) {
return org.apache.lucene.document.Field.Store.YES;
}
}
} catch (Exception e) {
log.error(e);
}
return org.apache.lucene.document.Field.Store.NO;
}
/**
* 返回索引字段是否索引
*
* @param idataIndex
* @param fieldName
* @return
*/
private static Index getIndex(IdataIndex idataIndex, String fieldName) {
Class clzss = idataIndex.getClass();
try {
Field field = clzss.getDeclaredField(fieldName);
IndexAnnotation ia = field.getAnnotation(IndexAnnotation.class);
if (ia != null) {// 检查注解的值
if (ia.analyse()) {
return org.apache.lucene.document.Field.Index.ANALYZED;
}
}
} catch (Exception e) {
log.error(e);
}
return org.apache.lucene.document.Field.Index.ANALYZED;
}
/**
* 返回索引字段是否解析HTML
*
* @param idataIndex
* @param fieldName
* @return
*/
private static boolean isParseHtml(IdataIndex idataIndex, String fieldName) {
Class clzss = idataIndex.getClass();
try {
Field field = clzss.getDeclaredField(fieldName);
IndexAnnotation ia = field.getAnnotation(IndexAnnotation.class);
if (ia != null) {// 检查注解的值
return ia.parseHtml();
}
} catch (Exception e) {
log.error(e);
}
return true;
}
/**
* 返回权重值
* @param idataIndex
* @param fieldName
* @return
*/
private static float getBoost(IdataIndex idataIndex, String fieldName) {
Class clzss = idataIndex.getClass();
try {
Field field = clzss.getDeclaredField(fieldName);
IndexAnnotation ia = field.getAnnotation(IndexAnnotation.class);
if (ia != null) {// 检查注解的值
return ia.boost();
}
} catch (Exception e) {
log.error(e);
}
return 10;
}
}
索引对应javabean定义
public class SearchIndex implements Serializable {
/**
*
*/
private static final long serialVersionUID = 153648837940506749L;
//索引编号
@IndexAnnotation(store = true)
private String id;
//资源ID
@IndexAnnotation(store = true)
private String resourceId;
//标题
@IndexAnnotation(store = true, analyse = true,boost=100)
private String title;
//索引内容说明
@IndexAnnotation(store = true, analyse = true,boost=50)
private String content;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getResourceId() {
return resourceId;
}
public void setResourceId(String resourceId) {
this.resourceId = resourceId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
}
创建索引
fsWriter.addDocument(IndexDocumentUtils.createDocument(searchIndex));
分享到:
相关推荐
- **索引创建**:通过`@Indexed`注解为实体类添加索引。 - **查询优化**:使用Lucene的全文检索能力提升查询性能。 ### 总结 本文档详细介绍了Hibernate_Annotation的相关知识点,包括实体Bean的基本定义、各种...
### Hibernate Annotation 帮助文档知识点总结 #### 1. 创建注解项目 - **系统需求**:在开始创建一个支持 Hibernate 注解的项目之前,需要确保满足以下系统需求: - Java 开发环境(例如 JDK 1.8 或更高版本)。...
- **3.1.4 自定义约束**:通过创建注解类和对应的约束验证器实现。 - **3.1.5 注解模型**:将约束注解应用于域模型类的属性上。 #### 3.2 使用Validator框架 - **3.2.1 数据库模式级验证**:可以在数据库层面定义...
Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。 commons-collections.jar Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大 commons-lang.jar Apache ...
- **Lucene**:作为一款高性能全文检索引擎库,Lucene提供了完整的文本搜索功能,并且能够快速地建立索引。版本号为3.1.0的Lucene是较早的一个版本,在性能上可能不如后续版本优秀。 #### 二、集成配置详解 - **...
Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。 commons-collections.jar Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大 commons-lang.jar Apache ...
18. **jandex.jar**:Java Annotation Indexer,用于处理和索引注解信息。 19. **hibernate-envers.jar**:Hibernate的审计模块,可以记录和查询数据的历史版本。 20. **hibernate-search.jar**:提供全文搜索功能...
Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...
5. **查询语言**:`hibernate-search-orm.jar`可能包含了Hibernate的全文搜索功能,它利用了Lucene库来提供对数据库中的文本进行索引和搜索的能力。 6. **依赖库**:其他的JAR文件可能是Hibernate依赖的第三方库,...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
#### 创建一个注解项目 (Setting up an annotations project) 为了开始使用Hibernate注解,首先需要确保项目的类路径中包含了`hibernate-annotations.jar`和`lib/ejb3-persistence.jar`这两个核心库。这些库提供了...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...