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

Lucene之一(Lucene的概念一)

阅读更多

Lucene的基本概念

 

Lucene是什么?

    Lucene是一款高性能、可扩展的信息检索工具库。信息检索是指文档搜索、文档内信息搜索或者文档相关的元数据搜索等操作。

 

信息检索流程如下:

      1、 将即将检索的资源集合放到本地,并使用某种特定的结构存储,称为索引,这个索引的集合称为索引库。由于索引库的结构按照专门为快速查询设计的,所以查询的速度非常的快;

 

      2、 搜索操作时都是在本地的索引库中进行查找;

 

所以对于全文检索功能的开发,要做两方面:索引库管理(维护索引库中的数据)、在索引库中进行搜索。而Lucene就是操作索引库的工具;

 

索引库是什么样子?

      索引库是一个目录,里面是一些二级制文件,就如同数据库,所有的数据也是以文件的形式存放在文件系统中的。我们不能直接操作这些二级制文件,而是使用Lucene提供的API完成相应的操作,就像数据库使用SQL语句一样。

 

对索引库的操作可以分为两种:管理与查询。

   1、 管理索引库使用的IndexWriter

   2、从索引库中查询使用IndexSearcher

Lucene的数据结构为 DocumentField

Document代表是一条数据,Field代表数据中的一个属性。一个Document中有多个FieldField的值为String型,因为Lucene只处理文本;

我们只需要把我们的程序中的对象转换为Doucemnt,就可以交给Lucene管理了,搜索的结果中的数据列表也是Document的集合;

 

 

OK,我们来做一个实例,还原一下整个流程

 

1、创建一个用户类,用于实例化用户数据

 

 

public class User {

	private Long id;
	private String name;
	private int age;
	private String sex;
	private Date birthday;
	public User(Long id, String name, int age, String sex, Date birthday) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.birthday = birthday;
	}
   //get/set方法,这里省略
}

 

 

2、生成即将检索的资源数据

 

 

public class DataUtil {
	/**
	 * 检索资源数据的准备;
	 *   这里的数据可以来源数据库、文件系统等
	 * @return
	 */
	public static List<User> getUsers(){
		List<User> list =new ArrayList<User>();
		User user =new User(1L,"张三1",20,"man",new Date());
		list.add(user);
		user =new User(2L,"张三2",20,"man",new Date());
		list.add(user);
		user =new User(3L,"张三3",20,"woman",new Date());
		list.add(user);
		user =new User(4L,"张三4",20,"man",new Date());
		list.add(user);
		user =new User(5L,"张三5",20,"man",new Date());
		list.add(user);
		user =new User(6L,"张三6",20,"woman",new Date());
		list.add(user);
		return list;
	}
}
 

3、Lucene创建索引库及查询

 

 

public class IndexWriterDemo {
	/**
	 * 将即将检索的资源写入索引库
	 * @param writer
	 * @throws Exception
	 */
	public void buildDocs(IndexWriter writer)throws Exception {
		writer.deleteAll();//清空索引库里已存在的文档(document)
		List<User> list = DataUtil.getUsers();//得到数据资源
		System.out.println("buildDocs()->总人数为 :"+list.size());
		for(User user :list){
			Document doc = new Document();//创建索引库的文档
			doc.add(new Field("id",String.valueOf(user.getId()),Store.YES,Index.NO));
			doc.add(new Field("name",user.getName(),Store.YES,Index.ANALYZED));
			doc.add(new Field("age",String.valueOf(user.getAge()),Store.YES,Index.ANALYZED));
			doc.add(new Field("sex",user.getSex(),Store.YES,Index.ANALYZED));
			doc.add(new Field("birthday",String.valueOf(user.getBirthday()),Store.YES,Index.ANALYZED));
			writer.addDocument(doc);//将文档写入索引库
		}
		int count =writer.numDocs();
		writer.forceMerge(100);//合并索引库文件
		writer.close();
		System.out.println("buildDocs()->存入索引库的数量:"+count);
	}

	/**
	 * 从索引库中搜索你要查询的数据
	 * @param searcher
	 * @throws IOException
	 */
	public void searcherDocs(IndexSearcher searcher) throws IOException{
		Term term =new Term("sex", "man");//查询条件,意思是我要查找性别为“man”的人
		TermQuery query =new TermQuery(term);
		TopDocs docs =searcher.search(query, 100);//查找
		System.out.println("searcherDoc()->男生人数:"+docs.totalHits);
		for(ScoreDoc doc:docs.scoreDocs){//获取查找的文档的属性数据
			int docID=doc.doc;
			Document document =searcher.doc(docID);
			String str="ID:"+document.get("id")+",姓名:"+document.get("name")+",性别:"+document.get("sex");
			System.out.println("人员信息:"+str);
		}
	}
  }
 

 

