`
okwangxing
  • 浏览: 29045 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Lucene之索引建立

阅读更多
Lucene可对email,网页,文本资料,doc,pdf之类的文档进行索引建立,在建立索引的时候可为以后的排序做些处理.但运行到分布式的环境中,需要考虑建立索引的性能问题,并发问题,多线程问题,死锁问题,一个Document中包含多个Field.

Index的建立大致步骤:

1.源数据文本化
由于index无固定schema,这样就允许了使用者随时的改变index,可以追加字段,重建Document.索引的建立都是分析源数据,从中提取出文本信息,对文本信息进行分析,并储存为索引.源数据可为html,xml,pdf,ms office 文件.这里需要注意的对其文本信息的提取,例如针对xml/html中的标签的过滤.这里可以用到Tika框架.

2.当源数据文本化后,需要对其做处理—analysis
这就对应到Document中的Fields,可调用IndexWriter的addDocument对其分析的数据添加进入索引.在这其中包含很多可选操作,比如:针对大小写区分的LowerCaseFilter.禁词的StopFilter.由此可以,自己可以建立自己的过滤链.

3.文件的存储
分析好的索引需要存储磁盘,而lucene存储的结构是倒排索引(inverted indexed).有利于节省磁盘空间和关键词快速查找.当前主流的搜索引擎皆是利用的倒排索引.

例如:
Xxx – abcd cde x
索引本身告诉外界,xxx我已经在abcd cde x这个句子里面了.


每个数据都有自己的格式,lucene也不例外,针对索引的存储有自己的格式.
每个索引(index)包含一个或者多个块segment,每个块是一个独立的索引.块的创建是在索引的添加,删除的时候,而在搜索的时候会分开访问块,再最终合并到一起.

块文件命名更是 segments_<N>,Lucene第一次打开的就是这些文件,再会打开被块文件引用到的文件.N值会随着索引的改变次数而增加的.格式为整型数.

addDocument(Document)//利用默认的分析器,与创建IndexWriter的分析器相同.
addDocument(Document,Anayzer)


添加索引
a.new Document
b.new Field->添加内容
c.document.add(field);
d.indexWriter.add(document);
Document doc = new Document();
doc.add(new Field("id", ids[i]/*array*/, Field.Store.YES,
Field.Index.NOT_ANALYZED));
doc.add(new Field("city", text[i] /*array*/, Field.Store.YES,
					Field.Index.ANALYZED));
writer.addDocument(doc);

删除索引
在删除或者添加比较多的时候,会影响到索引的吞吐量,推荐做逼批处理的添加或者删除,来获得更好的性能.在这里的删除是"软删除",可调用expungeDeletes来删除磁盘上的所以已标识删除的数据.
a.Term/Query
b.indexWriter.deleteDocument(??)
deleteDocuments(Term)// deletes all documents containing the provided term.
deleteDocuments(Term[])// deletes all documents containing any of the terms in the provided array.
deleteDocuments(Query)// deletes all documents matching the provided query.
deleteDocuments(Query[])// deletes all documents matching any of the queries in the provided.

@Test
public void testDelete() throws Exception{
	IndexWriter iw = new IndexWriter(directory,new WhitespaceAnalyzer(),IndexWriter.MaxFieldLength.UNLIMITED);
	Term term = new Term("id", "1");
	iw.deleteDocuments(term);
	iw.optimize();
	assertEquals(iw.numDocs(), 1);
	iw.close();
}

通过各Term删除单个document.
IndexWriter,IndexReader中的maxDoc()与numDocs()
maxDoc()返回下一个可取得文档的内部编号.
numDocs()返回未被删除的document数目.

更新索引
updateDocument(Term, Document)// first deletes all documents containing the provided term and then adds the new document using the writer’s default analyzer.
updateDocument(Term, Document, Analyzer)// does the same, but uses the provided analyzer instead of the writer’s default analyzer.

@Test
public void testUpdate() throws Exception {
	IndexWriter iw = new IndexWriter(directory, new WhitespaceAnalyzer(),IndexWriter.MaxFieldLength.UNLIMITED);
	Term term = new Term("id", "1");
	Document doc = new Document();
	doc.add(new Field("id", "3", Field.Store.YES,
					Field.Index.NOT_ANALYZED));
	iw.updateDocument(term, doc);
	iw.optimize();
	assertEquals(iw.maxDoc(),2);
	iw.close();
}


从以上程序中可看出Field是个极其重要的类.在这里定义了几个枚举类型
Index,Store,TermVector

Index:
Index.ANALYZED 
Index.NOT_ANALYZED 
Index.ANALYZED_NO_NORMS
Index.NOT_ANALYZED_NO_NORMS
Index.NO

查询会用到Field,会关系到Field的存储类型
Store
Store.YES //保存,可以被IndexReader说读取.
Store.NO  //不保存.

介于Store与 Index之间的参数,用来提供向量机制的模糊查询
TermVector
TermVector.YES //保存term vectors
TermVector.WITH_POSITIONS //保存term vectors(保存值和token位置信息)
TermVector.WITH_OFFSETS //保存term vectors (保存值和token offset信息)
TermVector.WITH_POSITIONS_OFFSETS //保存term vectors (保存值和token位置信息,token offset信息)
TermVector.NO //不保存term vectors
  • 大小: 11.6 KB
分享到:
评论
4 楼 okwangxing 2010-02-25  
ladybird2010 写道
求Lucene结合Hibernate的配置实例 急。。
您若有Lucene的例子工程,帮忙发一个好吗?最好是可以分词。
Email: gao.guangpei@zte.com.cn 或者ggp123@126.com
非常感谢你!

具体说明,已发邮件到你的邮箱,请查收.
3 楼 okwangxing 2010-02-25  
JArcher 写道
最近在研究Lucene?

是的,需要用到这个东西.
2 楼 ladybird2010 2010-02-25  
求Lucene结合Hibernate的配置实例 急。。
您若有Lucene的例子工程,帮忙发一个好吗?最好是可以分词。
Email: gao.guangpei@zte.com.cn 或者ggp123@126.com
非常感谢你!
1 楼 JArcher 2010-02-25  
最近在研究Lucene?

相关推荐

    Lucene创建索引步骤

    Lucene创建索引步骤: 1、创建Directory(索引位置) 2、创建IndexWrite(写入索引) 3、创建Document对象 4、为Document添加Field(相当于添加属性:类似于表与字段的关系) 5、通过IndexWriter添加文档到索引中

    Lucene3.0创建索引

    ### Lucene3.0创建索引 在Lucene3.0中创建索引是一个关键功能,可以帮助用户快速地检索和管理大量的文本数据。本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、...

    Lucene建索引及查询关键字

    在Eclipse环境中运用java,Lucene建索引及查询关键字

    lucene 对 xml建立索引

    本文将详细介绍如何利用Lucene对XML文档进行索引建立的过程,并通过示例代码具体阐述其实现方法。 #### 二、基础知识 1. **Lucene简介** - Lucene是一个开源的全文搜索引擎库,能够帮助开发者构建应用程序内的搜索...

    基于lucene技术的增量索引

    - **首次创建索引**:首先,我们需要遍历整个数据源,创建每个文档的实例,然后将这些文档添加到Lucene的索引writer中。完成这一步后,就会生成一个完整的初始索引。 - **监控数据变更**:为了实现增量索引,我们...

    lucene全文检索简单索引和搜索实例

    二、Lucene索引创建流程 1. 初始化:首先,我们需要导入Lucene库,并创建一个标准的Analyzer,例如StandardAnalyzer,它对输入的文本进行标准化处理。 2. 创建索引目录:索引数据会存储在一个Directory对象中,...

    lucene索引结构原理

    **Lucene索引结构原理** Lucene是Apache软件基金会的开放源代码全文搜索引擎库,它为Java开发人员提供了强大的文本搜索功能。理解Lucene的索引结构原理对于优化搜索性能和设计高效的搜索应用至关重要。 首先,我们...

    lucene实现索引查询

    创建索引是Lucene的核心过程,它涉及到以下步骤: 1. **定义索引目录**:首先,你需要指定一个目录来存储索引文件。这通常是一个文件夹,可以通过`File`对象表示,然后使用`FSDirectory.open()`方法打开。 2. **...

    Lucene读取索引文件

    一个Lucene索引是由多个文件组成的,包括但不限于 segments文件、.del文件(删除文档标记)、.tii和.tis文件(Term Info Index和Term Info postings)、.frx、.fdx、.fdt、.fdt(Field Data)等。这些文件共同构成了...

    Lucene 索引的简单使用

    以上就是关于“Lucene索引的简单使用”的详细介绍,包括其核心概念、创建和查询索引的步骤以及一些高级特性。希望对你理解和应用Lucene有所帮助。在实际开发中,可以根据需求选择合适的Analyzer,优化索引策略,以...

    Lucene索引创建

    java创建Lucene索引

    Lucene索引器实例

    以下是一个简单的Java代码示例,展示了如何创建和使用Lucene索引器: ```java import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache....

    lucene 索引小示例

    《Lucene索引小示例解析》 Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。在Java编程环境中,Lucene被广泛应用于构建搜索功能,特别是对于大量文本数据的高效检索。本篇文章将通过一个简单的小...

    Lucene5学习之创建索引入门示例

    **Lucene5学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的首选工具。本文将深入探讨如何使用Lucene5来创建一...

    基于lucene的索引与搜索

    在Lucene中,索引过程包括分词、建立倒排索引以及存储相关元数据。倒排索引是Lucene的核心,它允许快速定位包含特定词汇的文档。搜索则通过查询解析、评分以及结果排序来实现,提供高效的检索性能。 2.2.3 Web...

    lucene并行索引

    倒排索引的基本思想是为每个文档中的每个词建立索引,并记录该词出现在哪些文档中及其位置信息。 - **倒排索引**:对于每个单词或词条,都会有一个包含该词条出现过的所有文档ID的列表。这种方式与传统的文档索引...

    Lucene结合Sql建立索引Demo源码.rar

    本源码演示了Lucene结合Sql建立索引,把Sql中的数据通过建立索引用Lucene来检索 【该源码由51aspx提供】   源码 " onerror="this.src='/images/ifnoimg.gif'" src="/uploads/allimg/090904/1039152O5-0.jpg...

    lucene索引结构原理.docx

    而在Lucene中,基本单位是Document,它同样由多个字段组成,但Lucene索引的是这些字段的内容,以加速文本检索。 - **索引构建**:Lucene支持增量索引和批量索引,可以处理数据源的小幅变化或大规模数据。数据库通常...

    关于lucene建立数据库索引的更新说明

    在本文中,我们将探讨如何使用Lucene建立数据库索引,并分享一些在实践过程中的经验和教训。Lucene是一个高性能、全文本搜索库,广泛用于构建搜索引擎。在创建索引时,需要注意以下关键点: 1. **资料的准确性**:...

    毕设 Lucene解析索引PDF文档的内容

    iTextPDFExtractor.java ------ ...--PDFBox创建PDF文件的Lucene索引 PDFBoxPathIndex.java ------- --PDFBox创建指定目录PDF文档索引 POIOfficeExtractor.java ----- -- POI处理Excel和Word文档代码

Global site tag (gtag.js) - Google Analytics