分享

基于lucene的案例开发1:lucene初始认知

本帖最后由 nettman 于 2015-4-16 22:42 编辑

问题导读


1.什么是结构化数据?
2.什么是非结构化数据?
3.如何对非结构化数据实现索引?
4.如何进行索引检索?








      lucene是自己接触java的第一个技术,自己也用lucene做过不少搜索后台,比如小说、漫画、新闻、视频、游戏等等,所以自己在lucene开发上还是稍微有点经验的。关于这个系列的案例选择上自己也有过纠结,最初的想法是想选择新闻这个板块的(因为自己手上有现成的代码,这样自己估计在后面的博客更新速度上会很快),但是发现就是有人按照我这博客实现了这个新闻的检索,好像也不会有什么成就感吧,在实际的学习、生活、娱乐上也不会有太大的作用,所以最后选择了小说这个模块。当然小说对学习是没有太大的帮助的,但如果真的实现了这个项目,这样以后就不需要去其他的地方去看小说了,完全可以在自己的系统上去看下说。对于这系列的文章,分四大部分介绍

第一部分:lucene的基本原理以及API简单接口的使用
第二部分:基于lucene4.3.1创建小说实时索引后台
第三部分:某一个站点的小说信息采集(具体是哪一个站点,等到了这一部分再确定;采集并不是自己擅长的部分,这部分在实现上估计会有诸多漏洞,还请见谅)
第四部分:BS模式设计系统前端展示

      上面四大部分,第三、第四部分自己并不是太擅长,到时候如果有漏洞,还请多多指正;自己即将开始自己的lucene案例开发之旅,祝福自己可以顺利完成吧。


lucene初始认知

数据分类:
      对于日常生活中的数据,我们可以大致分为如下三大类:结构化数据、非结构化数据、半结构化数据:

结构化数据:指具有固定格式或有限长度的数据,如数据库行数据:存在数据库中,可以用二维表结构来逻辑表达实现的数据


非结构化数据:指不定长度或者无固定格式的数据,如邮件、word文档、音频、超音频等

半结构化数据:对于这种数据可以按照结构化数据来处理,也可以提取纯文本按照非结构化数据来处理,如xml数据

      对于不同的数据当然就需要采取不同的检索方式,结构化数据大家也许都很熟悉,可以用熟悉的sql语句进行检索,如“select * from student where stuno like '2014%'”,这样一条简单的sql语句就可以查找到所有学号以2014开始的学生信息了;那对于非结构化的数据又该如何处理呢?使用sql中的like?这答案显然是否定的,对于非结构化的数据常用的检索方式有顺序扫描、索引(Index),不用测试也可以知道,顺序扫描的效率还是相当差的,下面就重点的介绍一下对非结构化数据的索引检索。

索引步骤:

      对于非结构化数据采用索引检索又可以说是全文检索(Full-Text-Search),在索引过程中,我大致给它分成两大步骤:
索引创建(Indexing):将结构化数据或非结构化数据提取信息创建索引的过程,具体如下图左半部分所示:
搜索索引(Search)根据用户的查询条件,检索已创建的索引,返回查询结果的过程,具体如参照下图右半部分所示:

1.png

      上图左半部分就是索引的创建过程,可以将文件系统数据、数据库数据、web数据等,通过索引的创建,形成最终的索引文件;右半部分是用户检索过程,获取用户查询条件,检索索引库最终返回检索结果。
     仔细看下上图,我们很容易会想到下面3个问题:
索引是什么?

如何创建索引?

如何进行索引检索?

      下面就对这三个问题做一一解答。

索引是什么
      如以前没有接触过索引的话,这部分还是很难理解的众多专业名词的,因此下面就举一个简单的例子来说明下,什么是索引:

2.png


      对于上图中的三个小图片我想大家并不会太陌生,那现在大家就开回忆一下,我们在使用新华字典去查找一个汉子解释的这个过程:通过音节索引或者部首索引查找到想要查找的汉子所在的页码数-->翻到对应的页码,查看该汉字的解释。下面我们想一下,如果没有这些音节索引或者部首索引,我们这次检索过程是不是会花费很长的时间?不知道到现在,你是不是对索引有了一个大概的了解。

      其实上图中间的部分,就相当于我们这里提到的索引,这种由字符串到文件的映射是文件到字符串映射的反向过程,我们就称这种信息为反向索引。

