一、什么是全文索引

全文检索首先将要查询的目标文档中的词提取出来,组册索引(类似书的目录),通过查询索引达到搜索目标文档的目的,这种先建立索引,再对索引进行搜索的过程就叫全文索引。

从图可以看出做全文搜索的步骤:

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 学习之基础篇的更多相关文章

  1. 一步步学习javascript基础篇(0):开篇索引

    索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...

  2. 一步步学习javascript基础篇(3):Object、Function等引用类型

    我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...

  3. Python3学习(1)-基础篇

    Python3学习(1)-基础篇 Python3学习(2)-中级篇 Python3学习(3)-高级篇 安装(MAC) 直接运行: brew install python3 输入:python3 --v ...

  4. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  5. Python学习笔记——基础篇【第一周】——变量与赋值、用户交互、条件判断、循环控制、数据类型、文本操作

    目录 Python第一周笔记 1.学习Python目的 2.Python简史介绍 3.Python3特性 4.Hello World程序 5.变量与赋值 6.用户交互 7.条件判断与缩进 8.循环控制 ...

  6. java学习笔记-基础篇

    Java基础篇 1—12 常识 13 this关键字 14参数传递 16 继承 17 访问权限 28—31异常 1—12 常识 1.文件夹以列表展示,显示扩展名,在地址栏显示全路径 2.javac编译 ...

  7. Java学习路线-基础篇!

    下面以黑马程序员Java学院的学习路线为例,进行一次史无前例的剖析,我会采取连载的形式,细致的讲解零基础的人怎么学习Java.先看下Java在基础阶段的知识点路线图. 内容多吗?不要被吓到了,知识点剖 ...

  8. 一步步学习javascript基础篇(8):细说事件

    终于学到事件了,不知道为何听到“事件”就有一种莫名的兴奋.可能是之前的那些知识点过于枯燥无味吧,说起事件感觉顿时高大上了.今天我们就来好好分析下这个高大上的东西. 可以说,如果没有事件我们的页面就只能 ...

  9. 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)

    上一篇介绍了对象创建的几种基本方式,今天我们看分析下对象的继承. 一.原型链继承 1.通过设置prototype指向“父类”的实例来实现继承. function Obj1() { this.name1 ...

随机推荐

  1. ruby 爬虫爬取拉钩网职位信息,产生词云报告

    思路:1.获取拉勾网搜索到职位的页数 2.调用接口获取职位id 3.根据职位id访问页面,匹配出关键字 url访问采用unirest,由于拉钩反爬虫,短时间内频繁访问会被限制访问,所以没有采用多线程, ...

  2. Python学习笔记六:集合

    集合 Set,去重,关系测试:交.并.差等:无序 list_1=set(list_1), type(list_1) list_2=set([xxxxx]) 交集:list_1.intersectin( ...

  3. Go Web 问题集-持续更新

    前端: 导入静态js,css报错,在确保js和css语法编写正确的前提下 GET   错误:          等问题 1.在服务器中运行:静态服务文件路径设置错误 2.本地运行:相对路径设置错误 3 ...

  4. Multiclonal Invasion in Breast Tumors Identified by Topographic Single Cell Sequencing

    Title:  Multiclonal Invasion in Breast Tumors Identified by Topographic Single Cell Sequencing 课题的目的 ...

  5. SpringBoot学习:整合shiro(验证码功能和登录次数限制功能)

    项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)验证码 首先login.jsp里增加了获取验证码图片的标签: <body s ...

  6. 从零学习安全测试,从XSS漏洞攻击和防御开始

    WeTest 导读 本篇包含了XSS漏洞攻击及防御详细介绍,包括漏洞基础.XSS基础.编码基础.XSS Payload.XSS攻击防御. 第一部分:漏洞攻防基础知识   XSS属于漏洞攻防,我们要研究 ...

  7. python 水仙花

    #简单def narcissus(): for n in range(100, 1000, 1): a, b, c = n//100, (n//10)%10, (n%100)%10 if a ** 3 ...

  8. hdu1394Minimum Inversion Number(线段树,求最小逆序数)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  9. gitlab-登录账户遇到ERROR: Permission to XXX.git denied to user报错怎么办

    碰到这个问题就意味着没有访问账户的权限,没有把访问电脑与访问账户用ssh_key关联起来,解决流程: 1.查看本地是否有ssh_key 笔者用的是git bash来输入命令 ls -al ~/.ssh ...

  10. ReadyAPI 教程和示例(二)

    声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 接上一篇: 4.修改SoapUI测试 本节将演示如何为测试用例添加测试步骤以及更改请求参 ...