Lucene与搜索引擎技术(Document包详解)

来源:百度文库 编辑:神马文学网 时间:2024/04/30 00:29:05
Lucene与搜索引擎技术(Document包详解)
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为域(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:中的term就要比field:<content>中的term重要!而这个重要性如何体现就<br>*可以通过boost进行设定。可以把field:<title>的boost至设大一些<br>*注意boost在Document中还有整个的设定.<br>*/<br>private float   boost = 1.0f;<br>public void setBoost(float boost) {this.boost = boost;}<br>public float getBoost() { return boost;}<br>public static final Field Keyword(String name, String value) {return new Field(name, value, true, true, false);}<br>public static final Field UnIndexed(String name, String value) {return new Field(name, value, true, false, false);}<br>public static final Field Text(String name, String value) {return Text(name, value, false);}<br>public static final Field Keyword(String name, Date value) {return new Field(name, DateField.dateToString(value), true, true, false);}<br>public static final Field Text(String name, String value, boolean storeTermVector) {<br>return new Field(name, value, true, true, true, storeTermVector);}<br>public static final Field UnStored(String name, String value) {<br>return UnStored(name, value, false);}<br>public static final Field UnStored(String name, String value, boolean storeTermVector) {<br>return new Field(name, value, false, true, true, storeTermVector); }<br>public static final Field Text(String name, Reader value) {<br>return Text(name, value, false);}<br>public static final Field Text(String name, Reader value, boolean storeTermVector) {<br>Field f = new Field(name, value);<br>f.storeTermVector = storeTermVector;<br>return f;<br>}<br>public String name()         { return name; }<br>public String stringValue()         { return stringValue; }<br>public Reader readerValue()       { return readerValue; }<br>public Field(String name, String string,<br>boolean store, boolean index, boolean token) {<br>this(name, string, store, index, token, false);<br>}<br>//最低层的构造函数<br>public Field(String name, String string,<br>boolean store, boolean index, boolean token, boolean storeTermVector)<br>Field(String name, Reader reader)<br>public final boolean    isStored()      { return isStored; }<br>public final boolean    isIndexed()    { return isIndexed; }<br>public final boolean    isTokenized()        { return isTokenized; }<br>public final boolean isTermVectorStored() { return storeTermVector; }<br>public final String toString()<br>public final String toString2()//我加的用来返回六元组<br>}<br>代码可能看起来有点长,不过看一下就知道了Field其实是一个六元组,咱们上文说其是<name,value>对是一种简化形式.<br>Field的六元组形式为<name,stringValue,isStored,isIndexed,isTokenized,isTermVectorStored>,Field提供了不同的构造函数<br>主要有一下几个<br>方法<br>切词<br>索引<br>存储<br>用途<br>Field.Text(String name, String value)<br>Yes<br>Yes<br>Yes<br>切分,索引,并存储,比如:title,subject<br>Field Text(String name, Reader value)<br>Yes<br>Yes<br>Yes<br>与上面同, Term Vector并不存储此Field<br>Field Text(String name, String value, boolean storeTermVector)<br>Yes<br>Yes<br>Yes<br>切分,索引,存储,比如:title,subject.于上面不同的加入了一个控制变量<br>Field Text(String name, Reader value, boolean storeTermVector)<br>Yes<br>Yes<br>Yes<br>切分,索引,存储,比如:title,subject.于上面不同的加入了一个控制变量<br>Field.Keyword(String name, String value)<br>No<br>Yes<br>Yes<br>不切分,索引,存储,比如:date,url<br>Field Keyword(String name, Date value)<br>不切分,存储,索引,用来返回hits<br>Field.UnIndexed(String name, String value)<br>No<br>No<br>Yes<br>不切分,不索引,存储,比如:文件路径<br>Field.UnStored(String name, String value)<br>Yes<br>Yes<br>No<br>只全文索引,不存储<br>Field UnStored(String name, String value, boolean storeTermVector)<br>Yes<br>Yes<br>No<br>于上面相同,不同的是加入了一个控制变量<br>总的来看,Field的构造函数就只有四种形式,Text,KeyWord,UnIndexed,UnStored,只不过每种函数往往有多种变形罢了.<br>编一段代码来测试一下Document类和Field类<br>public class TestDocument<br>{<br>private Document makeDocumentWithFields() throws IOException<br>{<br>Document doc = new Document();<br>doc.add(Field.Text("title","title"));<br>doc.add(Field.Text("subject","ubject"));<br>doc.add(Field.Keyword("date","2005.11.12"));<br>doc.add(Field.Keyword("url","www.tju.edu.cn"));<br>doc.add(Field.UnIndexed("filepath","D:\\Lucene"));<br>doc.add(Field.UnStored("unstored","This field is unstored"));<br>Field field;<br>for(int i=0;i<doc.fields.size();i++)<br>{<br>field =(Field)doc.fields.get(i);<br>System.out.println(field.toString());<br>System.out.println("对应的六元组形式为");<br>System.out.println(field.toString2());<br>}<br>return doc;<br>}<br>public void GetValuesForIndexedDocument() throws IOException<br>{<br>RAMDirectory dir = new RAMDirectory();<br>IndexWriter writer = new IndexWriter(dir,new StandardAnalyzer(),true);<br>writer.addDocument(makeDocumentWithFields());<br>writer.close();<br>Searcher searcher = new IndexSearcher(dir);<br>Query query = new TermQuery(new Term("title","title"));<br>//Hits 由匹配的Document组成.<br>Hits hits = searcher.search(query);<br>System.out.println("Document的结构形式");<br>System.out.println(hits.doc(0));<br>}<br>public static void main(String [] args)<br>{<br>TestDocument testDocument = new TestDocument();<br>try<br>{<br>testDocument.GetValuesForIndexedDocument();<br>}<br>catch (IOException ioe)<br>{<br>ioe.printStackTrace();<br>}<br>}<br>}<br>其结果如下:<br>Text<title:title><br>对应的六元组形式为<br>Field:<name,stringValue,isStored,isIndexed,isTokenized,isTermVectorStored> is:<title,title,true,true,true,false><br>Text<subject:ubject><br>对应的六元组形式为<br>Field:<name,stringValue,isStored,isIndexed,isTokenized,isTermVectorStored> is:<subject,ubject,true,true,true,false><br>Keyword<date:2005.11.12><br>对应的六元组形式为<br>Field:<name,stringValue,isStored,isIndexed,isTokenized,isTermVectorStored> is:<date,2005.11.12,true,true,false,false><br>Keyword<url:www.tju.edu.cn><br>对应的六元组形式为<br>Field:<name,stringValue,isStored,isIndexed,isTokenized,isTermVectorStored> is:<url,www.tju.edu.cn,true,true,false,false><br>Unindexed<filepath:D:\Lucene><br>对应的六元组形式为<br>Field:<name,stringValue,isStored,isIndexed,isTokenized,isTermVectorStored> is:<filepath,D:\Lucene,true,false,false,false><br>UnStored<unstored><br>对应的六元组形式为<br>Field:<name,stringValue,isStored,isIndexed,isTokenized,isTermVectorStored>is:<unstored,This field is unstored,false,true,true,false><br>Document的结构形式<br>Document<Text<title:title> Text<subject:ubject> Keyword<date:2005.11.12> Keyword<url:www.tju.edu.cn> Unindexed<filepath:D:\Lucene>><br>相信当你看着输出结果时,你会对Document和Field这两个类有更好的认识!Document和Field是Lucene中非常重要索引的基本概念,所以需要好好理解.</div> <div class="list-group"> <a href="/article/15143" class="list-group-item">Lucene与搜索引擎技术(Document包详解)</a> <a href="/article/15142" class="list-group-item">Lucene与搜索引擎技术(index包详解)</a> <a href="/article/15144" class="list-group-item">Lucene于搜索引擎技术(Analysis包详解)</a> <a href="/article/213949" class="list-group-item">Lucene于搜索引擎技术(Analysis包详解) - 小小笔记 - DonewsBlo...</a> <a href="/article/66029" class="list-group-item">百度笔试 - 专注于搜索引擎技术(Lucene,Nutch) - DonewsBlog</a> <a href="/article/1844759" class="list-group-item">百度笔试 - 专注于搜索引擎技术(Lucene,Nutch)</a> <a href="/article/2445499" class="list-group-item">百度笔试 - 专注于搜索引擎技术(Lucene,Nutch) - DonewsBlog</a> <a href="/article/1484745" class="list-group-item">2005“百度之星”程序设计大赛网上决赛试题 - 专注于搜索引擎技术(Lucene,Nutch)</a> <a href="/article/2017165" class="list-group-item">document对象详解</a> <a href="/article/2173874" class="list-group-item">搜索引擎技术及趋势 - 局域网搜索引擎研究与开发 - CSDNBlog</a> <a href="/article/116433" class="list-group-item">搜索引擎面面观 技术系列之一 - 搜索引擎面面观 技术系列之一 - 局域网搜索引擎研究与开...</a> <a href="/article/120343" class="list-group-item">JavaScript的document对象详解</a> <a href="/article/163237" class="list-group-item">javascript 中 document对象详解</a> <a href="/article/1048844" class="list-group-item">JavaScript的document对象详解</a> <a href="/article/471060" class="list-group-item">做包制作方法(详解图文)</a> <a href="/article/232100" class="list-group-item">搜索引擎技术发展观系列之二 =- 搜索引擎技术发展观系列之二 - 局域网搜索引擎研究与开发 ...</a> <a href="/article/47121" class="list-group-item">搜索引擎与作弊网站较量技术 作弊联盟前赴后继</a> <a href="/article/2979" class="list-group-item">WebLogic Portal 8.1 平台上运行Lucene搜索引擎</a> <a href="/article/15116" class="list-group-item">java搜索引擎lucene学习笔记 --水木尤寒的博客</a> <a href="/article/177755" class="list-group-item">垂直搜索引擎开发全过程[垂直搜索,Lucene相关]</a> <a href="/article/15511" class="list-group-item">整合PDF和Java-lucene技术</a> <a href="/article/122162" class="list-group-item">元搜索引擎系统合成算法的约束条件 : 搜索引擎技术与新闻 --- dbk2008.com收...</a> <a href="/article/1266875" class="list-group-item">搜索引擎的技术发展趋势 - 搜索引擎技术与应用 - 中文搜索引擎指南1</a> <a href="/article/1266878" class="list-group-item">zhong搜索引擎的技术发展趋势 - 搜索引擎技术与应用 - 中文搜索引擎指南</a> </div> </div> </div> </div> </div> </div> <footer id="footer" class="footer hidden-print"> <div class="container"> <div class="panel panel-default"> <div class="panel-heading">相关问题</div> <div class="panel-body"> <a class="btn btn-default" href="/article/1265734" title="诸葛亮真相">诸葛亮真相</a> <a class="btn btn-default" href="/article/1265735" title="逐条反驳攻击伟人的某“强文”">逐条反驳攻击伟人的某“强文”</a> <a class="btn btn-default" href="/article/1265736" title="盘点新疆的特产和美味">盘点新疆的特产和美味</a> <a class="btn btn-default" href="/article/1265737" title="事能知足心常泰,人到无求品自高 - Qzone日志">事能知足心常泰,人到无求品自高 - Qzone日志</a> <a class="btn btn-default" href="/article/1265738" title="Effective Java 笔记(七) - ilibaba的专栏 - CSDNBlog">Effective Java 笔记(七) - ilibaba的专栏 - CSDNBlog</a> <a class="btn btn-default" href="/article/1265739" title="绿色农业发展中的误区与对策">绿色农业发展中的误区与对策</a> <a class="btn btn-default" href="/article/1265740" title="公开的阴谋——阳谋">公开的阴谋——阳谋</a> <a class="btn btn-default" href="/article/1265741" title="7步让你工作激情四射">7步让你工作激情四射</a> <a class="btn btn-default" href="/article/1265742" title="相声大全">相声大全</a> <a class="btn btn-default" href="/article/1265743" title="朝鲜前领导人金日成珍贵照片---1">朝鲜前领导人金日成珍贵照片---1</a> <a class="btn btn-default" href="/article/1265744" title="2010戴托纳摩托车周美女如云">2010戴托纳摩托车周美女如云</a> <a class="btn btn-default" href="/article/1265745" title="信用卡怎么用免费?">信用卡怎么用免费?</a> <a class="btn btn-default" href="/article/1265746" title="经典智力13题">经典智力13题</a> <a class="btn btn-default" href="/article/1265747" title="美国这样用Google">美国这样用Google</a> <a class="btn btn-default" href="/article/1265748" title="09美国研究生热专业就业情况分析">09美国研究生热专业就业情况分析</a> <a class="btn btn-default" href="/article/1265749" title="温家宝接受日本广播协会电视专访(全文)">温家宝接受日本广播协会电视专访(全文)</a> <a class="btn btn-default" href="/article/1265750" title="悟 智 慧">悟 智 慧</a> <a class="btn btn-default" href="/article/1265751" title="盆栽大花园瓣朱頂红">盆栽大花园瓣朱頂红</a> <a class="btn btn-default" href="/article/1265752" title="孕前食谱4">孕前食谱4</a> <a class="btn btn-default" href="/article/1265753" title="发展循环经济的制度因素及其创新">发展循环经济的制度因素及其创新</a> <a class="btn btn-default" href="/article/1265754" title="卡耐基成功法则全书成功法则3">卡耐基成功法则全书成功法则3</a> <a class="btn btn-default" href="/article/1265755" title="流年碎影-青年文摘21read.com">流年碎影-青年文摘21read.com</a> <a class="btn btn-default" href="/article/1265756" title="[转] 做个薄情的网上女人 - Qzone日志">[转] 做个薄情的网上女人 - Qzone日志</a> <a class="btn btn-default" href="/article/1265757" title="踏着往事前行-----郜毛德推荐">踏着往事前行-----郜毛德推荐</a> <a class="btn btn-default" href="/article/1265758" title="社会百态">社会百态</a> <a class="btn btn-default" href="/article/1265759" title="郎咸平具体介绍">郎咸平具体介绍</a> <a class="btn btn-default" href="/article/1265760" title="60%的受访者认为深圳人才吸引力在下降 -求职攻略 -Job88.com八方人才">60%的受访者认为深圳人才吸引力在下降 -求职攻略 -Job88.com八方人才</a> <a class="btn btn-default" href="/article/1265761" title="考研英语词汇复习技巧3">考研英语词汇复习技巧3</a> <a class="btn btn-default" href="/article/1265762" title="博易大师指标公式11">博易大师指标公式11</a> <a class="btn btn-default" href="/article/1265763" title="牛奶十种饮用方法 会越喝越伤身">牛奶十种饮用方法 会越喝越伤身</a> <a class="btn btn-default" href="/article/1265764" title="《预防未成年人犯罪法》法制宣传讲稿">《预防未成年人犯罪法》法制宣传讲稿</a> </div> </div></div> <div class="copy-right"> <p>神马文学网,客观、专业、权威的知识性互动百科全书。</p></div> </footer> </body> </html>