3.png

上图中左半部分保存的信息,我们一般称为字典,左侧每一个字符串指向右侧的文档链接,此文档链表称为倒排表。关于新华字典的例子如何和反向索引对应起来这个就自己思考下。


如何创建索引

     对于索引的创建,我对其总结出一个三步曲:需要检索的数据(Document)、分词技术(Analyzer)、索引组建(Indexer),可以简单的参照下图:

4.jpg


      我们还是通过简单的例子来介绍这个过程

      第一步数据:Document事例数据:

你好!我是小李。
中国在哪里?
你是谁?
lucene基础知识学习课程。
你在中石油上学?
中石油在哪里?

      第二步:分词技术,这里采用StandarAnalyzer(标准分词)

你|好|我|是|小|李|
中|国|在|哪|里|
你|是|谁|
lucene|基|础|知|识|学|习|课|程|
你|在|中|石|油|上|学|
中|石|油|在|哪|里|

      第三步:索引创建字典:
5.jpg
      第四步:索引组建合并词成倒排表:
6.jpg
      到现在,索引文件就已经创建完成。

如何搜索
      对索引的检索过程,我对其总结出四步曲:获取检索词(KeyWords)、分词技术(Analyzer)、检索索引(Aearch)、返回结果列表,可以简单参照下图:
7.jpg
      同样我们还是继续接上述事例去说搜索过程
      第一步:KeyWord事例数据
中石油
     第二步:分词技术(因为创建索引的时候,采用的是标准分词,索引在搜索的过程,也应该采用该分词技术)
中|石|油|

      第三步:检索索引搜索记录:
8.jpg
      第四步:返回结果列表
中石油在哪里?
你在中石油上学?

       上述三个问题,都已经通过具体的事例进行了解答,由于自己接触lucene的时间也只是短短的两年时间,好多原理自己也不是太清楚,所以自己的这系列的博客不会涉及太多的具体原理,如果想做深入的了解,建议还是买一本参考书对其做系统的了解。



相关内容:
基于lucene的案例开发1:lucene初始认知

基于lucene的案例开发2:索引数学模型

基于lucene的案例开发3:索引文件结构

基于lucene的案例开发4:创建索引

基于lucene的案例开发5:搜索索引

基于lucene的案例开发6:分词器介绍

基于lucene的案例开发7:Query查询

基于lucene的案例开发8:IndexSearcher中检索方法

基于lucene的案例开发9:案例初识

基于lucene的案例开发10:搜索后台基础,JsonUtil & XmlUtil类介绍

基于lucene的案例开发11:项目常用类ClassUtil & CharsetUtil介绍

基于lucene的案例开发12:数据库连接池

基于lucene的案例开发13:实现实时索引基本原理

基于lucene的案例开发14:实时索引管理类IndexManager

基于lucene的案例开发15:实时索引的检索

基于lucene的案例开发16:实时索引的修改

基于lucene的案例开发17:查询语句创建PackQuery

基于lucene的案例开发18:纵横小说更新列表页抓取

基于lucene的案例开发19:纵横小说简介页采集

基于lucene的案例开发20:纵横小说章节列表采集

基于lucene的案例开发21:纵横小说阅读页采集

出处:http://blog.csdn.net/xiaojimanman/article/details/42804365

已有(4)人评论

跳转到指定楼层
feng01301218 发表于 2015-4-5 10:54:29
问题导读


1.什么是结构化数据?
2.什么是非结构化数据?
3.如何对非结构化数据实现索引?
4.如何进行索引检索?
回复

使用道具 举报

ainubis 发表于 2015-4-5 16:38:58
回复

使用道具 举报

zhujun182104906 发表于 2015-4-10 10:40:28
回复

使用道具 举报

karo_lee 发表于 2015-4-16 10:17:21
讲得很好啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条