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

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,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>

分享到:
评论

相关推荐

    lucene搜索引擎配置详解

    本文将深入探讨Lucene搜索引擎的配置过程,包括文件加载、索引创建和搜索操作,帮助你理解其核心技术。 ### 文件加载 在Lucene中,首先需要将待搜索的数据加载到内存或磁盘上的某个结构中。这通常涉及到读取各种...

    基于java的Lucene全文搜索引擎资源简单实例下载

    **基于Java的Lucene全文搜索引擎资源简单实例** Lucene是一个由Apache软件基金会开发的开源全文检索库,它为Java开发者提供了强大的文本搜索功能。Lucene是高性能、可扩展的信息检索库,可以集成到各种Java应用中,...

    Lucene nutch 搜索引擎 开发 实例 源码

    《Lucene与Nutch搜索引擎开发实例详解》 在信息技术领域,搜索引擎已经成为不可或缺的一部分,它们能够高效地处理海量数据,帮助用户快速找到所需信息。本文将深入探讨基于Java的开源搜索引擎框架——Lucene和Nutch...

    lucene搜索引擎demo

    **Lucene搜索引擎Demo详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,是Java编程语言中广泛使用的搜索引擎框架。它提供了强大的索引和搜索功能,使得开发者能够轻松地在应用中集成高级的文本...

    基于lucene搜索引擎的java源码

    **基于Lucene搜索引擎的Java源码详解** Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。此Java源码包提供了一个全面的示例,展示了如何利用Lucene进行索引创建、更新(增量索引)以及搜索操作。...

    基于lucene 的简单搜索引擎.rar

    **基于Lucene的简单搜索引擎构建详解** Lucene是Apache软件基金会的一个开源项目,它是一个高性能、全文本搜索库,提供了一个强大的信息检索引擎框架。这个压缩包“基于lucene 的简单搜索引擎.rar”很可能是为了...

    Lucene开发详解.pdf

    Lucene是一个高性能、全功能的文本搜索引擎库,由Doug Cutting创建并捐赠给Apache Software Foundation。它主要用于构建全文搜索应用程序,能够帮助开发者快速地在其应用程序中添加搜索功能。由于Lucene是用Java编写...

    基于lucene3.6平台搜索工具相关包及使用说明

    《基于Lucene 3.6平台的搜索工具详解与应用指南》 Lucene是一个高性能、全文本搜索引擎库,由Apache软件基金会开发并维护。在3.6版本中,Lucene提供了一套完整的搜索解决方案,包括索引构建、查询解析、结果排序等...

    Lucene分词与查询详解

    **Lucene分词与查询详解** Lucene是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发中。它提供了一套强大的API,用于索引文本数据,并执行复杂的查询操作。在深入理解Lucene的分词与查询机制之前,我们...

    最新Lucene5.2.1实例(带Jar包)

    Lucene 是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高性能、可扩展的文本搜索功能,被广泛应用于各种项目和产品中。Lucene 5.2.1是该库的一个重要版本,包含了多项优化和新特性。本实例教程将...

    lucene.net及.net爬虫实现的简单搜索引擎

    《基于Lucene.NET和.NET爬虫的简单搜索引擎构建详解》 搜索引擎是互联网信息时代的关键工具,它能够快速、准确地帮助用户找到所需的信息。本文将深入探讨如何利用Lucene.NET和.NET爬虫技术构建一个简单的搜索引擎,...

    lucene_jar包

    总的来说,"lucene_jar包"是实现高效全文检索的关键工具,它提供了强大的搜索功能,让开发者能够轻松地在Java应用中集成搜索引擎。通过深入理解和熟练使用Lucene,可以提升应用的用户体验,实现更智能、更快速的信息...

    Lucene.NET2.9搜索引擎源代码(C#)

    **Lucene.NET 2.9 搜索引擎源代码解析** Lucene.NET 是一个基于 Apache Lucene 的全文搜索引擎库,它是用 C# 实现的。Apache Lucene 是一个高性能、可扩展的信息检索库,广泛用于构建复杂的搜索功能。Lucene.NET ...

    lucene实现全文搜索

    Lucene是一个由Java编写的高性能、可扩展的全文搜索引擎库。它提供了一种机制,使得开发者能够轻松地为自己的应用程序添加索引和搜索功能。作为Apache软件基金会的项目,Lucene具有开源和免费的特性,受到Apache软件...

    搜索引擎Lucene_资料

    **搜索引擎Lucene详解** 搜索引擎Lucene是Apache软件基金会下的一个开放源代码全文检索库,它提供了高效的、可扩展的文本搜索功能。Lucene的核心功能包括文档索引、搜索以及相关的排序算法,使得开发者能够轻松地在...

    lucene站内搜索

    Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎和站内搜索解决方案中。它提供了丰富的文本分析、索引和搜索功能,使得开发者能够轻松地在自己的应用程序中实现复杂的全文检索...

    利用lucene做自己的搜索引擎

    ### 利用Lucene构建个性化搜索引擎的关键技术与实践 #### 概述 随着互联网的快速发展,搜索引擎已成为人们获取信息不可或缺的工具。当前市场上知名的搜索引擎如Google、Yahoo、百度等不仅推动了信息技术的进步,也...

    Lucene7.0.1 中文完整Jar包 包含所有jar

    Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会开发并维护。作为Java平台上的一个高性能、可扩展的信息检索库,Lucene 提供了强大的文本分析、索引构建、搜索功能,并且能够轻松集成到各种应用中。此次...

    lucene 实现类似百度搜索

    **Lucene 搜索引擎实现详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会维护。它提供了一套强大的数据结构和算法,用于高效地存储和检索大量文本数据。通过 Lucene,开发者可以轻松地在自己的应用...

Global site tag (gtag.js) - Google Analytics