0%

Lucene简介

Lucene简介

lucene是apache旗下的一款高性能、可伸缩的开源的信息检索库

lucene中几个重要的概念

文档

文档(document),在lucene的定义中,文档是一系列域(field)的组合,而文档的域则代表一系列与文档相关的内容,与数据库表的记录的概念有点类似,一行记录所包含的字段对应的就是文档的域,举例来说,一个文档比如老师的个人信息,可能包括年龄、身高、性别、个人简介等等

(field),索引的每个文档中都包含一个或者多个不同名称的域,每个域都包含了域的名称和域对应的值,并且,域还可以是不同的类型,如字符串、整型、浮点型等

(term),term是搜索的基本单元,与field对应,它包括了搜索的域的名称以及搜索的关键词,可以用它来查询指定域中包含特定内容的文档

查询

查询(query),最基本的查询可能是一系列term的条件组合,称为TermQuery,但也有可能是短语查询(PhraseQuery)、前缀查询(PrefixQuery)、范围查询(包括TermRangeQuery、NumericRangeQuery等)等等

分词器

分词器(analyzer),文档在被索引之前,需要经过分词器处理,以提取关键的语义单元,建立索引,并剔除无用的信息,如停止词等,以提高查询的准确性。中文分词与西文分词区别在于,中文对于词的提取更为复杂。

常用的中文分词器包括一元分词、二元分词、词库分词等等。一元分词,即将给定的字符串以一个字为单位进行切割分词,这种分词方式较为明显的缺陷就是语义不准,如“上海”两个字被切割成“上”、“海”,但是包含“上海”、“海上”的文档都会命中。 二元分词比一元分词更符合中文的习惯,因为中文的大部分词汇都是两个字,但是问题依然存在。

词库分词就是使用词库中定义的词来对字符串进行切分,这样的好处是分词更为准确,但是效率较N元分词更低,且难以识别互联网世界中层出不穷的新兴词汇

索引构建过程

索引创建过程

lucene索引的构建过程大致分为这样几个步骤,首先,通过指定的数据格式,将lucene的Document传递给分词器Analyzer进行分词,经过分词器分词之后,通过索引写入工具IndexWriter将索引写入到指定的目录

索引搜索过程

索引搜索过程

索引的查询,大概可以分为如下几个步骤,首先,构建查询的Query,通过IndexSearcher进行查询,得到命中的TopDocs,然后通过TopDocs的scoreDocs()方法,拿到ScoreDoc,通过ScoreDoc,得到对应的文档编号,IndexSearcher通过文档编号,使用IndexReader对指定目录下的索引内容进行读取,得到命中的文档返回