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 ...
随机推荐
- C语言:一个数组中只有两个数字是出现一次
//1.一个数组中只有两个数字是出现一次, //其他所有数字都出现了两次. //找出这两个数字,编程实现.a //^=单独两个数的^结果 //单独出现的两个数不同位的标记 //position: ^结 ...
- JVM培训序幕篇
明天老王要给我们讲JVM的知识,提前发了一个小Demo给我们看,代码如下: package demo; import java.util.*; public class Demo { public s ...
- 链表--数据结构与算法JavaScript描述(6)
链表 概念 链表是由一组节点组成的集合. 每个节点都使用一个对象的引用指向它的后继. 指向另一个节点的引用叫做 链. 许多链表的实现都在链表最前面有一个特殊节点,叫做头节点. 链表的尾元素指向一个nu ...
- mybatis入门(二):增删改查
mybatis的原理: 1.mybatis是一个持久层框架,是apache下的顶级项目 mybatis托管到googlecode下,目前托管到了github下面 2.mybatis可以将向prepar ...
- C++ STL中的 Set的用法
https://blog.csdn.net/yas12345678/article/details/52601454 -----源头此处 1.关于set的概念 set 是STL中的集合. 集合 ...
- MySql 使用explain分析查询
今天写了个慢到哭的查询,想用explain分析下执行计划,后来发现explain也是有局限性的: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义函数对查询的影响情况 •EXPLAIN不 ...
- POJ青蛙的约会
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 114412 Accepted: 23446 Descript ...
- MySQL高级-性能分析Explain
1.使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的.分析你的查询语句或是表结构的性能瓶颈 . 2.执行方法:Explain + SQL语句 解释 ...
- serv-u自动停止的解决方法
在主界面serv-u管理控制台-主页--管理服务器----服务器详细信息下,点击“创建,修改并删除服务器事件”找到“事件”右击空白处---“添加”然后如下图所示填写: 点击“保存”就好了,而且我自己也 ...
- nodejs HTTP服务
nodejs中的HTTP服务 nodejs最重要的方面之一是具有非常迅速的实现HTTP和HTTPS服务器和服务的能力.http服务是相当低层次的,你可能要用到不同的模块,如express来实现完整 ...