Lucene 简介
最近几年Lucene的更新速度很快.目前的最新版本是4.6.Lucene它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构.目前有很多应用程序是基于Lucene的,比如我们常用的Eclipse的帮助信息就是其中之一.Lucene能够为文本类型的数据建立索引.所以我们也可以将HTML,PDF,Word格式数据转换成文本后进行索引.然后将其保存到磁盘或者内存中.用户可以根据条件在索引文件中进行查询.
Lucene常用的几个对象:
Document:用来描述文档.一个 Document 对象由多个Field 对象组成的。可以将其看成是一个Document 就是一条记录,Field 相当于一条记录中的一个属性
Field:描述一个文档的属性.比如一个文件可以由文件名和内容两个Field描述.
Analyzer:需要索引就可能需要分词.Analyzer就是来负责这个工作的.它是一个抽象类.
IndexWriter:把一个个的Document添加到索引中.
IndexReader:主要是对文档的检索.
Directory:Lucene 的索引的存储的位置.它是一个抽象类.FSDirectory,表示检索文件磁在盘中的位置.RAMDirectory表示内存中的索引位置.
接下来看一下如何建立索引:
public static void index(boolean hasIndex) { int[] ids = {0,1,2,3,4,5}; String[] emails = {"lfd@foxmail.com","lfd@qq.com","lfx@qq.com","lfx@foxmail.com","hll@gcp.edu","zzp@gcp.edu"}; String[] contents = { "incididunt ut labore et dolore magna aliqua. Ut enim ad lorem. ", "Lorem ipsum dolor sit amet lorem consectetur adipisicing", "dolor in reprehenderit in voluptate velit esse cillum nostrud exercitation ullamco laboris. ", "dolor in reprehenderit in voluptate velit esse cillum nostrud exercitation ullamco laboris. ", "Lorem ipsum dolor sit amet, consectetur adipisicing elit", "Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna " }; String[] names = {"zzp","lfd","lfx","tom","huanglili","tzp"}; IndexWriter writer = null ; Directory directory = null ; try { directory = FSDirectory.open(new File("D:/Lucene")) ; //directory = new RAMDirectory() ; //索引文件在内存 writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_46, new StandardAnalyzer(Version.LUCENE_46))) ; //是否重新构建索引 if(hasIndex) { writer.deleteAll() ; } int count = names.length ; for(int i=0; i<count; i++) { Document doc = new Document() ; /* 首先是一个不变的属性值,这类字段还有一个主要用途, * 就是可以用于对搜索的返回结果集排序或是按范 * 围查询FloatField DoubleField IntField LongField BinaryDocValuesField NumericDocValuesField SortedDocValuesField SortedSetDocValuesField StoredField 整个域要存储的 StringField 是一个不需要分词,而直接用于索引的字符串 TextField 是一大块需要经过分词的文本 FieldType fieldType = new FieldType(); fieldType.setIndexed(true);//set 是否索引 fieldType.setStored(true);//set 是否存储 fieldType.setTokenized(false);//set 是否分词*/ doc.add(new IntField("id", ids[i], Store.YES)) ; doc.add(new StringField("email", emails[i], Store.YES)); doc.add(new TextField("content", contents[i], Store.YES)) ; FieldType type = new FieldType() ; type.setIndexed(true) ; type.setStored(true) ; doc.add(new Field("name", names[i], type)) ; writer.addDocument(doc) ; } writer.commit() ; } catch (IOException e) { e.printStackTrace(); } finally { try { if(writer != null) { writer.close() ; writer = null ; } } catch (IOException e) { e.printStackTrace(); } } }
简单的查询方式:
public static void searcher01() { try { Directory directory = FSDirectory.open(new File("D:/Lucene")) ; DirectoryReader reader = DirectoryReader.open(directory) ; IndexSearcher searcher = new IndexSearcher(reader) ; //获取Query,查询Field名为content,内容中包含consectetur. Query query = new TermQuery(new Term("content", "consectetur")) ; TopDocs topDocs = searcher.search(query, 10) ; ScoreDoc[] scores = topDocs.scoreDocs ; int length = scores.length ; for(int i=0; i<length; i++) { //scores[i].doc:根据Document的id获取Document //doc.get("xxx"):获取储存索引时的Field名获取相应Document的内容. Document doc = searcher.doc(scores[i].doc) ; System.out.println("id:" + doc.get("id") + " email:" + doc.get("email") + " content:" + doc.get("content") + " name:" + doc.get("name")); } } catch (IOException e) { e.printStackTrace(); } finally { try { if(reader != null) { reader.close() ; reader = null ; } } catch (IOException e) { e.printStackTrace(); } } }
删除索引:
public static void delIndex() { IndexWriter writer = null ; try { writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_46, new StandardAnalyzer(Version.LUCENE_46))) ; writer.deleteDocuments(new Term("content", "welcome")) ; } catch (IOException e) { e.printStackTrace(); } finally { try { if(writer != null) { writer.close() ; writer = null ; } } catch (IOException e) { e.printStackTrace(); } } }
更新索引:
public static void updIndex() { IndexWriter writer = null ; try { writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_46, new StandardAnalyzer(Version.LUCENE_46))) ; Document doc = new Document(); doc.add(new StringField("id","11", Field.Store.YES)); doc.add(new StringField("content", "incididunt ut labore et dolore magna aliqua. Ut enim ad lorem. ", Field.Store.YES)); writer.updateDocument(new Term("id","0"), doc) ; } catch (IOException e) { e.printStackTrace(); } finally { try { if(writer != null) { writer.close() ; writer = null ; } } catch (IOException e) { e.printStackTrace(); } } }
相关推荐
《Lucene4.6实战应用》一书主要探讨了Apache Lucene 4.6版本在实际项目中的应用和深入理解。Lucene是一个高性能、全文检索库,它为开发者提供了强大的文本搜索功能。作为开源项目,Lucene被广泛应用于各种信息检索...
在深入理解Lucene 4.6的源代码之前,我们首先需要了解全文搜索引擎的基本原理。全文搜索引擎通过索引文档中的关键词来实现快速查找,它包括索引构建、查询处理和结果排序等核心环节。 1. **索引构建**: - 分词:...
Apache Solr是一个开源的企业级搜索平台,它使用Lucene搜索引擎库的Java实现,提供了一个强大的搜索功能。Apache Solr Reference Guide为用户提供了一套完整的参考手册,涵盖从基本安装、配置到高级搜索技术的全面...
- **1.3.2 全文索引结构与Lucene实现**:深入解析了全文索引的核心结构,并介绍了使用Lucene构建索引的具体步骤。 - **1.3.3 搜索用户界面**:讨论了设计友好用户界面的原则。 - **1.3.4 计算框架**:概述了支持...
功能性能和设计是衡量软件的三个基本方面,开源Jivejdon是这三者完美结合案例之一。ivejdon是真正的、彻底的、完全面向对象软件系统。是目前国内领先的、高水准开源论坛系统(Apache 2.0),不断跟踪和应用全球软件...
3.2.2. 高级使用:持久一个 DbTable 结果对象 3.2.3. 高级用法示例 3.3. 摘要式认证 3.3.1. 简介 3.3.2. 规范(Specifics) 3.3.3. 身份(Identity) 3.4. HTTP 认证适配器 3.4.1. 简介 3.4.2. 设计回顾 ...
4.5.1 Lucene 简介……………… 108 4.5.2 Solr 简介 ......………………… 113 4.5.3 Elasticsearch 简介…………… · 120 4.6 案例实践……………… 123 4.6.1 实验环境设置.. ... ....………… 123 4.6.2 基于...
##### 4.6 创建一个新闻列表 - **实现过程**: - 定义新闻内容类型。 - 创建新闻条目。 - 展示列表页面。 #### 5. OpenCms标签 ##### 5.1 标签介绍 - **标签功能**: - 动态获取内容。 - 控制页面逻辑。 - **...
##### 4.6 创建一个新闻列表 - **实现方法**: - 定义新闻的XML结构。 - 使用XSLT转换为HTML格式。 - 展示在页面上。 #### 第5章 OpenCMS标签 ##### 5.1 标签介绍 - **作用**: - 提供动态内容生成的功能。 - ...