4、测试

 

 

public class TestIndexWriterRAMDirectory {
	private IndexWriter writer=null;
	private Directory directory=null;
	private IndexReader reader = null;
	private IndexSearcher searcher=null;
	private IndexWriterDemo demo =new IndexWriterDemo();
	
	@Before
	public void setUp() throws Exception {
		directory = new RAMDirectory();
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36,new SimpleAnalyzer(Version.LUCENE_36));
		writer = new IndexWriter(directory,config);
	}

	@Test
	public void testAddDoc()throws Exception {
		/**生成索引库*/
		demo.buildDocs(writer);
		
		/**查询数据*/
		reader = IndexReader.open(directory);
		searcher =new IndexSearcher(reader);
		demo.searcherDocs(searcher);
	}
}

 

测试结果

 

 

buildDocs()->总人数为 :6
buildDocs()->存入索引库的数量:6
searcherDoc()->男生人数:4
人员信息:ID:1,姓名:张三1,性别:man
人员信息:ID:2,姓名:张三2,性别:man
人员信息:ID:4,姓名:张三4,性别:man
人员信息:ID:5,姓名:张三5,性别:man
 

 

 

OK,代码完毕

 

实例的Lucene版本为:lucene-3.6.1

 

在这再次说下Lucene检索的整个流程(请参考demo的代码)

 

1、建立索引的执行过程 

     在建立索引时,先要把文档存到索引库中,还要更新词汇表。

操作步骤如下:

(1)、把数据对象转换成相应的Document,其中的属性转为Field;

(2)、调用工具IndexWriter的addDocument(doc),把Document添加到索引库中;

(3)、Lucene做的操作:

       把文档存到索引库中,并自动指定一个内部编号,用来唯一标识这个条数据;内部编号类似与这条数据的地址,在索引库内部的数据进行调整后,这个编号就可能会改变,同时词汇表中的引用的编号也会做相应的改变,以保 证正确。

      更新词汇表。把文本中的词找出来放到词汇表中,简历与文档的对应关系。要把那些词放到词汇表中呢?这就用到一个叫Analyzer(分词器)的工具。他的作用是把一段文本中的词按照规则取出所包含的所有词。对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由其子类实现。

 

在把对象的属性转化为 Field时,相关代码为:

   doc.add(new Field(“title”,article.getTitle(), Store.YES, Index.Analyzed))

其中第三个参数的意思为

Store.NO 不存储属性的值;

Store.YES 存储属性的值

 

第四个参数

Index.NO 不建立索引

Index.ANALYZED 分词后建立索引

Index.NOT_ANALYZED 不分词,把整个内容作为一个词建立索引

 

Store是影响搜索出的结构是否有指定属性的原始内容。

Index是影响是否可以从这个属性中查询,或者是查询时可以查其中的某些词,还是要把整个内容作为一个词进行查询。

 

2、从索引库中搜索的执行过程(QueryParse、TopDocs、ScoreDoc)

在进行搜索时,先在词汇表中查找,得到符合条件的文档编号列表。再根据文档编号真正的取数据(Document)

操作步骤如下:

(1)、把要查询字符串转为Query对象。这就像在Hiberante总是用HQL查询时,也要先调用Session.createQuery(hql)转成Hibernate的Query对象一样。把查询字符串转换成Query是使用QueryParser,或者使用MultiFieldQueryParser。查询字符串也要先经过Analyzer(分词器)。要求检索时使用Analyzer要与监理索引使用的Analzyer要一致,否则可能搜索不出正确的结果。

(2)、调用IndexSearcher.search(),进行查询,得到结果。此方法返回未TopDocs,是包含结果的多个信息的一个对象。其中有totalHits代表记录数,ScoreDoc的数组。ScoreDoc是代表一个结果的相关度得分与文档编号等信息的对象。

(3)、取出要用到的数据列表。调用IndexSearcher.doc(scoreDoc.doc)以取出指定编号对应的Document数据,在分页时要用到:一次只取一页的数据。

 

分享到:

