- 浏览: 160171 次
- 性别:
- 来自: 北京
最新评论
-
w156445045:
我最近想写这方面的论文,学位论文啊,哎。希望博主能给点思路,谢 ...
《Lucene+Nutch搜索引擎》看过以后。。。 -
inprice:
这也要研究啊!!!!! 失望ing.........
完成了对于heritrix的初步研究 -
dt_fb:
您好,我想问问您,你有跳过recrawl.sh这个脚本文件么? ...
Nutch开源搜索引擎的crawl日志分析及工作目录说明 -
lovepoem:
能增量吗?是不是还是把所有的url遍历出来。和以前的对比。算是 ...
Nutch开源搜索引擎增量索引recrawl的终极解决办法 -
itang:
见到牛人照片了, MS下巴动过刀(开玩笑)
搜索引擎名人堂之Jeff Dean
Document 包分析
理解 Document
Lucene 没有定义数据源 , 而是定义了一个通用的文档结构 , 这个文档结构就是 LuceneDocument 包下的 Document 类 .
一个 Document 对应于你在进行网页抓取的时候一个 msword, 一个 pdf, 一个 html, 一个 text 等 .Lucene 的这种形式可以定义
非常灵活的应用 , 只要前端有相应的转换器把数据源转成 Document 结构就可以了 .
一个 Document 内部维护一个 Field 的 vector.
好 , 我们一起来看一下 document 的核心源码 ( 只有定义 , 没有实现 )
public final class Document implements java.io.Serializable {
List fields = new Vector();// 成员变量
//boost 用来表示此 document 的重要程度 , 默认为 1.0, 会作用于 document 中的所有的 field
private float boost = 1.0f;
public Document() {}
public void setBoost(float boost) {this.boost = boost;}
public float getBoost() {return boost;}
public final void add(Field field)
public final void removeField(String name)
public final void removeFields(String name)
public final Field getField(String name)
public final String get(String name)
public final Enumeration fields()
public final Field[] getFields(String name)
public final String[] getValues(String name)
public final String toString()
理解 Field
刚才提到一个 Document 中有一个用来存储 Field 的 vector, 那么什么是 Field. 你可以简单的认为 Field 是一个 <name,value>
name 为域( Field )的名字,例如 title , body , subject , data 等等。 value 就是文本。我们来看一下源码定义 , 不就 OK 了 .
( 由于 Field 是 Lucene 中非常重要的概念 , 所以我们拿来源码看一下 )
public final class Field implements java.io.Serializable {
private String name = "body";
private String stringValue = null;
private boolean storeTermVector = false;
private Reader readerValue = null;
private boolean isStored = false;
private boolean isIndexed = true;
private boolean isTokenized = true;
/* 以前一直不了解 boost 为何?其实 boost 就是由于后来进行相关度排序时用的 , 由于在 query 时,
* 每个 term 都分属与一个 field 。同样的 term 当其属于不同的 field 时,其重要性不一样,譬如
*field:<title> 中的 term 就要比 field:<content> 中的 term 重要!而这个重要性如何体现就
* 可以通过 boost 进行设定。可以把 field:<title> 的 boost 至设大一些
* 注意 boost 在 Document 中还有整个的设定 .
*/
private float boost = 1.0f;
public void setBoost(float boost) {this.boost = boost;}
public float getBoost() { return boost;}
public static final Field Keyword(String name, String value) {return new Field(name, value, true, true, false);}
public static final Field UnIndexed(String name, String value) {return new Field(name, value, true, false, false);}
public static final Field Text(String name, String value) {return Text(name, value, false);}
public static final Field Keyword(String name, Date value) {return new Field(name, DateField.dateToString(value), true, true, false);}
public static final Field Text(String name, String value, boolean storeTermVector) {
return new Field(name, value, true, true, true, storeTermVector);}
public static final Field UnStored(String name, String value) {
return UnStored(name, value, false);}
public static final Field UnStored(String name, String value, boolean storeTermVector) {
return new Field(name, value, false, true, true, storeTermVector); }
public static final Field Text(String name, Reader value) {
return Text(name, value, false);}
public static final Field Text(String name, Reader value, boolean storeTermVector) {
Field f = new Field(name, value);
f.storeTermVector = storeTermVector;
return f;
}
public String name() { return name; }
public String stringValue() { return stringValue; }
public Reader readerValue() { return readerValue; }
public Field(String name, String string,
boolean store, boolean index, boolean token) {
this(name, string, store, index, token, false);
}
// 最低层的构造函数
public Field(String name, String string,
boolean store, boolean index, boolean token, boolean storeTermVector)
Field(String name, Reader reader)
public final boolean isStored() { return isStored; }
public final boolean isIndexed() { return isIndexed; }
public final boolean isTokenized() { return isTokenized; }
public final boolean isTermVectorStored() { return storeTermVector; }
public final String toString()
public final String toString2()// 我加的用来返回六元组
}
代码可能看起来有点长 , 不过看一下就知道了 Field 其实是一个六元组 , 咱们上文说其是 <name,value> 对是一种简化形式 .
Field 的六元组形式为 <name,stringValue,isStored,isIndexed,isTokenized,isTermVectorStored>,Field 提供了不同的构造函数
主要有一下几个
方法 |
切词 |
索引 |
存储 |
用途 |
Field.Text(String name, String value) |
Yes |
Yes |
Yes |
切分 , 索引 , 并存储,比如: title , subject |
Field Text(String name, Reader value) |
Yes |
Yes |
Yes |
与上面同 , Term Vector 并不存储此 Field |
Field Text(String name, String value, boolean storeTermVector) |
Yes |
Yes |
Yes |
切分 , 索引 , 存储,比如: title,subject. 于上面不同的加入了一个控制变量 |
Field Text(String name, Reader value, boolean storeTermVector) |
Yes |
Yes |
Yes |
切分 , 索引 , 存储,比如: title,subject. 于上面不同的加入了一个控制变量 |
Field.Keyword(String name, String value) |
No |
Yes |
Yes |
不切分 , 索引 , 存储,比如: date,url |
Field Keyword(String name, Date value) |
|
|
|
不切分 , 存储 , 索引 , 用来返回 hits |
Field.UnIndexed(String name, String value) |
No |
No |
Yes |
不切分 , 不索引,存储,比如:文件路径 |
Field.UnStored(String name, String value) |
Yes |
Yes |
No |
只全文索引,不存储 |
Field UnStored(String name, String value, boolean storeTermVector) |
Yes |
Yes |
No |
于上面相同 , 不同的是加入了一个控制变量 |
总的来看 ,Field 的构造函数就只有四种形式 ,Text,KeyWord,UnIndexed,UnStored, 只不过每种函数往往有多种变形罢了 .
编一段代码来测试一下 Document 类和 Field 类
public class TestDocument
{
private Document makeDocumentWithFields() throws IOException
{
Document doc = new Document();
doc.add(Field.Text("title","title"));
doc.add(Field.Text("subject","ubject"));
doc.add(Field.Keyword("date","2005.11.12"));
doc.add(Field.Keyword("url","www.tju.edu.cn"));
doc.add(Field.UnIndexed("filepath","D:\\Lucene"));
doc.add(Field.UnStored("unstored","This field is unstored"));
Field field;
for(int i=0;i<doc.fields.size();i++)
{
field =(Field)doc.fields.get(i);
System.out.println(field.toString());
System.out.println(" 对应的六元组形式为 ");
System.out.println(field.toString2());
}
return doc;
}
public void GetValuesForIndexedDocument() throws IOException
{
RAMDirectory dir = new RAMDirectory();
IndexWriter writer = new IndexWriter(dir,new StandardAnalyzer(),true);
writer.addDocument(makeDocumentWithFields());
writer.close();
Searcher searcher = new IndexSearcher(dir);
Query query = new TermQuery(new Term("title","title"));
//Hits 由匹配的 Document 组成 .
Hits hits = searcher.search(query);
System.out.println("Document 的结构形式 ");
System.out.println(hits.doc(0));
<spa>
发表评论
-
Nutch1.0开源搜索引擎与Paoding在eclipse中用plugin方式集成(终极篇)
2009-09-14 13:15 4341本文主要描述的是如何将paoding分词用plugi ... -
Nutch1.0的那些事
2009-09-10 12:37 2203很久没有更新博客了,应该快一年了。现在呢,我把去年 ... -
配置linux服务器之间ssh不用密码访问
2008-11-05 13:55 3916在配置nutch的时候,我 ... -
搜索引擎术语
2008-10-15 15:30 2552最近monner兄共享了一篇 ... -
搜索引擎机器人研究报告
2008-10-13 15:35 1933从该文对googlebot的分析看,googlebot似乎是想 ... -
搜索引擎算法研究
2008-10-13 15:11 21251.引言 万维网WWW(World Wide Web ... -
谁说搜索引擎只关注结果-看我viewzi的72变
2008-10-04 20:15 1842搜索引擎给大家的感觉,就是用起来简单,以google为首,一个 ... -
《Lucene+Nutch搜索引擎》看过以后。。。
2008-10-03 23:42 7643研究搜索引擎技术快一 ... -
微软有趣的人物关系搜索引擎——人立方
2008-10-03 20:00 3976最近,微软亚洲研究院 ... -
Nutch开源搜索引擎增量索引recrawl的终极解决办法(续)
2008-09-28 19:30 3481十一要放假了,先祝广大同学们节日快乐! 在之前的一篇文章中, ... -
Nutch:一个灵活可扩展的开源web搜索引擎
2008-09-28 11:46 2271在网上找到一篇于2004年11月由CommerceNet La ... -
Google公司都是些什么牛人?
2008-09-27 17:31 2082Google公司都是些什么牛人? 1 Vi ... -
搜索引擎名人堂之Doug Cutting
2008-09-27 11:41 2647Doug Cutting是一个开源搜索技术的提倡者和创造者。他 ... -
Nutch开源搜索引擎增量索引recrawl的终极解决办法
2008-09-26 19:12 5182本文重点是介绍Nutch开源搜索引擎如何在Hadoop分布式计 ... -
Nutch开源搜索引擎与Paoding中文分词用plugin方式集成
2008-09-26 15:31 4597本文是我在集成中文分词paoding时积累的经验,单独成一篇文 ... -
关于Hadoop的MapReduce纯技术点文章
2008-09-24 18:10 3523本文重点讲述Hadoop的整 ... -
MapReduce-免费午餐还没有结束?
2008-09-24 09:57 1489Map Reduce - the Free Lunch is ... -
搜索引擎名人堂之Jeff Dean
2008-09-22 15:09 14983最近一直在研究Nutch,所以关注到了搜索引擎界的一些名人,以 ... -
Lucene于搜索引擎技术(Analysis包详解)
2008-09-22 14:55 2228Analysis 包分析 ... -
Lucene的查询语法
2008-09-22 14:53 1419原文来自:http://liyu2000.nease.net/ ...
相关推荐
本文将深入探讨Lucene搜索引擎的配置过程,包括文件加载、索引创建和搜索操作,帮助你理解其核心技术。 ### 文件加载 在Lucene中,首先需要将待搜索的数据加载到内存或磁盘上的某个结构中。这通常涉及到读取各种...
**基于Java的Lucene全文搜索引擎资源简单实例** Lucene是一个由Apache软件基金会开发的开源全文检索库,它为Java开发者提供了强大的文本搜索功能。Lucene是高性能、可扩展的信息检索库,可以集成到各种Java应用中,...
《Lucene与Nutch搜索引擎开发实例详解》 在信息技术领域,搜索引擎已经成为不可或缺的一部分,它们能够高效地处理海量数据,帮助用户快速找到所需信息。本文将深入探讨基于Java的开源搜索引擎框架——Lucene和Nutch...
**Lucene搜索引擎Demo详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,是Java编程语言中广泛使用的搜索引擎框架。它提供了强大的索引和搜索功能,使得开发者能够轻松地在应用中集成高级的文本...
**基于Lucene搜索引擎的Java源码详解** Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。此Java源码包提供了一个全面的示例,展示了如何利用Lucene进行索引创建、更新(增量索引)以及搜索操作。...
**基于Lucene的简单搜索引擎构建详解** Lucene是Apache软件基金会的一个开源项目,它是一个高性能、全文本搜索库,提供了一个强大的信息检索引擎框架。这个压缩包“基于lucene 的简单搜索引擎.rar”很可能是为了...
《lucene、lucene.NET 详细使用与优化详解》 lucene 是一个广泛使用的全文搜索引擎库,其.NET版本称为lucene.NET,它提供了强大的文本检索和分析能力,适用于各种场景下的全文搜索需求。lucene 并非一个可以直接...
《基于Lucene 3.6平台的搜索工具详解与应用指南》 Lucene是一个高性能、全文本搜索引擎库,由Apache软件基金会开发并维护。在3.6版本中,Lucene提供了一套完整的搜索解决方案,包括索引构建、查询解析、结果排序等...
**Lucene分词与查询详解** Lucene是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发中。它提供了一套强大的API,用于索引文本数据,并执行复杂的查询操作。在深入理解Lucene的分词与查询机制之前,我们...
Lucene 是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高性能、可扩展的文本搜索功能,被广泛应用于各种项目和产品中。Lucene 5.2.1是该库的一个重要版本,包含了多项优化和新特性。本实例教程将...
《基于Lucene.NET和.NET爬虫的简单搜索引擎构建详解》 搜索引擎是互联网信息时代的关键工具,它能够快速、准确地帮助用户找到所需的信息。本文将深入探讨如何利用Lucene.NET和.NET爬虫技术构建一个简单的搜索引擎,...
总的来说,"lucene_jar包"是实现高效全文检索的关键工具,它提供了强大的搜索功能,让开发者能够轻松地在Java应用中集成搜索引擎。通过深入理解和熟练使用Lucene,可以提升应用的用户体验,实现更智能、更快速的信息...
**Lucene.NET 2.9 搜索引擎源代码解析** Lucene.NET 是一个基于 Apache Lucene 的全文搜索引擎库,它是用 C# 实现的。Apache Lucene 是一个高性能、可扩展的信息检索库,广泛用于构建复杂的搜索功能。Lucene.NET ...
Lucene是一个由Java编写的高性能、可扩展的全文搜索引擎库。它提供了一种机制,使得开发者能够轻松地为自己的应用程序添加索引和搜索功能。作为Apache软件基金会的项目,Lucene具有开源和免费的特性,受到Apache软件...
**搜索引擎Lucene详解** 搜索引擎Lucene是Apache软件基金会下的一个开放源代码全文检索库,它提供了高效的、可扩展的文本搜索功能。Lucene的核心功能包括文档索引、搜索以及相关的排序算法,使得开发者能够轻松地在...
Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎和站内搜索解决方案中。它提供了丰富的文本分析、索引和搜索功能,使得开发者能够轻松地在自己的应用程序中实现复杂的全文检索...
### 利用Lucene构建个性化搜索引擎的关键技术与实践 #### 概述 随着互联网的快速发展,搜索引擎已成为人们获取信息不可或缺的工具。当前市场上知名的搜索引擎如Google、Yahoo、百度等不仅推动了信息技术的进步,也...
Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会开发并维护。作为Java平台上的一个高性能、可扩展的信息检索库,Lucene 提供了强大的文本分析、索引构建、搜索功能,并且能够轻松集成到各种应用中。此次...
**Lucene 搜索引擎实现详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会维护。它提供了一套强大的数据结构和算法,用于高效地存储和检索大量文本数据。通过 Lucene,开发者可以轻松地在自己的应用...