Lucene高级学习文档看完已经跪了,真的强

733 阅读6分钟

lucene简介

以下内容来自维基百科:

Lucene是一套用于全文检索和搜索的开放源码程序库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程序接口,能够做全文索引和搜索。Lucene是现在最受欢迎的免费Java信息检索程序库。

全文检索(Full Text Retrieval)全文检索是指以全部文本信息作为检索对象的一种信息检索技术。最为常见的全文检索搜索引擎就是google和百度了,他们通过对互联网上的所有网页内容进行分析,索引,提供给我们秒级的搜索体验。其次,当前移动端各种APP,很多都内置了搜索功能,这些也是垂直领域的搜索实现。他们与google/百度的区别就是,只提供当前APP内信息的搜索,而不是互联网上的所有网页。
假设有10篇文章,每一篇都有标题和正文。当我们想找到正文中包含原子能的对应文章时,我们应该怎么做?
首先,最粗暴的办法,我们可以顺序读取每一篇文章,逐个字符进行判断,如果其中有连续的三个字符是 原子能,我们就记录下来这篇文章的标题,如此全部扫描一遍,我们就完成了一次搜索。
这个方法是相当简单粗暴,且有效的。在计算机性能十分强劲的情况下,对于1G的文件进行搜索,都可以使用这个方法(Linux下的grep命令,经常使用的话应该知道即使在GB级别的文件做些简单的搜索,通常性能也是能接受的)。
但是,数据量会远大于1G,搜索的要求也更加复杂,不是简单的字符串匹配,而是多种条件的组合。此时就需要全文搜索了。
像google这种搜索引擎,可以在0.5s的时间,搜索到与"全文搜索引擎"相关的1230w结果,这显然使用的不是顺序的逐个字符对比,而是类似于lucene的全文搜索了。

另外,Lucene不提供爬虫功能,如果需要获取内容需要自己建立爬虫应用。 Lucene只做索引和搜索工作**+XXX_WWW666666获取**前不久搞到了一份阿里架构师耗时一年整理的《Lucene高级学习文档》

内容结构分为13个部分。

目录如下:

一、搜索技术理论基础

Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

  • 为什么要学习Lucene

  • 数据查询方法

  • 全文检索技术应用场景

二、Lucene介绍

计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。

  • 什么是全文检索

  • 什么是Lucene

  • Lucene官网

三、Lucene全文检索的流程

  • 索引和搜索流程图

  • 索引流程

  • 搜索流程

四、Lucene入门

  • Lucene准备

  • 开发环境

  • 创建Java工程

  • 索引流程

  • 使用Luke查看索引

  • 搜索流程

五、Field域类型

Field是文档中的域,包括Field名和Field值两部分,一个文档可以包括多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。

  • Field属性

  • Field常用类型

  • Field修改

六、索引维护

管理人员通过电商系统更改图书信息,这时更新的是关系数据库,如果使用lucene搜索图书信息,需要在数据库表book信息变化时及时更新lucene索引库。

  • 需求

  • 添加索引

  • 修改索引

  • 删除索引

七、分词器

在对Document中的内容进行索引之前,需要使用分词器进行分词 ,分词的目的是为了搜索。分词的主要过程就是先分词后过滤。

  • 分词理解

  • Analyzer使用时机

  • Lucene原生分词器

  • 第三方中文分词器

八、Lucene高级搜索

QueryParser支持默认搜索域,第-个参数为默认搜索域.如果在执行parse方法的时候,查询语法中包含域名则从指定的这个域名中搜索,如果只有查询的关键字,则从默认搜索域中搜索结果.

  • 文本搜索

  • 數值范围搜索

  • 組合搜索

九、搜索案例

  • 引入依赖

  • 项目加入页面和资源

  • 创建包和启动类

  • 配置文件
    业务代码

十、Lucene底层储存结构(高级)

  • 详细理解lucene存储结构

  • 索引库物理文件

  • 索引库文件扩展名对照表

  • 词典的构建

十一、Lucene优化(高级)

  1. confifig.setMaxBufffferedDocs(100000); 控制写入一个新的segment前内存中保存的document的数目,设置较大的数目可以加快建索引速度。(数值越大索引速度越快, 但是会消耗更多的内存

  2. indexWriter.forceMerge(文档数量); 设置N个文档合并为一个段(数值越大索引速度越快, 搜索速度越慢; 值越小索引速度越慢, 搜索速度越快

  • 解决大量磁盘IO

  • 选择合适的分词器

  • 选择合适的位置存放索引库

  • 搜索api的选择

十二、Lucene相关度排序(高级)

Lucene对查询关键字和索引文档的相关度进行打分,得分高的就排在前边。

十三、Lucene使用注意事项(高级)

  • 关键词区分大小写 OR AND TO等关键词是区分大小写的,lucene只认大写的,小写的当做普通单词。
  • 读写互斥性 同一时刻只能有一个对索引的写操作,在写的同时可以进行搜索
  • 文件锁 在写索引的过程中强行退出将在tmp目录留下一个lock文件,使以后的写操作无法进行,可以将其手工删除
  • 时间格式 lucene只支持一种时间格式yyMMddHHmmss,所以你传一个yy-MM-dd HH:mm:ss的时间给lucene它是不会当作时间来处理的
  • 设置boost 有些时候在搜索时某个字段的权重需要大一些,例如你可能认为标题中出现关键词的文章比正文中出现关键词的文章更有价值,你可以把标题的boost设置的更大,那么搜索结果会优先显示标题中出现关键词的文章