`
Tonyguxu
  • 浏览: 279563 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Lucene】更合理地使用Document和Field

 
阅读更多

 

writer = ...; //#1
PreparedStatement pstmt = conn.prepareStatement(selectSql);
ResultSet	rs = pstmt.executeQuery();
Document doc = null;
while (rs.next()) {
	doc = new Document(); //#2
	doc.add(new Field(ConstantsUtil.ROW_ID, rs.getString("rowid"), Field.Store.YES,Field.Index.UN_TOKENIZED)); //#3
	doc.add(new Field(ConstantsUtil.FD_COMMAND_ID, String.valueOf(rs.getLong(ConstantsUtil.DB_COMMAND_ID)),
Field.Store.YES, Field.Index.UN_TOKENIZED));
	if (rs.getString(ConstantsUtil.DB_DEST_ID) != null)
		doc.add(new Field(ConstantsUtil.FD_DEST_ID, rs.getString(ConstantsUtil.DB_DEST_ID), Field.Store.YES,
								Field.Index.TOKENIZED));
	if (rs.getString(ConstantsUtil.DB_SRC_ID) != null)
		doc.add(new Field(ConstantsUtil.FD_SRC_ID, rs.getString(ConstantsUtil.DB_SRC_ID), Field.Store.YES,
								Field.Index.TOKENIZED));
	doc.add(new Field(ConstantsUtil.FD_UP_MSG_ID, String.valueOf(rs.getLong(ConstantsUtil.DB_UP_MSG_ID)),
Field.Store.YES, Field.Index.UN_TOKENIZED));
	doc.add(new Field(ConstantsUtil.FD_CREATED_DATE, DateTools.dateToString(rs.getTimestamp(ConstantsUtil.DB_CREATED_DATE), DateTools.Resolution.MINUTE), Field.Store.YES,
Field.Index.UN_TOKENIZED));
	if (rs.getString(ConstantsUtil.DB_STATION_ID) != null)
		doc.add(new Field(ConstantsUtil.FD_STATION_ID, rs.getString(ConstantsUtil.DB_STATION_ID),Field.Store.YES, Field.Index.UN_TOKENIZED));
	writer.addDocument(doc); //#4
}

以上设计、编码存在一些问题:

1.对于ResultSet的一行就实例一个Document。How to make indexing faster 建议重用Document 和 Field实例。 ——性能?

 

2.数据库一个字段对应一个Field,简单地将需要的字段对应成Field然后 add到Document里(没有理解Docuemt、Field、全文检索,lucene里的Field和数据库中的字段是不是一样的? ),并且Field的值也直接来自数据库中的值

 

如果以后需要把数据库中其他字段的值也加入到索引里,该怎么做?按上面的思路,只能把需要的字段构造相应的Field然后add到Document里,需要修改这里的代码,增加doc.add(field) 。        ——修改:灵活性,增加新需求:可扩展性?

并且如果构造一个Filed的value需要在从数据库取出的原始值基础上改造(比如截取数字的部分值)or 新需求需要修改原先的获得值的方法,还是需要对上面代码做修改。          ——修改灵活性

 

lucene里的Field和数据库中的字段是不是一样的?

不是。

 

Re-use Document and Field instances

http://www.lucidimagination.com/search/link?url=http://wiki.apache.org/lucene-java/HowTo 写道
Re-use Document and Field instances As of Lucene 2.3 there are new setValue(...) methods that allow you to change the value of a Field. This allows you to re-use a single Field instance across many added documents, which can save substantial GC cost. It's best to create a single Document instance, then add multiple Field instances to it, but hold onto these Field instances and re-use them by changing their values for each added document. For example you might have an idField, bodyField, nameField, storedField1, etc. After the document is added, you then directly change the Field values (idField.setValue(...), etc), and then re-add your Document instance.

Note that you cannot re-use a single Field instance within a Document, and, you should not change a Field's value until the Document containing that Field has been added to the index. See Field for details.

 

基于原有的设计,如果遇到以下问题该如何处理?

1.不想有这么多的Field,即Field不应该是与数据库中的字段一一对应,如content域,想让数据库中若干个字段的值合在一块构成一个content域。

 

2.如果一个Field的值不能直接拿数据库中的值,而是需要做些处理(可能是格式上的也可能是跟业务有关的)。

 

3.需求变更:需要修改某个Field值的获取,比如原先是截取某数字前4位,现在想截取前6位。

 

4.新增字段索引需求:需要对数据库中某字段的值建索引(该字段的值原先不在索引里)。

 

TODO:结合《java与模式》3.1 软件系统的可维护性 来思考以上问题。

 

如果基于原来的设计,由数据库中一行数据获得某个Field的值,在该类中一个方法里(getValue(bean))处理,然后将处理结果返回。如果需要修改field的值则需要修改方法,如果要增加某个field,则增加document.add(new Field(name,getValue(),xx))同时增加相应的获取value的方法getValue。

 

重构:Field对象的创建和值的获取

利用一个继承结构负责Field的创建和值的获取。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    一步一步跟我学习Lucene源码之lucene的各种Field

    了解并熟练掌握这些知识点,有助于我们更好地利用Lucene进行全文搜索和信息检索。在实际应用中,结合其他相关技术,如Solr(基于Lucene的搜索引擎服务器)、Netty(高性能网络通信框架)和Hadoop(大数据处理框架)...

    lucene基本包

    此外,社区还提供了许多扩展库,如Solr和Elasticsearch,它们基于Lucene,增加了分布式搜索、集群管理和更高级的功能。 9. **API使用** Lucene提供了丰富的Java API,开发人员可以通过简单的代码调用来实现索引...

    lucene、lucene.NET详细使用与优化详解

    - 索引优化:合理设置Field的存储和索引属性,平衡搜索速度和存储空间。 - 使用Segment:lucene通过Segment来分块存储索引,多段合并可以减少索引碎片,提高检索效率。 - 分布式索引和搜索:通过分布式部署,...

    lucene,lucene教程,lucene讲解

    org.apache.lucene.document.Field Directory类代表一个Lucene索引的位置。它是一个抽象类. 其中的两个实现: 第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。 第二个是 RAMDirectory,它表示一...

    lucene3.0.3搜索的使用示例

    4. **Document** 和 **Field** 类:Document是Lucene中的基本数据结构,代表一个要被索引的完整文档。每个文档包含多个Field,每个Field对应文档的一个属性或部分。 5. **IndexWriter**:用于创建或更新索引。你...

    Lucene 索引的简单使用

    本篇文章将详细阐述如何使用Lucene来创建和查询索引,帮助你深入理解其核心概念和操作流程。 ### 1. Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段...

    Lucene原理及使用总结

    Lucene的架构包括多个组件,如`Analyzer`负责文本分析,`Document`表示待索引的文档,`Field`定义文档的字段,`IndexWriter`负责创建和更新索引,`Directory`管理磁盘上的索引文件,`QueryParser`解析用户输入的查询...

    Lucene3.1使用教程

    2. **文档(Document)**:在Lucene中,文档是存储和检索的基本单位,它可以包含多个字段(Field),如标题、内容、作者等。 3. **字段(Field)**:每个文档由多个字段组成,每个字段有其特定的属性,如是否可搜索...

    Lucene 使用正则表达式

    ### Lucene 使用正则表达式 #### 知识点概览 1. **Lucene简介** 2. **正则表达式(regex)在Lucene中的应用** 3. **regexQuery详解** 4. **示例代码解析** 5. **索引创建与查询流程** 6. **正则表达式的语法** #### ...

    lucene详细使用教程

    1. **文档模型**:在 Lucene 中,文档是信息的基本单位,可以包含多个字段(Field)。每个字段都有类型,如 `Text`(用于全文搜索)或 `Keyword`(用于精确匹配)。 2. **分析器(Analyzer)**:用于将文档内容分解...

    lucene整理文档,lucene详细描述,安装使用过程。

    **Lucene 概述** ...通过理解 Lucene 的核心概念,如 Analyzer、Document、Field 和查询机制,开发者可以有效地构建自己的文本检索系统。结合实际需求,可以进一步定制 Lucene 功能,以满足特定的应用场景。

    Lucene使用教程

    ### Lucene 使用教程 #### 一、Lucene简介与安装 **1.1 Lucene简介** Lucene是一款高性能、全功能的文本...Lucene的强大之处在于其灵活性和可扩展性,因此开发者可以根据具体的应用场景灵活地调整索引和查询策略。

    Lucene使用代码实例之搜索文档

    《Lucene使用代码实例之搜索文档》 Lucene是一个高性能、全文检索库,它提供了强大的文本分析和索引功能,广泛应用于搜索引擎开发和其他需要高效文本处理的场景。本篇文章主要面向初学者,通过实例详细解释如何使用...

    使用lucene进行简单的开发

    【使用Lucene进行简单的开发】 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它提供了完整的搜索功能,包括分析、索引和...随着对Lucene的深入理解和实践,你可以构建更强大的全文搜索引擎解决方案。

    使用Lucene.net进行全文搜索

    通过阅读和运行这个示例,你可以更直观地了解上述概念的实现。 总结来说,Lucene.NET为.NET开发者提供了强大的全文搜索工具,通过构建索引、多关键字匹配、搜索执行和结果处理,可以构建高效、灵活的全文搜索引擎。...

    盘古分词、lucene3.0.3搜索的使用示例.zip

    3. **文档索引**:使用Lucene的IndexWriter对象,将包含分词后的文本的Document对象写入索引库。每个Document对象代表一个待检索的文档,可以包含多个Field,如标题、内容等。 4. **查询执行**:构建Query对象,...

    lucene3.5的创建和增删改查

    《Lucene 3.5:创建、增删改查详解》 ...然而,需要注意的是,尽管Lucene 3.5版本已经足够强大,但随着技术的发展,更现代的版本可能包含更多的优化和特性,对于新项目,建议考虑使用最新版的Lucene。

Global site tag (gtag.js) - Google Analytics