`

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、创建一个用户类,用于实例化用户数据

 

 

Java代码  收藏代码
  1. public class User {  
  2.   
  3.     private Long id;  
  4.     private String name;  
  5.     private int age;  
  6.     private String sex;  
  7.     private Date birthday;  
  8.     public User(Long id, String name, int age, String sex, Date birthday) {  
  9.         super();  
  10.         this.id = id;  
  11.         this.name = name;  
  12.         this.age = age;  
  13.         this.sex = sex;  
  14.         this.birthday = birthday;  
  15.     }  
  16.    //get/set方法,这里省略  
  17. }  

 

 

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

 

 

Java代码  收藏代码
  1. public class DataUtil {  
  2.     /** 
  3.      * 检索资源数据的准备; 
  4.      *   这里的数据可以来源数据库、文件系统等 
  5.      * @return 
  6.      */  
  7.     public static List<User> getUsers(){  
  8.         List<User> list =new ArrayList<User>();  
  9.         User user =new User(1L,"张三1",20,"man",new Date());  
  10.         list.add(user);  
  11.         user =new User(2L,"张三2",20,"man",new Date());  
  12.         list.add(user);  
  13.         user =new User(3L,"张三3",20,"woman",new Date());  
  14.         list.add(user);  
  15.         user =new User(4L,"张三4",20,"man",new Date());  
  16.         list.add(user);  
  17.         user =new User(5L,"张三5",20,"man",new Date());  
  18.         list.add(user);  
  19.         user =new User(6L,"张三6",20,"woman",new Date());  
  20.         list.add(user);  
  21.         return list;  
  22.     }  
  23. }  

 

3、Lucene创建索引库及查询

 

 

Java代码  收藏代码
  1. public class IndexWriterDemo {  
  2.     /** 
  3.      * 将即将检索的资源写入索引库 
  4.      * @param writer 
  5.      * @throws Exception 
  6.      */  
  7.     public void buildDocs(IndexWriter writer)throws Exception {  
  8.         writer.deleteAll();//清空索引库里已存在的文档(document)  
  9.         List<User> list = DataUtil.getUsers();//得到数据资源  
  10.         System.out.println("buildDocs()->总人数为 :"+list.size());  
  11.         for(User user :list){  
  12.             Document doc = new Document();//创建索引库的文档  
  13.             doc.add(new Field("id",String.valueOf(user.getId()),Store.YES,Index.NO));  
  14.             doc.add(new Field("name",user.getName(),Store.YES,Index.ANALYZED));  
  15.             doc.add(new Field("age",String.valueOf(user.getAge()),Store.YES,Index.ANALYZED));  
  16.             doc.add(new Field("sex",user.getSex(),Store.YES,Index.ANALYZED));  
  17.             doc.add(new Field("birthday",String.valueOf(user.getBirthday()),Store.YES,Index.ANALYZED));  
  18.             writer.addDocument(doc);//将文档写入索引库  
  19.         }  
  20.         int count =writer.numDocs();  
  21.         writer.forceMerge(100);//合并索引库文件  
  22.         writer.close();  
  23.         System.out.println("buildDocs()->存入索引库的数量:"+count);  
  24.     }  
  25.   
  26.     /** 
  27.      * 从索引库中搜索你要查询的数据 
  28.      * @param searcher 
  29.      * @throws IOException 
  30.      */  
  31.     public void searcherDocs(IndexSearcher searcher) throws IOException{  
  32.         Term term =new Term("sex""man");//查询条件,意思是我要查找性别为“man”的人  
  33.         TermQuery query =new TermQuery(term);  
  34.         TopDocs docs =searcher.search(query, 100);//查找  
  35.         System.out.println("searcherDoc()->男生人数:"+docs.totalHits);  
  36.         for(ScoreDoc doc:docs.scoreDocs){//获取查找的文档的属性数据  
  37.             int docID=doc.doc;  
  38.             Document document =searcher.doc(docID);  
  39.             String str="ID:"+document.get("id")+",姓名:"+document.get("name")+",性别:"+document.get("sex");  
  40.             System.out.println("人员信息:"+str);  
  41.         }  
  42.     }  
  43.   }  

 

 

4、测试

 

 

Java代码  收藏代码
  1. public class TestIndexWriterRAMDirectory {  
  2.     private IndexWriter writer=null;  
  3.     private Directory directory=null;  
  4.     private IndexReader reader = null;  
  5.     private IndexSearcher searcher=null;  
  6.     private IndexWriterDemo demo =new IndexWriterDemo();  
  7.       
  8.     @Before  
  9.     public void setUp() throws Exception {  
  10.         directory = new RAMDirectory();  
  11.         IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36,new SimpleAnalyzer(Version.LUCENE_36));  
  12.         writer = new IndexWriter(directory,config);  
  13.     }  
  14.   
  15.     @Test  
  16.     public void testAddDoc()throws Exception {  
  17.         /**生成索引库*/  
  18.         demo.buildDocs(writer);  
  19.           
  20.         /**查询数据*/  
  21.         reader = IndexReader.open(directory);  
  22.         searcher =new IndexSearcher(reader);  
  23.         demo.searcherDocs(searcher);  
  24.     }  
  25. }  

 

测试结果

 

 

Java代码  收藏代码
  1. buildDocs()->总人数为 :6  
  2. buildDocs()->存入索引库的数量:6  
  3. searcherDoc()->男生人数:4  
  4. 人员信息:ID:1,姓名:张三1,性别:man  
  5. 人员信息:ID:2,姓名:张三2,性别:man  
  6. 人员信息:ID:4,姓名:张三4,性别:man  
  7. 人员信息: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的原理完整版pdf

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

    lucene全文搜素实例 java lucene 实例

    ### 一、Lucene 基本概念 1. **索引(Index)**:Lucene 的核心功能是建立索引,它将非结构化的文本数据转换成可供快速搜索的数据结构。索引过程包括分词(Tokenization)、词干提取(Stemming)、停用词过滤...

    lucene部分案例的源代码

    一、Lucene基本概念 Lucene是一个开源的Java库,它提供了一个强大的信息检索API,支持索引和搜索大量文本数据。其核心功能包括文档索引、查询解析、评分机制以及结果排序等。通过Lucene,开发者可以快速地构建出...

    lucene4.4 Demo事例

    1. **Lucene基本概念** - **索引**: Lucene首先需要创建索引,将文本数据转换为可搜索的结构。索引过程包括分析、分词和倒排索引等步骤。 - **分析器**: 分析器负责将输入文本拆分成有意义的单位,即术语(tokens...

    Lucene3.1使用教程

    ### 一、Lucene基本概念 1. **索引(Index)**:Lucene首先将数据转换成索引,这个过程类似于传统书籍的目录。索引包含文档的关键词及其位置信息,使得快速查找和排序变得可能。 2. **文档(Document)**:在...

    Lucene 索引的简单使用

    Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段(Field)。 - **字段(Field)**:字段是文档的组成部分,每个字段都有特定的类型(如文本、日期等)...

    Lucene视频教程_讲解部分源码

    1. **Lucene基本概念**:Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)和查询(Query)。文档是由一系列字段组成的,每个字段有特定的类型(如文本、数字等)。索引是Lucene对这些文档进行...

    Lucene 概述视频详解

    **一、Lucene基本概念** 1. **索引**:在Lucene中,数据不是直接存储的,而是被转换为一种叫做索引的数据结构。索引是经过分析和分词后的文档内容,使得搜索过程可以快速定位到相关的文档。 2. **文档**:在Lucene...

    Lucene.In.Action.2nd.Edition

    1. **Lucene基本概念**:了解Lucene的基本架构,如文档、字段、术语(token)、倒排索引等。这些概念构成了Lucene搜索引擎的基础。 2. **索引创建**:学习如何将文本数据转换为可搜索的Lucene索引,包括分词、分析...

    lucene站内搜索

    ### 一、Lucene基本概念 1. **索引(Index)**: Lucene首先将文档内容转换为可搜索的结构化数据,即索引。索引是经过特殊处理的数据结构,允许快速定位到包含特定查询词的文档。 2. **分词(Tokenization)**: ...

    lucene for java 简单demo

    Lucene基本概念** - **索引(Indexing)**:Lucene首先对文档进行分析和处理,将其转化为结构化的索引数据。这个过程包括分词(Tokenization)、去除停用词(Stopword Removal)、词干提取(Stemming)等。 - **...

    lucene-7.4.0jar包

    1. **Lucene基本概念** - **全文检索**:Lucene的核心功能是进行全文检索,它能将非结构化的文本数据转换成可搜索的索引。 - **倒排索引**:Lucene采用倒排索引技术,将文档中的词汇与文档ID关联,提高了查询速度...

    lucene代码

    一、Lucene基本概念 1. 文档(Document):在Lucene中,文档是信息的基本单位,它由多个字段(Field)组成,每个字段有对应的名称和内容。例如,一个网页可以被看作一个文档,其中的标题、正文、URL等可以作为不同...

    Lucene与数据库结合示例(加双关键字高亮)

    1. **Lucene基本概念**:理解Lucene的索引结构,如倒排索引,以及其如何提高搜索效率。 2. **数据库集成**:学习如何将MySQL中的数据导入到Lucene的索引中,可能涉及JDBC连接、SQL查询等知识。 3. **索引创建**:...

    lucene 实现类似百度搜索

    ### 一、Lucene 基本概念 1. **索引(Index)**:搜索引擎的核心是索引,类似于书籍的目录。Lucene 把文档内容转换成倒排索引,使得快速查找匹配的文档变得可能。 2. **文档(Document)**:在 Lucene 中,每个文档...

    Lucene-2.3.1 源代码阅读学习

    1. **Lucene基本概念** - **索引**:Lucene的核心是构建索引,它将文本数据转换为倒排索引,以便快速查找包含特定词的文档。 - **文档**:在Lucene中,文档是信息的基本单位,可以包含多个字段,每个字段都有特定...

    lucene全文检索简单索引和搜索实例

    一、Lucene基本概念 1. 文档(Document):在Lucene中,一个文档代表了要索引的信息源,它可以是网页、电子邮件、PDF文档等。文档由多个字段(Field)组成,每个字段具有不同的含义和处理方式。 2. 字段(Field)...

    lucene-5.4.0

    一、Lucene基本概念与架构 1.1 Lucene核心组件:主要包括索引(Index)、文档(Document)、字段(Field)和分词器(Analyzer)。索引是Lucene的核心,它将文本数据转换成可以高效查询的结构;文档是由多个字段组成...

    lucene in action 中文

    1. **Lucene基本概念**:Lucene是一个开源的全文检索库,它提供了索引和搜索功能,可以嵌入到各种Java应用程序中。书中首先会介绍什么是全文检索,以及Lucene如何通过倒排索引实现高效搜索。倒排索引是一种将词与...

    Lucene项目案例

    **一、Lucene基本概念** 1. **索引(Index)**: Lucene首先对文档内容建立索引,类似于图书的目录,以便快速定位到所需信息。索引过程包括分词(Tokenization)、词干提取(Stemming)、停用词处理(Stop Word ...

Global site tag (gtag.js) - Google Analytics