- 浏览: 279563 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (161)
- 【**计划】 (2)
- 【**Core Java**】 (30)
- 【**JAVA EE】 (6)
- JDBC (3)
- Hibernate专题系列 (0)
- 【**OS】 (14)
- 【**架构设计/设计模式】 (11)
- 【Hadoop】 (3)
- 【**分布式】 (9)
- 模板 (1)
- C (2)
- 常用工具 (1)
- Oracle (2)
- 【Tips】 (3)
- 【数据库】 (2)
- 玩转Ubuntu (0)
- 【计算机网络/网络编程】 (7)
- 【**Search Engine】 (21)
- 【**专题**】 (6)
- 【**Python】 (10)
- XML (1)
- 【**Open Source Framework】 (1)
- 【高级主题】 (1)
- 【存储】 (3)
- 【笔试面试】 (2)
- 【**数据结构与算法设计】 (20)
- 【其他】 (3)
- 【编程练习】 (2)
- 【待完成】 (12)
- 【工作】 (6)
- 【软件研发】 (4)
- 【**多线程多进程编程】 (5)
- 【Web Service】 (1)
- 【表达式解析/JavaCC系列】 (5)
- 【缓存系统:Memcached】 (1)
- 【Java IO/NIO】 (5)
- 【JVM运行机制及内存管理】 (7)
最新评论
-
107x:
...
python list排序 -
yuzhu223:
...
【Python基础】Python的lambda函数与排序 -
Tonyguxu:
分析查询结果的打分小于11.query=1065800715* ...
lucene打分机制的研究 -
Tonyguxu:
query=139320661963.013709 = (MA ...
lucene打分机制的研究 -
Tonyguxu:
query=10658007150.6772446 = (MA ...
lucene打分机制的研究
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
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】建索引核心类介绍
2012-06-08 17:28 1065IndexWriter 负责创建新索引或打开已有索引, ... -
wxxr框架的层次结构【转载】
2012-06-04 16:30 13601、层次结构介绍 层次结构有良好的扩展性、维护性。L ... -
《读框架学设计》之spi
2012-05-13 23:23 0前言 在决策表管理系统/java nio中都有spi ht ... -
优秀文章汇总
2012-05-08 18:48 776搜索引擎技术之概要预览 http://blog.csd ... -
【Lucene】lucene查询Query对象
2012-05-08 18:41 1418PrefixQuery 前缀查询。 如 test* 会匹配 ... -
【决策表管理系统】表达式解析
2012-05-07 15:50 1112由condition expression生成方法体Metho ... -
【工作】日志检索结果的排序改进分析
2012-04-27 18:07 965下图是现在生产环境的部署图,索引文件分布在70-7 ... -
【Lucene】查询term后加上'*'对打分的影响
2012-04-25 18:14 2101BooleanWeight里sum ... -
lucene.search.Weight
2012-04-25 15:39 998org.apache.lucene.search Cl ... -
播发日志检索系统出现的系列问题
2012-04-23 14:42 840index_controller表中显示索引已经结束(f ... -
lucene.search.Similarity
2012-04-20 10:31 2558Similarity defines the componen ... -
lucene打分机制的研究
2012-04-22 17:46 5863提出问题 目前在查询时,会将得分小于1的查询结果过滤掉。 ... -
设计模式笔记模板
2012-04-13 14:27 802一. 前言 面临的问题: 有什么解决方案呢? ... -
设计模式一览表
2012-04-12 09:42 773创建模式 结构模式 描述如何将类或者对象结合在一起形 ... -
如何写更加优美的代码?
2012-03-29 18:43 0前言 如何让编写的代码更加优美?现在对“优美”的理解就是在实 ... -
tokenize和tokenizer到底怎么翻译?
2012-03-28 10:32 3582在编写词法分析器(Lexer)或语法分析器(Parse ... -
【UML】交互、交互图
2012-03-27 18:19 1203基本行为建模:交互、交互图 术语和概念 ... -
【Lucene】构建索引
2012-03-17 23:16 770Lucene索引的过程是什么? step1 收集待 ... -
信息检索类小程序
2012-03-17 00:37 8531.对四大名著txt实现索引和搜索功能 2. -
决策表管理系统
2012-03-15 18:46 842主题: 1.模板引擎(Velocity) 见 ...
相关推荐
了解并熟练掌握这些知识点,有助于我们更好地利用Lucene进行全文搜索和信息检索。在实际应用中,结合其他相关技术,如Solr(基于Lucene的搜索引擎服务器)、Netty(高性能网络通信框架)和Hadoop(大数据处理框架)...
此外,社区还提供了许多扩展库,如Solr和Elasticsearch,它们基于Lucene,增加了分布式搜索、集群管理和更高级的功能。 9. **API使用** Lucene提供了丰富的Java API,开发人员可以通过简单的代码调用来实现索引...
- 索引优化:合理设置Field的存储和索引属性,平衡搜索速度和存储空间。 - 使用Segment:lucene通过Segment来分块存储索引,多段合并可以减少索引碎片,提高检索效率。 - 分布式索引和搜索:通过分布式部署,...
org.apache.lucene.document.Field Directory类代表一个Lucene索引的位置。它是一个抽象类. 其中的两个实现: 第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。 第二个是 RAMDirectory,它表示一...
4. **Document** 和 **Field** 类:Document是Lucene中的基本数据结构,代表一个要被索引的完整文档。每个文档包含多个Field,每个Field对应文档的一个属性或部分。 5. **IndexWriter**:用于创建或更新索引。你...
本篇文章将详细阐述如何使用Lucene来创建和查询索引,帮助你深入理解其核心概念和操作流程。 ### 1. Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段...
Lucene的架构包括多个组件,如`Analyzer`负责文本分析,`Document`表示待索引的文档,`Field`定义文档的字段,`IndexWriter`负责创建和更新索引,`Directory`管理磁盘上的索引文件,`QueryParser`解析用户输入的查询...
2. **文档(Document)**:在Lucene中,文档是存储和检索的基本单位,它可以包含多个字段(Field),如标题、内容、作者等。 3. **字段(Field)**:每个文档由多个字段组成,每个字段有其特定的属性,如是否可搜索...
### Lucene 使用正则表达式 #### 知识点概览 1. **Lucene简介** 2. **正则表达式(regex)在Lucene中的应用** 3. **regexQuery详解** 4. **示例代码解析** 5. **索引创建与查询流程** 6. **正则表达式的语法** #### ...
1. **文档模型**:在 Lucene 中,文档是信息的基本单位,可以包含多个字段(Field)。每个字段都有类型,如 `Text`(用于全文搜索)或 `Keyword`(用于精确匹配)。 2. **分析器(Analyzer)**:用于将文档内容分解...
**Lucene 概述** ...通过理解 Lucene 的核心概念,如 Analyzer、Document、Field 和查询机制,开发者可以有效地构建自己的文本检索系统。结合实际需求,可以进一步定制 Lucene 功能,以满足特定的应用场景。
### Lucene 使用教程 #### 一、Lucene简介与安装 **1.1 Lucene简介** Lucene是一款高性能、全功能的文本...Lucene的强大之处在于其灵活性和可扩展性,因此开发者可以根据具体的应用场景灵活地调整索引和查询策略。
《Lucene使用代码实例之搜索文档》 Lucene是一个高性能、全文检索库,它提供了强大的文本分析和索引功能,广泛应用于搜索引擎开发和其他需要高效文本处理的场景。本篇文章主要面向初学者,通过实例详细解释如何使用...
【使用Lucene进行简单的开发】 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它提供了完整的搜索功能,包括分析、索引和...随着对Lucene的深入理解和实践,你可以构建更强大的全文搜索引擎解决方案。
通过阅读和运行这个示例,你可以更直观地了解上述概念的实现。 总结来说,Lucene.NET为.NET开发者提供了强大的全文搜索工具,通过构建索引、多关键字匹配、搜索执行和结果处理,可以构建高效、灵活的全文搜索引擎。...
3. **文档索引**:使用Lucene的IndexWriter对象,将包含分词后的文本的Document对象写入索引库。每个Document对象代表一个待检索的文档,可以包含多个Field,如标题、内容等。 4. **查询执行**:构建Query对象,...
《Lucene 3.5:创建、增删改查详解》 ...然而,需要注意的是,尽管Lucene 3.5版本已经足够强大,但随着技术的发展,更现代的版本可能包含更多的优化和特性,对于新项目,建议考虑使用最新版的Lucene。