lucene 学习之基础篇
一、什么是全文索引
全文检索首先将要查询的目标文档中的词提取出来,组册索引(类似书的目录),通过查询索引达到搜索目标文档的目的,这种先建立索引,再对索引进行搜索的过程就叫全文索引。

从图可以看出做全文搜索的步骤:
1、对目标数据源中提取相应的词建立索引
2、通过检索索引(检索索引中的词),从而找到目标文件即源数据。
现在的全文检索不仅能对字符串进行匹配,而是已经发展到可以对大文本、语言、图像、活动影像等非结构化数据进行综合管理的发、大型软件。
二、lucene
百度百科
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。
1、使用lucene建立索引(对目标数据源中提取相应的词建立索引)

ps:什么是文档(Document) 文档就是我们要采集的目标数据源,他可以是文件、图片、数据库表中的一条记录。
- Acquire Document:采集文档
- Build Document:建立文档
- Analyzer Document:采用分词器分析文档
- Index Document:对分词后的文档建立索引
- Index:将建立好的索引存入索引库
2、使用lucene检索索引(通过检索索引(检索索引中的词),从而找到目标文件即源数据)

ps:这里的Index 索引库 就是第一步中使用lucene建立的索引库。
- Search User Interface:查询接口
- Build Query:创建查询对象
- Run Query:执行查询(从索引库中查询)
- Render Results:获取查询结果,并将结果返回给用户
三、Field(域)的概念
1、获取原始内容的目的是为了建立索引,在索引前需要将原始内容创建成文档(Document),文档中包括一个一个的域(Field),域(field)在lucene中就是用于搜索和存储分词后的内容,我们在搜索时就是通过域进行的。
例如磁盘中的一个文件我们将它当作一个Document,那么该Document包括这些Field域
a、file_name:文件名
b、file_path:文件路径
c、file_size:文件大小
d、file_content:文件内容
四、分词
分词:将原始内容创建为包含域Field的文档(document),需要再对域中的内容进行分析,分析的过程是经过对原始文档提取单词,将字母转为小写,去掉标点符号,去掉停用词等过程生成最终的语汇单元。可以将语汇单元理解为一个一个单词。
例如
原始文档:Collector construction for two-pass grouping queries is
分析后的语汇单元是:Collector、 construction、 for、 two、pass 、grouping 、queries 、is
检索原理:lucene会将你传入的搜索条件按照与创建索引相同的分词方式进行分词形成语汇单元,然后根据这些语汇单元搜索相应的目标文件(源数据)。
例如:搜索条件 Collector construction
分析后的语汇单元是: Collector、 construction
按照分析后的语汇单元(Collector、 construction)搜索
分词器的使用:
a、StandardAnalyzer 标准分词器
public static void main(String[] args) throws IOException {
Analyzer az=new StandardAnalyzer();
//创建分词
TokenStream stream=az.tokenStream("content", "爱我中华 china");
//分词对象重置
stream.reset();
//获得每一个语汇偏移量的属性对象
OffsetAttribute oa=stream.addAttribute(OffsetAttribute.class);
//获得分词器的语汇属性
CharTermAttribute ca=stream.addAttribute(CharTermAttribute.class);
//遍历分词的语汇
while(stream.incrementToken()){
System.out.println("--------------------------");
System.out.println("开始索引:"+oa.startOffset()+" 结束索引:"+oa.endOffset());
System.out.println(ca);
}
}
结果:标准分词器对中文的分词是每个字进行分词。
--------------------------
开始索引:0 结束索引:1
爱
--------------------------
开始索引:1 结束索引:2
我
--------------------------
开始索引:2 结束索引:3
中
--------------------------
开始索引:3 结束索引:4
华
--------------------------
开始索引:6 结束索引:11
china
b、IKAnalyzer 中文分词器
public static void main(String[] args) throws IOException {
Analyzer az=new IKAnalyzer();
//创建分词
TokenStream stream=az.tokenStream("content", "爱我中华");
//重置分词对象
stream.reset();
//获得每一个语汇偏移量的属性对象
OffsetAttribute oa=stream.addAttribute(OffsetAttribute.class);
//获得分词器的语汇属性
CharTermAttribute ca=stream.addAttribute(CharTermAttribute.class);
//遍历分词的语汇
while(stream.incrementToken()){
System.out.println("--------------------------");
System.out.println("开始索引:"+oa.startOffset()+" 结束索引:"+oa.endOffset());
System.out.println(ca);
}
}
结果:
--------------------------
开始索引:0 结束索引:2
爱我
--------------------------
开始索引:1 结束索引:2
我
--------------------------
开始索引:2 结束索引:4
中华
lucene 学习之基础篇的更多相关文章
- 一步步学习javascript基础篇(0):开篇索引
索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...
- 一步步学习javascript基础篇(3):Object、Function等引用类型
我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...
- Python3学习(1)-基础篇
Python3学习(1)-基础篇 Python3学习(2)-中级篇 Python3学习(3)-高级篇 安装(MAC) 直接运行: brew install python3 输入:python3 --v ...
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
- Python学习笔记——基础篇【第一周】——变量与赋值、用户交互、条件判断、循环控制、数据类型、文本操作
目录 Python第一周笔记 1.学习Python目的 2.Python简史介绍 3.Python3特性 4.Hello World程序 5.变量与赋值 6.用户交互 7.条件判断与缩进 8.循环控制 ...
- java学习笔记-基础篇
Java基础篇 1—12 常识 13 this关键字 14参数传递 16 继承 17 访问权限 28—31异常 1—12 常识 1.文件夹以列表展示,显示扩展名,在地址栏显示全路径 2.javac编译 ...
- Java学习路线-基础篇!
下面以黑马程序员Java学院的学习路线为例,进行一次史无前例的剖析,我会采取连载的形式,细致的讲解零基础的人怎么学习Java.先看下Java在基础阶段的知识点路线图. 内容多吗?不要被吓到了,知识点剖 ...
- 一步步学习javascript基础篇(8):细说事件
终于学到事件了,不知道为何听到“事件”就有一种莫名的兴奋.可能是之前的那些知识点过于枯燥无味吧,说起事件感觉顿时高大上了.今天我们就来好好分析下这个高大上的东西. 可以说,如果没有事件我们的页面就只能 ...
- 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)
上一篇介绍了对象创建的几种基本方式,今天我们看分析下对象的继承. 一.原型链继承 1.通过设置prototype指向“父类”的实例来实现继承. function Obj1() { this.name1 ...
随机推荐
- xargs命令的使用过程中一个小领悟:管道与xargs的差别
对xargs的使用总是比较模糊,大概的理解为:通道中,上一个命令的标准输出逐行作为下一个命令的参数 例如 find /var/temp* | xargs rm -r 功效:找出/var/中所有temp ...
- Nodejs实战 —— 测试 Node 程序
读 <node.js实战2.0>,进行学习记录总结. 当当网购买链接 豆瓣网1.0链接 测试 Node 程序 本章内容 用 Node 的 assert 模块测试 使用其他断言库 使用 No ...
- WebRTC中Android Demo中的远程视频流的获取到传输
1.CallActivity#onCreate 执行startCall开始连接或创建房间 2.WebSocketClient#connectToRoom 请求一次服务器 3.回调到CallActivi ...
- 北京Uber优步司机奖励政策(12月27日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 青岛Uber司机奖励政策(8月31号~9月6号)
本周的奖励规则如下,请各位司机朋友按照自己的情况查询. 人民优步(People’s Uber) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版 ...
- 每天看一片代码系列(三):codepen上一个音乐播放器的实现
今天我们看的是一个使用纯HTML+CSS+JS实现音乐播放器的例子,效果还是很赞的: codePen地址 HTML部分 首先我们要思考一下,一个播放器主要包含哪些元素.首先要有播放的进度信息,还有播放 ...
- SpringBoot 基于lettuce 连接池 配置redis多数据源操作 生产配置
添加pom<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons- ...
- MySQL高级-性能分析Explain
1.使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的.分析你的查询语句或是表结构的性能瓶颈 . 2.执行方法:Explain + SQL语句 解释 ...
- 必读的 Android 文章
必读的 Android 文章 掘金官方 关注 2017.06.07 13:58* 字数 25218 阅读 8782评论 2喜欢 218 写给 Android 开发者的混淆使用手册 - Android ...
- java 的原型模式和clone
原型模式是一种创建型设计模式,在java中可以直接调用object.clone(). 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多 ...