25
Beijing ConST Instruments technology Inc. Lucene.Net-全文检索 研发中心/软件部

Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

  • Upload
    others

  • View
    14

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

Beijing ConST Instruments technology Inc.

Lucene.Net-全文检索 研发中心/软件部

Page 2: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

前言

随着互联网迅速发展至今,搜索引擎的出现可谓是必然的。偌大的互联网就好像一个巨型的图书馆,在这个网络图书馆里存在着,并且时时刻刻都在产生着大量的信息。数以万计的信息远超出了我们的想象与掌控,如果没有搜索引擎的出现,也许我们根本无法找到我们想要的目标信息。

搜索引擎是近20余年来,互联网内发展最为迅速的领域之一。这种变化不仅仅表现在搜索技术的突飞猛进和网络经济的巨大推动力上,搜索引擎其自身的合纵连横、兴衰起伏也是精彩纷呈。

Page 3: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

搜索引擎

Page 4: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

搜索引擎

Page 5: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

数据分类

1. 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。

2.非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件。

如何查找这些数据呢?

Page 6: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

顺序扫描法

比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。

疑问:从1000亿篇文章中搜索某关键字,需要多长时间?

Page 7: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

全文检索

将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。

例如:字典中拼音表和部首表相当于字典的索引。

Page 8: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

应用场景

对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,比如百度、Google等搜索引擎、论坛站内搜索、电商网站站内搜索等。

Page 9: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

简介

Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。开发人员可以基于Lucene.net实现全文检索的功能。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。

Page 10: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

工作方式

一入一出 一入:即写入,将你提供的源数据写入索引或者从索引中删除

一出:即读出,即提供搜索服务,根据用户的关键词搜索索引得到结果。

Page 11: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

执行原理

Page 12: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

七大对象

1. Lucene.Net.Document

定义了存储文档的数据结构,由多个Field组成

2. Lucene.Net.Store 支持数据存储管理

Store包含了索引的存储类,例如Directory定义了索引文件的存储结构,FSDirectory为存储在文件中的索引,RAMDirectory为存储在内存中的索引,MmapDirectory为使用内存映射的索引。

Page 13: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

七大对象

3. Lucene.Net.Analysis 负责分析文本

Analyzer是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的 “of”、 “the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。

Page 14: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

七大对象

4. Lucene.Net.Index 包含索引的读写类

IndexWriter类对索引文件进行写,合并,优化

IndexReader类对索引进行读取和删除操作

5. Lucene.Net.Search 提供查询相关功能。

Search包含了从索引中搜索结果的各种类,例如各种Query类,包括TermQuery、BooleanQuery等就在这个包里。

Page 15: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

七大对象

6. Lucene.Net.QueryParsers 提供查询语法

QueryParser包含了解析查询语句的类,lucene的查询语句和sql语句有点类似,有各种保留字,按照一定的语法可以组成各种查询。 Lucene有很多种Query类,它们都继承自Query,执行各种特殊的查询,QueryParser的作用就是解析查询语句,按顺序调用各种 Query类查找出结果。

7. Lucene.Net.Util包含一些公共工具类

例如时间和字符串之间的转换工具。

Page 16: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

分词器

创建文档索引:索引中的单词叫做Token

分析搜索关键字:查询关键字中的单词叫做Term

注: 在创建索引和搜索时,必须使用同样的分词器,保证其切出相同的Token才能检索到结果。

Page 17: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

Query

a. TermQuery

在content域中包含‘lucene’的document.

b. BooleanQuery

在content域中包含‘net’ 或‘C#’的document

c. WildcardQuery

对单词进行通配符查询 ?一个字符 *零个或多个字符

d. PhraseQuery

指定两个字之间不超过指定字符的document

query.setSlop(3);

Page 18: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

Query

e. PrefixQuery

搜索以某内容开头的document

f. FuzzyQuery

搜索相似的term

g. RangeQuery

搜索指定范围的document

QueryParser:你可以把各种查询一句话搞定,lucene会自动把它们查分成小块交给相应Query执行

Page 19: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

创建索引

将用户搜索的文档内容进行索引,索引存储在索引库中。

a.获取原始文档(数据) 指要索引和搜索的内容。原始内容包括互联网上的网页(爬虫)、数据库中的数据(sql查询)、磁盘上的文件(IO流获取)等。

b.创建文档对象 获取原始内容的目的是为了索引,在索引前需要将原始内容创建成文档(Document),文档中包括一个一个的域(Field),将需要索引的Field索引起来,把需要存储的Field存储起来,域中存储内容。

Page 20: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

创建索引 c.分析文档 将原始内容创建为包含域(Field)的文档(document),需要再对域中的内容进行分析,分析的过程是经过对原始文档提取单词、将字母转为小写、去除标点符号、去除停用词等过程生成最终的语汇单元,可以将语汇单元理解为一个一个的单词。

d. 创建索引 对所有文档分析得出的语汇单元进行索引,索引的目的是为了搜索,最终要实现只搜索被索引的语汇单元从而找到Document(文档)。

创建索引是对语汇单元索引,通过词语找文档,这种索引的结构叫倒排索引结构

倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它的规模较小,而文档集合较大。

Page 21: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

查询索引

查询索引也是搜索的过程。搜索就是用户输入关键字,从索引(index)中进行搜索的过程。根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容(这里指磁盘上的文件)

a. 创建查询 用户输入查询关键字执行搜索之前需要先构建一个查询对象,查询对象中可以指定查询要搜索的Field文档域、查询关键字等,查询对象会生成具体的查询语法。

Page 22: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

查询索引

b.执行查询 根据查询语法在倒排索引词典表中分别找出对应搜索词的索引,从而找到索引所链接的文档链表。

比如搜索语法为“fileName:lucene”表示搜索出fileName域中包含Lucene的文档。

搜索过程就是在索引上查找域为fileName,并且关键字为Lucene的term,并根据term找到文档id列表。

c.渲染结果 以一个友好的界面将查询结果展示给用户,用户根据搜索结果找自己想要的信息,为了帮助用户很快找到自己的结果,提供了很多展示的效果,比如搜索结果中将关键字高亮显示,百度提供的快照等

Page 23: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

Filter/Sort

Filter作用:限制只查询索引的某个子集,它的作用像SQL语句里的where

对查询结果进行过滤,不会拼装在查询条件中。

使用NumericRangeFilter<>

Sort作用:对搜索结构进行过滤

使用SortField

Page 24: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

维护索引

a. 删除索引

1.delete(document,int docNum)

根据索引中的编号删除,编号为内部结构

2.delete(document,(Term term))

根据参数执行搜索操作,对搜索结果进行批量删除

b.更新索引

lucene没有专门的索引更新方法,必须找出对应的document删除

将新的document插入到索引中。

Page 25: Lucene.Net-全文检索 · Lucene.net是Lucene的.net移植版本,是一个开源的全文检 索引开发包,即它不是一个完整的全文检索引,而是一 个全文检索引的架构,供了完整的查询引和索引引

THANK YOU.

WE ARE JUST ON THE WAY.

谢谢大家!