1.Lucene是什么?
Lucene是一套用于全文检索和搜索的开放源代码程序库。实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你你要搜索的关键词出现在哪里。
2.全文检索是什么?
全文检索首先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索。
全文检索大体分两个过程,索引创建(Indexing)和搜索索引(Search)。索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。搜索索引:通过用户的查询请求搜索创建的索引,然后返回查询结果的过程。
说到结构化和非结构化数据,而我们生活中的数据分为结构化数据和非结构化数据:
- 结构化数据:具有固定格式或有限长度的数据,可以用二维表结构来逻辑表达实现的,如数据库,元数据等。
- 非结构化数据:指不定长或无固定格式的数据,如办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等等。也叫全文数据。
对于结构化数据的搜索:如对数据库的搜索,用 SQL 语句。再如对元数据的搜索,如利用windows 搜索对文件名,类型,修改时间进行搜索等。对非结构化数据的搜索:如利用 windows 的搜索也可以搜索文件内容,Linux 下的 grep命令,在如用 Google 和百度可以搜索大量内容数据。
对非结构化数据也即对全文数据的搜索主要有两种方法:
1.顺序扫描法:从头到尾的去找,直到扫描项目里面的所有文件。window 的搜索文件内容,linux 的 grep 命令就是如此的。小数据量的文件还可以接受,如果对于大量的文件,方法就很慢了。
2.索引:把非结构化数据重新设计成有一定的结构,利用结构化的数据采取一定的搜索算法加快速度。把非结构化数据中提取出的然后重新组织的信息,称之为索引。比如字典,字典的拼音表和部首检字表就是相当于字典的索引,对每一个字的解释就是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。
索引的目的可以理解为把非结构化的数据按某些特性抽离出,形成结构化的数据,然后再使用抽离出的结构化的数据,使用一定的检索方法去快速查询非结构的话数据。
3.Lucene和sola
形象的来说Solr和Lucene之间关系的方式是汽车和引擎,你不能驾驶一台发动机,但可以开一辆汽车。同样,Lucene是一个程序化库,不能按原样使用,而Solr是一个完整的应用程序,可以立即使用它。
4.lucene的底层原理 / 什么是倒排索引
倒排索引。由item查询key的过程,是倒排索引。对于网页搜索,倒排索引可以理解为Map<item, list>,能够由查询词快速(时间复杂度O(1))找到包含这个查询词的网页的数据结构。
举个例子,假设有3个网页:
url1 -> “我是中国人”
url2 -> “我是程序员”
url3 -> “我爱敲代码”
这是一个正排索引Map<url, page_content>。
分词之后:
url1 -> {我,是,中国人}
url2 -> {我,是,程序员}
url3 -> {我,爱,敲代码}
这是一个分词后的正排索引Map<url, list>。
分词后倒排索引:
我 -> {url1, url2,, url3}
是 -> {url1, url2}
爱 -> {url3}
中国人 -> {url1}
程序员 -> {url2}
敲代码 -> {url3}
由检索词item快速找到包含这个查询词的网页Map<item, list>就是倒排索引。
5.什么是正排索引
由key查询实体的过程,是正排索引。
用户表:t_user(id, name, passwd, age, sex),由id查询整行的过程,就是正排索引查询。
网页库:t_web_page(url, page_content),由url查询整个网页的过程,也是正排索引查询。
网页内容分词后,page_content会对应一个分词后的集合list。
简易的,正排索引可以理解为Map<url, list>,能够由网页快速(时间复杂度O(1))找到内容的一个数据结构。