- 浏览: 96009 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
fengweiyou:
只取当前年月日 TRUNC(SYSDATE) 就可以了
oracle函数只取年月日 -
spp_1987:
我在页面上 显示出来的 怎么是乱码啊。 能解决下吗
是什 ...
struts+jquery -
spp_1987:
//JSONObject json = JSONObject. ...
struts+jquery -
spp_1987:
不知道为什么 有错啊。 我用的是DispatchAction啊 ...
struts+jquery -
hiteny:
还是css用着方便@ 谢谢啦
css控制字符串显示长度
关于FieldInfos类和FieldInfo类。
FieldInfo类与一个Document中的一个Field相对应,而FieldInfos类又是多个FieldInfo的容器,对每个Document的所有Field对应的FieldInfo进行管理。
FieldInfos类和FieldInfo类之间的关系,恰似SegmentInfos类(可以参考文章 Lucene-2.2.0 源代码阅读学习(18))和SegmentInfo类(可以参考文章 Lucene-2.2.0 源代码阅读学习(19))之间的关系。
FieldInfo类的实现比较简单,该类的定义如下所示:
上面就是2.2.0版本中FieldInfo类的全部定义。
下面是FieldInfos了的定义了,该类主要是通过FieldInfo来管理一个Document中的全部Field,源代码如下所示:
对FieldInfo类和FieldInfos类进行总结:
1、FieldInfo作为一个实体,保存了Field的一些主要的信息;
2、因为对Field的操作比较频繁,而每次管理都在内存中加载FieldInfo这个轻量级但信息很重要的对象,能够大大提高建立索引的速度;
3、FieldInfos包含的信息比较丰富,通过一个FieldInfo对象,调出Document中的Field到内存中,对每个Field进行详细的管理。
4、FieldInfos支持独立从索引目录中读取Document中的信息(主要根据Document参数,管理其中的Field),然后再写回到索引目录。
综合总结:
FieldInfos是对Document中的Field进行管理的,它主要是在内存中进行管理,然后写入到索引目录中。具体地,它所拥有的信息都被写入了一个与索引段文件相关的segments.fnm文件中(可以参考文章 Lucene-2.2.0 源代码阅读学习(21) ,在DocumentWriter类的addDocument()方法中可以看到)
DocumnetWriter类的实现,是在FieldInfos类的基础上。FieldInfos类对Document的所有的Field的静态信息进行管理,而DocumentWriter类表现出了更强大的管理Document的功能,主要是对Field进行了一些高级的操作,比如使用 Analyzer分析器进行分词、对切分出来的词条进行排序(文档倒排)等等。
下一步,就要仔细研究DocumnetWriter类了。
FieldInfo类与一个Document中的一个Field相对应,而FieldInfos类又是多个FieldInfo的容器,对每个Document的所有Field对应的FieldInfo进行管理。
FieldInfos类和FieldInfo类之间的关系,恰似SegmentInfos类(可以参考文章 Lucene-2.2.0 源代码阅读学习(18))和SegmentInfo类(可以参考文章 Lucene-2.2.0 源代码阅读学习(19))之间的关系。
FieldInfo类的实现比较简单,该类的定义如下所示:
package org.apache.lucene.index; final class FieldInfo { String name; // 一个Field的名称 boolean isIndexed; // 该Field是否被索引 int number; // 该Field的编号 // 是否存储该Field的词条向量 boolean storeTermVector; boolean storeOffsetWithTermVector; boolean storePositionWithTermVector; boolean omitNorms; // 是否忽略与被索引的该Field相关的norm文件信息 boolean storePayloads; // 是否该Field存储与词条位置相关的Payload // 构造一个FieldInfo对象 FieldInfo(String na, boolean tk, int nu, boolean storeTermVector, boolean storePositionWithTermVector, boolean storeOffsetWithTermVector, boolean omitNorms, boolean storePayloads) { name = na; isIndexed = tk; number = nu; this.storeTermVector = storeTermVector; this.storeOffsetWithTermVector = storeOffsetWithTermVector; this.storePositionWithTermVector = storePositionWithTermVector; this.omitNorms = omitNorms; this.storePayloads = storePayloads; } }
上面就是2.2.0版本中FieldInfo类的全部定义。
下面是FieldInfos了的定义了,该类主要是通过FieldInfo来管理一个Document中的全部Field,源代码如下所示:
package org.apache.lucene.index; import org.apache.lucene.document.Document; import org.apache.lucene.document.Fieldable; import org.apache.lucene.store.Directory; import org.apache.lucene.store.IndexInput; import org.apache.lucene.store.IndexOutput; import java.io.IOException; import java.util.*; // FieldInfo描述的是Document中的Field的信息,而FieldInfos类是用来管理一个个的FieldInfo的。 final class FieldInfos { // 下面一组byte成员,使用十六进制数初始化,用来管理FieldInfo的属性 static final byte IS_INDEXED = 0x1; // 是否索引 static final byte STORE_TERMVECTOR = 0x2; // 是否存储词条向量 static final byte STORE_POSITIONS_WITH_TERMVECTOR = 0x4; // 是否存储与词条向量相关的位置 static final byte STORE_OFFSET_WITH_TERMVECTOR = 0x8; // 是否存储与词条向量相关的offset static final byte OMIT_NORMS = 0x10; // 是否存储被忽略的norms static final byte STORE_PAYLOADS = 0x20; // 是否存储Payload private ArrayList byNumber = new ArrayList(); // byNumber是通过编号,用来存放FieldInfo的列表 private HashMap byName = new HashMap(); // byNname是通过名称,用来存放FieldInfo的列表 FieldInfos() { } // 没有参数的FieldInfos的构造函数 // 通过索引目录d和一个索引输入流name构造一个FieldInfos对象 FieldInfos(Directory d, String name) throws IOException { IndexInput input = d.openInput(name); try { read(input); // input输入流已打开,从索引目录中读取 } finally { input.close(); } } // 为一个Document添加Field的信息(这种添加和直接向Document中添加Field不一样,这次添加的不是一些固有信息,是一些更详细的补充信息) public void add(Document doc) { List fields = doc.getFields(); // 先获取到该Document中已经添加进去的所有Field Iterator fieldIterator = fields.iterator(); while (fieldIterator.hasNext()) { Fieldable field = (Fieldable) fieldIterator.next(); add(field.name(), field.isIndexed(), field.isTermVectorStored(), field.isStorePositionWithTermVector(), field .isStoreOffsetWithTermVector(), field .getOmitNorms()); // 传参,调用核心的add方法执行添加 } } /** * 添加被索引的Field,需要指定是否具有词条向量 */ public void addIndexed(Collection names, boolean storeTermVectors, boolean storePositionWithTermVector, boolean storeOffsetWithTermVector) { Iterator i = names.iterator(); while (i.hasNext()) { add((String) i.next(), true, storeTermVectors, storePositionWithTermVector, storeOffsetWithTermVector); } } /** * 当Field没有存储词条向量,添加Field * * @param names The names of the fields * @param isIndexed Whether the fields are indexed or not * * @see #add(String, boolean) */ public void add(Collection names, boolean isIndexed) { Iterator i = names.iterator(); while (i.hasNext()) { add((String) i.next(), isIndexed); } } /** * Calls 5 parameter add with false for all TermVector parameters. * * @param name The name of the Fieldable * @param isIndexed true if the field is indexed * @see #add(String, boolean, boolean, boolean, boolean) */ public void add(String name, boolean isIndexed) { add(name, isIndexed, false, false, false, false); } /** * Calls 5 parameter add with false for term vector positions and offsets. * * @param name The name of the field * @param isIndexed true if the field is indexed * @param storeTermVector true if the term vector should be stored */ public void add(String name, boolean isIndexed, boolean storeTermVector) { add(name, isIndexed, storeTermVector, false, false, false); } /** If the field is not yet known, adds it. If it is known, checks to make * sure that the isIndexed flag is the same as was given previously for this * field. If not - marks it as being indexed. Same goes for the TermVector * parameters. * * @param name The name of the field * @param isIndexed true if the field is indexed * @param storeTermVector true if the term vector should be stored * @param storePositionWithTermVector true if the term vector with positions should be stored * @param storeOffsetWithTermVector true if the term vector with offsets should be stored */ public void add(String name, boolean isIndexed, boolean storeTermVector, boolean storePositionWithTermVector, boolean storeOffsetWithTermVector) { add(name, isIndexed, storeTermVector, storePositionWithTermVector, storeOffsetWithTermVector, false); } /** If the field is not yet known, adds it. If it is known, checks to make * sure that the isIndexed flag is the same as was given previously for this * field. If not - marks it as being indexed. Same goes for the TermVector * parameters. * * @param name The name of the field * @param isIndexed true if the field is indexed * @param storeTermVector true if the term vector should be stored * @param storePositionWithTermVector true if the term vector with positions should be stored * @param storeOffsetWithTermVector true if the term vector with offsets should be stored * @param omitNorms true if the norms for the indexed field should be omitted */ public void add(String name, boolean isIndexed, boolean storeTermVector, boolean storePositionWithTermVector, boolean storeOffsetWithTermVector, boolean omitNorms) { add(name, isIndexed, storeTermVector, storePositionWithTermVector, storeOffsetWithTermVector, omitNorms, false); } /** 如果该Field没有被添加过,则添加它。如果已经添加过,核查后确保它的是否被索引标志位与已经存在的一致,如果是“不索引”标志,则修改标志位为true. *该add添加方法才是最核心的实现方法。 * @param name The name of the field * @param isIndexed true if the field is indexed * @param storeTermVector true if the term vector should be stored * @param storePositionWithTermVector true if the term vector with positions should be stored * @param storeOffsetWithTermVector true if the term vector with offsets should be stored * @param omitNorms true if the norms for the indexed field should be omitted * @param storePayloads true if payloads should be stored for this field */ public FieldInfo add(String name, boolean isIndexed, boolean storeTermVector, boolean storePositionWithTermVector, boolean storeOffsetWithTermVector, boolean omitNorms, boolean storePayloads) { FieldInfo fi = fieldInfo(name); // 根据指定的name构造一个FieldInfo对象 if (fi == null) { // 如果构造的FieldInfo为null,则调用addInternal()方法,重新构造一个 return addInternal(name, isIndexed, storeTermVector, storePositionWithTermVector, storeOffsetWithTermVector, omitNorms, storePayloads); } else { // 如果构造的FieldInfo不为null(即已经存在一个相同name的FieldInfo) if (fi.isIndexed != isIndexed) { // 如果存在的FieldInfo被索引 fi.isIndexed = true; // 一旦被索引了,总是索引 } if (fi.storeTermVector != storeTermVector) { fi.storeTermVector = true; // 一旦存储词条向量,总是存储 } if (fi.storePositionWithTermVector != storePositionWithTermVector) { fi.storePositionWithTermVector = true; // once vector, always vector } if (fi.storeOffsetWithTermVector != storeOffsetWithTermVector) { fi.storeOffsetWithTermVector = true; // once vector, always vector } if (fi.omitNorms != omitNorms) { fi.omitNorms = false; // 一旦存储norms,则总是存储norms } if (fi.storePayloads != storePayloads) { fi.storePayloads = true; } } return fi; // 返回一个FieldInfo对象 } private FieldInfo addInternal(String name, boolean isIndexed, boolean storeTermVector, boolean storePositionWithTermVector, boolean storeOffsetWithTermVector, boolean omitNorms, boolean storePayloads) { FieldInfo fi = new FieldInfo(name, isIndexed, byNumber.size(), storeTermVector, storePositionWithTermVector, storeOffsetWithTermVector, omitNorms, storePayloads); byNumber.add(fi); // byNumber是一个List,将构造的FieldInfo加入到列表中 byName.put(name, fi); // byName是一个HashMap,其中的键值对<name,fi>表示一个名字为键,一个FieldInfo对象的引用作为值 return fi; } public int fieldNumber(String fieldName) { // 根据指定的Field的名称,获取该Field的编号 try { FieldInfo fi = fieldInfo(fieldName); if (fi != null) return fi.number; } catch (IndexOutOfBoundsException ioobe) { return -1; } return -1; } public FieldInfo fieldInfo(String fieldName) { // 根据指定的Field的名称,从byName列表中取出该Field return (FieldInfo) byName.get(fieldName); } // 根据指定的编号,获取Field的名称name public String fieldName(int fieldNumber) { try { return fieldInfo(fieldNumber).name; } catch (NullPointerException npe) { return ""; } } // 根据指定的Field的编号,获取一个FieldInfo对象 public FieldInfo fieldInfo(int fieldNumber) { try { return (FieldInfo) byNumber.get(fieldNumber); // 从byNymber列表中取出索引为指定fieldNumber的FieldInfo对象 } catch (IndexOutOfBoundsException ioobe) { return null; } } public int size() { // 计算byName这个HashMap的大小 return byNumber.size(); } public boolean hasVectors() { // 返回byName这个HashMap中FieldInfo指定对应的Field不存储词条向量的标志值,即false boolean hasVectors = false; for (int i = 0; i < size(); i++) { if (fieldInfo(i).storeTermVector) { hasVectors = true; break; } } return hasVectors; } public void write(Directory d, String name) throws IOException { // 将FieldInfo的信息输出到索引目录中,name是索引目录中存在的索引段文件名segments.fnm(可以参考文章 Lucene-2.2.0 源代码阅读学习(21) 中,DocumentWriter的addDocument()方法) IndexOutput output = d.createOutput(name); try { write(output); // 调用下面的write方法,对FieldInfo的信息进行格式化(输出)写入索引目录 } finally { output.close(); } } public void write(IndexOutput output) throws IOException { // 对FieldInfo的信息进行格式化(输出)写入索引目录 output.writeVInt(size()); for (int i = 0; i < size(); i++) { FieldInfo fi = fieldInfo(i); byte bits = 0x0; if (fi.isIndexed) bits |= IS_INDEXED; if (fi.storeTermVector) bits |= STORE_TERMVECTOR; if (fi.storePositionWithTermVector) bits |= STORE_POSITIONS_WITH_TERMVECTOR; if (fi.storeOffsetWithTermVector) bits |= STORE_OFFSET_WITH_TERMVECTOR; if (fi.omitNorms) bits |= OMIT_NORMS; if (fi.storePayloads) bits |= STORE_PAYLOADS; output.writeString(fi.name); output.writeByte(bits); } } private void read(IndexInput input) throws IOException { // 通过打开一个输入流,读取FieldInfo的信息 int size = input.readVInt();//read in the size for (int i = 0; i < size; i++) { String name = input.readString().intern(); byte bits = input.readByte(); boolean isIndexed = (bits & IS_INDEXED) != 0; boolean storeTermVector = (bits & STORE_TERMVECTOR) != 0; boolean storePositionsWithTermVector = (bits & STORE_POSITIONS_WITH_TERMVECTOR) != 0; boolean storeOffsetWithTermVector = (bits & STORE_OFFSET_WITH_TERMVECTOR) != 0; boolean omitNorms = (bits & OMIT_NORMS) != 0; boolean storePayloads = (bits & STORE_PAYLOADS) != 0; addInternal(name, isIndexed, storeTermVector, storePositionsWithTermVector, storeOffsetWithTermVector, omitNorms, storePayloads); // 调用addInternal()在内存中构造一个FieldInfo对象,对它进行管理 } } }
对FieldInfo类和FieldInfos类进行总结:
1、FieldInfo作为一个实体,保存了Field的一些主要的信息;
2、因为对Field的操作比较频繁,而每次管理都在内存中加载FieldInfo这个轻量级但信息很重要的对象,能够大大提高建立索引的速度;
3、FieldInfos包含的信息比较丰富,通过一个FieldInfo对象,调出Document中的Field到内存中,对每个Field进行详细的管理。
4、FieldInfos支持独立从索引目录中读取Document中的信息(主要根据Document参数,管理其中的Field),然后再写回到索引目录。
综合总结:
FieldInfos是对Document中的Field进行管理的,它主要是在内存中进行管理,然后写入到索引目录中。具体地,它所拥有的信息都被写入了一个与索引段文件相关的segments.fnm文件中(可以参考文章 Lucene-2.2.0 源代码阅读学习(21) ,在DocumentWriter类的addDocument()方法中可以看到)
DocumnetWriter类的实现,是在FieldInfos类的基础上。FieldInfos类对Document的所有的Field的静态信息进行管理,而DocumentWriter类表现出了更强大的管理Document的功能,主要是对Field进行了一些高级的操作,比如使用 Analyzer分析器进行分词、对切分出来的词条进行排序(文档倒排)等等。
下一步,就要仔细研究DocumnetWriter类了。
发表评论
-
Lucene学习(21)
2009-10-30 11:12 846回到IndexWriter索引器类中来,学习该类添加Docum ... -
Lucene学习(20)
2009-10-30 11:06 1032关于Field类和Document类。 ... -
Lucene学习(19)
2009-10-30 11:01 822研究SegmentInfo类的实现 ... -
Lucene学习(18)
2009-10-30 10:47 1875关于SegmentInfos类的具体 ... -
Lucene学习(17)
2009-10-30 10:40 856根据16中对IndexFileDeleter ... -
Lucene学习(16)
2009-10-30 10:33 1072在接触到索引删除的策略IndexDeletionPolicy ... -
Lucene学习(15)
2009-10-30 10:28 876关于索引删除的策略IndexDeletionPolicy 。 ... -
Lucene学习(14)
2009-10-30 10:23 759RAMDirectory类是与内存目录相关的,它和FSDire ... -
Lucene学习(13)
2009-10-30 10:21 1369Directory抽象类比较常用的具体实现子类应该是FSDir ... -
Lucene学习(12)
2009-10-30 10:17 695接着昨天学习的Lucene-2.3.1 源代码阅读学习(11) ... -
Lucene学习(11)
2009-10-30 10:06 1120对数据源进行分析,是为建立索引服务的;为指定的文件建立索引,是 ... -
Lucene学习(10)
2009-10-30 10:02 839Lucene的CJKAnalyzer分析器。 CJKAnal ... -
Lucene学习(9)
2009-10-30 09:34 915Lucene的StandardAnalyzer分析器。 ... -
Lucene学习(8)
2009-10-30 09:27 816Lucene分析器的实现。 Lucene(分词)过滤器Tok ... -
Lucene学习(7)
2009-10-30 09:22 756CharTokenizer是一个抽象类 ... -
Lucene学习(6)
2009-10-29 16:16 861Lucene分析器的实现。 Lucene分词器Tokeniz ... -
Lucene学习(5)
2009-10-29 16:13 898研究Lucene分析器的实现。 Analyzer抽象类 ... -
Lucene学习(4)
2009-10-29 16:09 881建立索引,通过已经生成的索引文件,实现通过关键字检索。 ... -
Lucene学习(3)
2009-10-29 16:06 845org.apache.lucene.demo.IndexFil ... -
Lucene学习(2)
2009-10-29 15:59 811IndexWriter是一个非常重要的工具。建立索引必须从它开 ...
相关推荐
1> lucene学习笔记 2> 全文检索的实现机制 【1】lucene学习笔记的目录如下 1. 概述 3 2. lucene 的包结构 3 3. 索引文件格式 3 4. lucene中主要的类 4 4.1. Document文档类 4 4.1.1. 常用方法 4 4.1.2. 示例 4 4.2...
在前面Lucene-2.2.0 源代码阅读学习(1)中,根据Lucene提供的一个Demo,详细分析研究一下索引器org.apache.lucene.index.IndexWriter类,看看它是如果定义的,掌握它建立索引的机制。 通过IndexWriter类的实现源代码...
- **技术选型**:考虑引入更多前沿技术,如分布式索引技术、深度学习等,以增强搜索系统的智能化水平。 - **用户体验**:不断优化搜索结果的展示形式,提供更丰富的筛选条件和个性化推荐功能,提升用户体验。 综上...
熟悉日志框架(如Log4J)、任务调度(如Quartz)、分布式缓存(如JCache)、全文搜索(如Lucene)等常用框架和API。 #### 21. 本地接口与连接器架构 学习Java Native Interface(JNI)和Java Connector ...
#### 目标22:学习全文搜索技术 - **技术框架**:Lucene等。 - **应用场景**:网站搜索、文档检索等。 #### 目标23:学习本地接口技术 - **关键技术**:JNI(Java Native Interface)。 - **应用场景**:与操作...
#### 22. **应用服务器** - WebLogic、JBoss等应用服务器的部署和配置,以及集群和负载均衡策略。 #### 23. **面向切面编程(AOP)** - 使用AspectJ、AspectWerkz等框架增强代码,实现日志记录、事务管理等横切关注...
##### 22. Log4J - **简介**:一个流行的日志记录框架。 - **链接**:[http://logging.apache.org/log4j/1.2/](http://logging.apache.org/log4j/1.2/) - **核心特性**: - 日志记录 - 输出格式化 - 灵活的日志...
│ workspace.zip │ 列表生成.reg │ 淘淘商城源代码.zip │ ├─01....│ 01....│ 02....│ 03....│ 04....│ 08....├─02....│ 07....│ 01....│ 02....│ 03....│ 04....│ 05....│ 06....│ 08....│ 10....│ 13....├─03....│ 01....│ 02....
32. **Apache Lucene**:搜索引擎库,包含文本分析组件,适用于信息检索和NLP应用。 33. **GATE (General Architecture for Text Engineering)**:综合的NLP框架,支持多种任务的开发和评估。 34. **Apache Tika**...
1.4 nutch VS lucene.....2 2. nutch的安装与配置.....3 2.1 JDK的安装与配置.3 2.2 nutch的安装与配置........5 2.3 tomcat的安装与配置......5 3. nutch初体验7 3.1 爬行企业内部网....7 3.1.1 配置nutch.....
1.4 nutch VS lucene.....2 2. nutch的安装与配置.....3 2.1 JDK的安装与配置.3 2.2 nutch的安装与配置........5 2.3 tomcat的安装与配置......5 3. nutch初体验7 3.1 爬行企业内部网....7 3.1.1 配置nutch....7 ...
### Windows系统下Nutch检索工具的搭建步骤 #### 一、引言 随着互联网的快速发展,数据...Nutch不仅适合初学者学习,也是专业人士进行大规模网页爬取的强大工具。希望本文能为读者提供帮助,促进信息检索技术的发展。
3.6 良好的学习平台 23 第4章 开源软件的成本 25 4.1 部署和迁移成本 25 4.2 人员和培训成本 26 4.3 管理维护和技术支持成本 27 4.4 风险控制成本 28 第2篇 使用开源软件 第5章 正确使用开源软件 32 5.1 管理体制 32...
22. **DK-DMYSQL**:大快科技对MySQL的分布式改造,提升分布式环境下的数据库性能。 23. **Apache Falcon**:数据处理和管理平台,用于数据移动、管道协调和生命周期管理。 24. **Apache Knox**:Hadoop集群的REST...
2012-06-13 13:38 9,178,682 Lucene 3.0 原理与代码分析完整版.pdf 2012-06-13 13:46 10,582,426 姚晨屏保(宽屏).exe 2012-06-13 13:10 23,625,694 Visual.C.系统开发实例精粹(源代码).7z 2012-06-13 13:46 25,062,...
##### 22. ORO - **简介**: ORO (Object Regular Expression)是一个正则表达式库,支持Perl风格的正则表达式。 - **特点**: ORO提供了强大的字符串匹配和替换功能,适用于文本处理任务。 ##### 23. POI - **简介**:...
在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是企业级应用开发的重要标准,涵盖了一系列技术和框架。作为一名J2EE程序员,你需要掌握...不断学习和实践,跟上J2EE技术的发展趋势,是保持竞争力的关键。