Lucene基础小知识
-
Lucene它不是一个完整的全文搜索引擎。
-
Lucene只是一个全文检索引擎的框架。
-
Lucene提供了完成的查询引擎和索引引擎,部分文本分析引擎(英文和德文)。
-
Lucene只是个工具包,可在此基础上构建全文检索引擎。
-
Java开发,Apache维护
Lucene的突出优点
-
索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使不同平台能共享索引文件。
-
在倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引合并,达到优化目的。
-
Lucene查询实现中,默认实现了布尔操作、模糊查询、分组查询等等。
-
Lucene的开源特性,使它比其他商业全文检索引擎更灵活,可以根据用户的实际情况,编写更适合当前应用的引擎。
-
Lucene是面向对象架构设计,方便扩充功能,如中文处理,HTML,PDF处理,而且跨平台。
-
Apache维护,社区强大。
lucene jar包结构:analysis, codesc, document, geo, index, search, store, util。
索引:
索引就是一个工具,可以快速的帮助我们查找单次或者短语。
索引创建:一次创建,多次使用。
第一步:获取内容(Accquire Content)
获取一个被索引的文本。
第二步、构建 Document
把要索引的文件转换为一系列的document。每个document由Field组成。
document就是由Field组成,而field就是即将被索引的文章属性。例如:author,title,url,price,content等。
对于每一个document或者field进行加权操作。
第三步、Analyzer Docuement
一个文件不会被直接索引,我们队文件的预处理是将字符串拆分成若干短语单元,称为tokens。
每一个token我们可以认为是一个字的信息。
第四部、创建索引
创建索引的过程中,document会被添加到索引库。调用Lucene的API就完成了索引库的建立。
搜索索引
搜索是寻找一个索引词所处的document的过程。
搜索的内容的质量有两个指标:精确度和搜索命中率
Document:
Document是Lucene索引库的基本组成单元。代表一条用户的搜索记录,我们对Lucene的搜索就是对索引库中的document的搜索。创建一个Document: Document document = new Document();
Field:
Field作为Document的组成部分,代表着每一条记录所要存储的项信息。创建一个Field: Field field=new Field(“name”,”helei”,Store.YES,Index.NOT_ANALYZER);
Analyzer:
Analyzer是将Field中的每一个字段分解成若干个单元,然后将这些单元创建索引库。事实上该类主要是将一段字符文 本拆分为 TokenStream 对象,该对象中保存了分词的一些信息。创建一个分词语 法如下。 创建一个Analyzer: Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_35);
IndexWriterConfig:
IndexWriterConfig 该类是主要是通过设置该属性来实现对 IndexWriter 的配置。 实现功能其实并不难。创建一个 IndexWriterConfig 对象的代码如下。IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_35,analyzer);
Directory:
Directory 主要指定索引库的位置,用户可以使用 FSDirectory、 RAMDrectory、FileSwitchDirectory、NRTCachingDirectory 这些类都是 Lucene 为我们提供,创建 一个 Directory 代码如下Directory directory=FSDirectory.open(new File(path));
IndexWiter:
IndexWriter 该类主要负责将 Document 对象写入到磁盘上以及对索引库的添加、修改和删除操作。创建 IndexWriter 的代码: IndexWriter indexWriter=new IndexWriter(directory, config);
IndexReader:
IndexReader 主要提供了用户操作索引库的方法,这个类同样也而用户提供了访问索引库的方法例如 Document 总数量,删除、有效数量等操作。该 IndexWriter 的创建方式如下:IndexReader indexReader=IndexReader.open(directory);
IndexSearcher:
IndexSearcher 主要是根据 Query 查询出所需要的 Document 返回给用户。例如:分页信息查询到的 Document 信息等。该类的创建代码如下。IndexSearcher indexSearcher=new IndexSearcher(indexReader);
Term:
Term 代表索引库中的一个字代表一个简单的搜索单元。创建代码如下。 Term term=new Term("name","heleli");
Query:
Query 主要是由 Term 组成,该类是一个接口,它的实现类有很多,例如 TermQuery、MultiTermQuery 、BooleanQuery 、WildcardQuery 、PhraseQuery、PrefixQuery 、MultiPhraseQuery 、FuzzyQuery 、TermRangeQuery 、 NumericRangeQuery 、org.apache.lucene.search.spans.SpanQuery 等针对于该类 的实现会在后续介绍。创建该类的代码如下:Query query=new TermQuery(term);
TopDocs:
TopDocs 代表收索的文档信息。该类中保存了查询到的文档数目以及命中的文档信息。创建该类的信息方法如下:TopDocs tds=indexSearcher.search(query, 100);
ScoreDoc:
ScoreDoc 代表一个 TopDoc 中的一个 Doc 对象。使用一般在搜索中获取如下。ScoreDoc[] sds=tds.scoreDocs;
lucene与关系型数据库
全文检索对比
对比项 | 全文检索库(Lucene) | 关系型数据库 |
核心功能 | 以文本检索为主,插入、删除、修改比较麻 烦,适合于大文本块的查询。 | 插入、删除、修改十分方便, 有专门的 SQL 命令,但对于大 文本块类型的检索效率较低。 |
库 | 与数据库类似,都可以建多个库,而且各个 库的存储位置可以不同。 | 可以建多个库。一般每个库都 有控制文件和数据文件等,比 较复杂。 |
表 | 没有严格的表的概念,Lucene 的表只是由 入库时的定义字段松散构成 | 有严格的表结构,有主键,有 字段类型等 |
记录 | 由于没有严格的表的概念,所以记录体现为 一个对象,记录对应的类是 Document。 | Record,与表结构对应。 |
字段 | 字段类型只有文本和日期两种,字段一般不 支持运算,更无函数功能,字段对应的类是 Field 类。 | 字段类型丰富,功能强大。 |
查询结果集 | 在 Lucene 里表示查询结果集的类是 Hits, 如 hits(doc1,doc2,doc3......) | 在 JDBC 中使用 Resultset |
模糊查询的对比
对比项 | Lucene 全文检索 | 数据库模糊查询 |
索引 | 将数据源中的数据——建立倒排索 引,速度较快 | 无法使用数据库索引,需要遍历所 有记录进行模糊匹配,所以查询速 度有多个数量级的下降 |
匹配效 果 | 通过词元匹配,通过语言分析接口 进行关键诩拆分,能够实现对中文 的支持 | 由于是模糊查询,匹配不精确,可 能查出无关信息或漏查信息 |
匹配度 | 有匹配度算法,将匹配度比较高的 结果排在前面 | 没有匹配度算法,一个关键词在记 录中出现多少次结果都是一样的 |
结果输出 | 通过特别的算法,将匹配度最高的头 100 条结果输出,结果集是缓冲 式的小批量读取的,系统开销较小 | 返回所有的结果集,在匹配条目非常 多的时候需要大量的内存存放这 些临时结果集,系统开销大 |
可定制性 | 通过 API 接口可定制出符合检索排 序需要的排序规则 | 不可定制 |
适用情况 | 高负载的模糊查询应用,索引资料 量比较大,速度要求比较快,匹配 度要求比较高的情况 | 使用率低,模糊匹配规则的简单或 者需要模糊查询的资料量少的情况 |