相关推荐

    Lucene.net概念介绍

    【Lucene.net 概念详解】 Lucene.net 是 Lucene 框架针对 .NET 平台的移植版本,是一个高度可扩展的全文检索引擎开发工具包。它并不直接提供一个完整的全文检索服务,而是为开发者提供了一套构建高效、灵活的搜索...

    Lucene之删除索引

    在深入探讨Lucene删除索引这一主题之前,我们先来理解一下Lucene的基本概念。Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高性能、可扩展的搜索和索引功能,广泛应用于各种应用程序中,如...

    Lucene全文检索引擎

    **一、Lucene的基本概念** 1. **文档(Document)**:在Lucene中,每个要搜索的文本对象被称为一个文档,文档由多个字段(Field)组成,如标题、内容、作者等。 2. **字段(Field)**:字段是文档的组成部分,每个...

    lucene的一个实用例子

    本实例将通过一个具体的应用场景,帮助大家了解 Lucene 的基本用法和核心概念。 首先,我们需要理解 Lucene 的基本架构。Lucene 包含以下几个关键组件: 1. **索引(Index)**:Lucene 的工作基于索引,而非实时...

    Lucene初探,一个初级的LuceneDemo

    这篇博客将带你初探Lucene,通过一个初级的LuceneDemo来了解其基本概念和操作。 首先,让我们了解一下Lucene的核心概念: 1. **索引(Index)**:在Lucene中,索引是文档的预处理结果,类似于数据库的索引,用于...

    Lucene的一个毕业设计

    Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了一个可扩展的、高度优化的框架,用于在各种数据源中进行索引和搜索文本信息。Lucene 具有强大的文本分析能力,可以处理多种语言,并且支持...

    lucene in action英文版 lucene 3.30包

    这本书主要面向Java开发者,通过阅读,读者可以理解Lucene的核心概念,学习如何使用它来构建自己的搜索引擎。 1. **Lucene基础** Lucene是基于Java的开源搜索库,它的核心功能包括索引和搜索文本。索引过程将文本...

    一步一步跟我学习Lucene源码之lucene的各种Field

    Field是Lucene中非常关键的概念,它是构成文档的基本单元。一个文档可以包含多个Field,每个Field都有特定的名称和值,用于表示文档的不同部分。例如,一个新闻文章可能包含标题(Title)、内容(Content)和作者...

    Annotated Lucene 中文版 Lucene源码剖析

    首先,Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)和查询(Query)。文档是信息的基本单位,可以包含多个字段,每个字段都有特定的类型,如文本、日期或数字。索引过程将文档中的文本转换...

    Lucene的原理完整版pdf

    ### 一、Lucene基本概念 1. **索引**:Lucene首先对文本进行索引,将文本内容转换为一系列可搜索的结构。索引过程包括分词(Tokenization)、词干提取(Stemming)、停用词处理(Stop Word Removal)等步骤。 2. *...

    lucene3源码分析

    Lucene是Java领域内最受欢迎的全文检索框架之一,其核心功能包括文本索引和查询。在理解Lucene的工作机制之前,我们需要了解全文检索的基本原理。 - **索引构建**:这是全文检索的第一步,涉及到将文档内容转换为可...

    Lucene示例 BM25相似度计算

    在IT领域,搜索引擎技术是至关重要的,而Lucene作为一个开源全文搜索引擎库,广泛应用于各种文本检索系统中。本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、...

    基于Lucene的Lucene

    ### Lucene核心概念 1. **索引(Index)**: 在Lucene中,索引是将非结构化的文本数据转换为结构化的倒排索引的过程。倒排索引允许快速查找包含特定词项的文档。 2. **Document**: 代表要索引的一个实体,如一篇...

    Lucene资料大全(包括Lucene_in_Action书等)

    特别提到了"尚学堂科技_张志宇_lucene.ppt",这可能是一个由尚学堂科技的张志宇制作的Lucene讲解PPT,通常这样的PPT会以简洁明了的方式介绍Lucene的基本概念、使用方法和实战技巧。 **Lucene核心知识点** Apache ...

    lucene-2.2.0zip

    标题中的"lucene-2.2.0zip"指的是Lucene的2.2.0版本,这是一个较早的版本,对于学习和理解Lucene的基础概念非常有帮助。 Lucene 2.2.0的主要特性包括: 1. **全文检索**:Lucene支持对文档内容进行全文检索,允许...

    全文检索原理及Lucene实之搜索

    #### Lucene的核心概念 - **文档**:在Lucene中,被索引的数据称为文档,通常用`Document`对象表示。 - **索引**:索引是用于快速检索文档的一种数据结构,Lucene采用倒排索引的方式建立索引。 - **分词**:为了...

    lucene搜索引擎项目

    下面将详细探讨Lucene的核心概念和关键功能,以及如何利用这些特性来实现一个实际的搜索引擎。 1. **Lucene基础** Lucene的核心组件包括索引和查询。索引是Lucene处理大量文本数据的关键,它将非结构化的文本转换...

    lucene in action源码

    12. **LuceneInAction源码**:这本书的源码包含了各种示例和实战案例,涵盖了从基础概念到高级特性的完整讲解,是学习Lucene的宝贵资源。 通过深入研究《Lucene in Action》的源码,开发者不仅可以理解Lucene的基本...

Global site tag (gtag.js) - Google Analytics