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学习:12.Python字符串格式化
字符串格式化 讲解Python这么久,也没有讲解Python的字符串的格式化,那我们今天就来了解一下python字符串格式化的强大之处. 首先我们先理解一下为什么要有字符串的格式化,就是为了方便字符串 ...
- RMI入门HelloWorld
java RMI(Remote Method Invocation)是一种基于java远程调用技术,是对RPC的java实现,可以在不同主机上进行通信与方法调用.PRC通信原理如图: 方法调用从客户对 ...
- Unknown host 'services.gradle.org' 解决方法
报错如下: Unknown host 'services.gradle.org'. You may need to adjust the proxy settings in Gradle. Learn ...
- java操作HDFS
package com.lei.hadoop; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Fil ...
- #define NULL ((void *)0)引起的风波
1. 看下宏定义的结构体 typedef struct { ]; //CMEI/IMEI ]; //server ]; //CMEI/IMEI } Options; 2. 定义的NULL #defin ...
- Oracle TDE的学习
TDE的开启和关闭 设置wallet目录,在参数文件sqlnet.ora中,按照下面的格式加入信息 # Oracle Advanced Security Transparent Data Encryp ...
- 如何利用Navicat导入/导出mssql中的数据
sqlserver,在第一次使用该软件进行"连接"的时候,会提示安装"Microsoft Sqlsever Navicat Client.",这时直接点击&qu ...
- textview的阴影线
android:shadowColor="#000000" android:shadowDx="1" android:shadowDy="1" ...
- go通过第三方库 mahonia gbk 转utf8
go get github.com/axgle/mahonia dec := mahonia.NewDecoder("GBK")ret:=dec.ConvertString(res ...
- Turtlebot
Turtlebot2 数据分析: imu信息:只有z轴的旋转yaw,没有xy的角速度. odom:利用轮速计,提供平移变换,没有z方向的平移. 好的网站,详细介绍了turtlebot的使用:https ...