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 ...
随机推荐
- python逻辑判断 () not and or
python逻辑判断 () not and or 优先级关系:()>not>and>or 运算符示意 not –表示取反运算. and –表示取与运算. or –表示取或运算. or ...
- C++ STL中的 Set的用法
https://blog.csdn.net/yas12345678/article/details/52601454 -----源头此处 1.关于set的概念 set 是STL中的集合. 集合 ...
- 关于java的wait、notify、notifyAll方法
wait.notify.notifyAll 遇到的问题 之前开发打印机项目,因为需要使用多线程技术,当时并不怎么理解,一开始随意在方法体内使用wait.notify.notifyAll 方法导致出现了 ...
- spring之HttpInvoker
一.HttpInvoker是常用的Java同构系统之间方法调用实现方案,是众多Spring项目中的一个子项目.顾名思义,它通过HTTP通信即可实现两个Java系统之间的远程方法调用,使得系统之间的通信 ...
- JS中String对象常用的方法
1. stringObject.charAt(index) 参数:index 必需,即字符在字符串中的下标. 返回值: 返回在指定位置的字符.返回的字符是长度为 1的字符串.(length属性 ...
- 了解Python控制流语句——while 语句
while 语句 Python 中 while 语句能够让你在条件为真的前提下重复执行某块语句. while 语句是 循环(Looping) 语句的一种.while 语句同样可以拥有 else 子句作 ...
- JVM--Java类加载机制
一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其存放在运行时数据区的方法区内,然后在java堆区创建一个java.lang.Class对象,用来封装类在方法区内 ...
- 缓存 memcache 小白笔记
W: Memcached是神魔? Q:Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. W:原理图 Q:如下 1浏览器 2 服务器 3 数据库 4 memcac ...
- 树莓派怎么连接无线网wifi?
没有显示器的同学,想要连接无线网,一定非常苦恼,前面教会了大家远程登录图形界面,下面我将教会大家:在没有图形界面的情况下,怎么连接树莓派WiFi.同样还是利用putty远程访问软件登录,但这次不需要登 ...
- 利用maven进行项目管理
下面为maven项目管理的一个结构 首先pom是路径文件,我们在编译或是运行程序时调用到jdk或一些自己写的jar包时会需要指明物理路径,这里的pom是一样的道理,同时在maven的管理下多出来了一些 ...