@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;
}
}
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);
}
}
分享到:
相关推荐
Lucene创建索引步骤: 1、创建Directory(索引位置) 2、创建IndexWrite(写入索引) 3、创建Document对象 4、为Document添加Field(相当于添加属性:类似于表与字段的关系) 5、通过IndexWriter添加文档到索引中
### Lucene3.0创建索引 在Lucene3.0中创建索引是一个关键功能,可以帮助用户快速地检索和管理大量的文本数据。本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、...
java创建Lucene索引
**Lucene索引结构原理** Lucene是Apache软件基金会的开放源代码全文搜索引擎库,它为Java开发人员提供了强大的文本搜索功能。理解Lucene的索引结构原理对于优化搜索性能和设计高效的搜索应用至关重要。 首先,我们...
本文将重点介绍如何使用Lucene创建索引以及如何基于这些索引进行高效的搜索。 #### 二、创建索引 ##### 2.1 准备工作 在开始之前,我们需要做一些准备工作: - **安装Java环境**:Lucene基于Java开发,因此首先...
Lucene(这里用到的是Lucene.net版本也成为DotLucene)是一个信息检索的函数库(Library),利用它你可以为你的应用加上索引和搜索的功能. Lucene的使用者不需要深入了解有关全文检索的知识,仅仅学会使用库中的一个类,...
在Eclipse环境中运用java,Lucene建索引及查询关键字
**Lucene创建索引与搜索"java"关键字的示例代码** Apache Lucene是一个高性能、全功能的文本搜索引擎库,广泛应用于各种系统中用于实现高效、精准的全文检索功能。这个示例代码将向我们展示如何使用Lucene来创建一...
本教程主要探讨的是如何利用Lucene进行索引优化,特别是通过多线程和处理多个目录来提高索引创建效率。 首先,我们需要理解Lucene的索引原理。Lucene将文档分解为词项(tokens),并对每个词项创建倒排索引。倒排...
在这个场景中,我们讨论的是如何结合Lucene和MySQL来实现一个Java应用程序,该程序能够从MySQL数据库中提取数据,创建索引,并进行高效的搜索。 首先,我们需要理解Lucene的工作原理。Lucene通过分析文本,将文档...
1. **数据预处理**:首先,需要将原始数据进行预处理,如分词、去除停用词等,然后使用Lucene创建索引。 2. **索引分割**:生成的Lucene索引可能非常大,不适合一次性加载到Hadoop集群。因此,通常会将其分割成多个...
**Lucene5学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的首选工具。本文将深入探讨如何使用Lucene5来创建一...
本篇文章将深入探讨 Lucene 创建索引的过程以及如何使用 Lucene 进行高效的全文搜索。 ### 1. Lucene 的基本概念 #### 1.1 文档(Document) 在 Lucene 中,文档是信息的基本单位,它可以是网页、电子邮件、数据库...
创建索引 创建Lucene索引的步骤包括: 1. **初始化Directory**:选择存储索引的目录,如FSDirectory(文件系统)、RAMDirectory(内存)等。 2. **创建IndexWriter**:配置IndexWriter实例,指定Directory、...
1) 提供实时索引的创建、管理 2) Query的创建 详细介绍参照博客:http://blog.csdn.net/xiaojimanman/article/details/20624739 中的介绍
首先,让我们了解如何利用Lucene 4.7.2创建索引。创建索引是全文检索的基础,它涉及将文本数据结构化为Lucene可以理解和查询的形式。开发者可以通过Analyzer类来处理输入的文本,进行分词、去除停用词等预处理步骤。...
本篇文章将深入探讨如何使用Lucene创建索引以及进行查询,帮助你更好地理解和应用这个强大的工具。 ### 一、Lucene的基本概念 1. **文档(Document)**:在Lucene中,每个需要被搜索的信息单元被视为一个文档。...
站内查询将使用Lucene创建索引,进行全文检索。 二、引入Lucene依赖 要使用Lucene,我们需要在pom文件中引入相关依赖。这些依赖包括: * lucene-core:Lucene的核心包,提供了基本的索引和搜索功能。 * lucene-...
创建索引是Lucene的核心过程,它涉及到以下步骤: 1. **定义索引目录**:首先,你需要指定一个目录来存储索引文件。这通常是一个文件夹,可以通过`File`对象表示,然后使用`FSDirectory.open()`方法打开。 2. **...
- **首次创建索引**:首先,我们需要遍历整个数据源,创建每个文档的实例,然后将这些文档添加到Lucene的索引writer中。完成这一步后,就会生成一个完整的初始索引。 - **监控数据变更**:为了实现增量索引,我们...