Lucene 实战前 核心理论简述

本文导读

  • 本文作为整个 Lucene 标签教程的起点,重点阐述 Lucene 的理论知识。

数据分类

  • 了解 Lucene 之前,应该先知道开发中的数据分类,总体分为两类:结构化数据、非结构数据。

1)结构化数据

  • 结构化数据:指有固定类型或者有固定长度的数据。
  • 最常见的就是关系型数据库中的数据(mysql、oracle等),数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。
  • 结构化数据搜索方法:数据库中数据直接通过 sql 语句搜索

2)非结构化数据

  • 非结构化数据:没有固定类型和固定长度的数据
  • 例如: world 文档中的数据, 邮件中的数据,各种文档、图片、视频/音频等都属于非结构化数据
  • 非结构化数据检索的方式主要分为 “顺序扫描法”、"全文检索算法" 两种。

2.1)顺序扫描法

  • 顺序扫描法(Serial Scanning):根据搜索的关键字,一个文档接一个文档的进行扫描,从文档中由头至尾逐字匹配,直到搜索完所有的文档。Ctrl + F 文档搜索就是一个典型的例子
  • 优点:如果文档中存在要找的关键字就一定能找到想要的内容,准确率高
  • 缺点:如果文档过于庞大、获取文档数量太多,则检索慢, 效率低。

2.2)全文检索算法

  • 全文检索算法(Full-text Search):又称倒排序索引算法,首先将需要查询的文本提取出来, 进行切分词, 将切分出来的词组成索引(目录),查询的时候先查索引(目录),根据索引则可快速的找到对应的文档。
  • 典型的例子就是读书的时候使用的“字典”,所有的汉字约 8、9万个,要想从里面快速查询出需要的汉字,可以根据 拼音或者部首 进行查找,其中拼音和部首 就相当于全文检索算法的“目录”。
  • 优点:查询速度快, 不会随着数据量的增大而使查询速度明显的变慢 
  • 缺点:创建的目录会占用额外的磁盘空间,本质是是用空间换时间,不过是可以接受的
  • 切分词:将文档中一句一句的话切分成一个一个的词,同时去掉里面的空格,所有的标点符号,以及停用词(如 a, an, the, 的, 地, 得,嗯,啊)
假如一个原文档内容如下:
        2013年秋,中国国家主席习近平西行哈萨克斯坦、南下印度尼西亚
则 Lucene 进行分词后创建的索引(目录)大致如下:
        索引目录:                   对应的1个或多个文档
        2013························文档xx、文档yy
        2013年························文档xx、文档yy
        秋························文档xx、文档yy
        中国························文档xx、文档yy
        国家························文档xx、文档yy
        主席························文档xx、文档yy
        习近平························文档xx
        西行························文档xx、文档yy
        哈萨克斯坦························文档yy
        南下························文档xx、文档zz
        印度························文档xx、文档yy、文档zz
        印度尼西亚························文档xx、文档yy
        西亚························文档xx、文档yy
........以此类推
  • 原理:相当于字典,分为目录和正文两部分,查询的时候通过先查目录,然后通过目录上标注的页数去正文页查找需要的内容
  • 常用汉字约3500个,文档个数即使有成千上万个,但是汉字所组成的词语(索引/目录)却是可以在所有文档中通用的,即一个索引可以指向任意个文档。

Lucene  简述

  • Lucene 是 Apache 软件基金会4 jakarta 项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。、
  • Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
  • 全文检索引擎(系统)是通过浏览器可以直接访问的,与全文检索引擎工具包不能混淆。
  • Apache Lucene 官网地址:http://lucene.apache.org/

  • Lucene 官网全部版本下载地址:http://archive.apache.org/dist/lucene/java/

应用领域

  • 互联网全文检索引擎:例如 百度、谷歌、必应 等,它们检索的是整个互联网的内容,内容的链接是它们通过网络爬虫全网扫描爬取而来。
  • 站内全文检索引擎:例如 淘宝、京东 等,它们检索的是自己网站内部的内容。
  • 优化数据库查询:以 Mysql 数据库为例,如果表中的数据达到上千万时,使用 "like" 关键字来模糊查询时,它会进行全表扫描,相当于顺序扫描,速度很慢,效率太低,这时使用 Lucene 可以进行优化。
  • 对于数据量大、数据结构不固定的数据都可采用全文检索方式搜索。

Luncene 域详解

  • Lucene 可以理解成一个可以分词、检索、以及存储文档的数据库,它会将原始的文档进行处理然后转为自己的数据,之后查询时直接从 Lucene 中进行快速检索
  • 这些纯理论可以结合实际代码进行理解《 Lucene 实战之入门案例》,通过实际的代码流程就能更清晰的掌握这些概念
  • Lucene 中的 Document 相当于 Mysql 数据库表中的一行,Document 中的 Field 相当于 Mysql 数据库表中的字段。
  • Lucene 中提供了不同的 Field(域)类型,就如同 Mysql 数据库拥有不同的数据类型一样,如下所示。
  • 如下表中的域类型的超级接口为:org.apache.lucene.index.IndexableField
  • 每个域类型的 “是否分词(Analyzed)”、“Indexed(是否索引)”程序员无法修改,都是约定好的,“是否存储(Stored)”可以自己设置。

Field类

数据类型

Analyzed

是否分析(不可修改)

Indexed

是否索引(不可修改)

Stored

是否存储(可选)

说明

StringField(FieldName, FieldValue,Store.YES))

字符串

N

Y

YN

字符串Field,不会进行分词,会将整个串存储在索引中,比如(订单号,姓名等)

是否存储在文档中用Store.YES或Store.NO决定

StoredField(FieldName, FieldValue)

重载方法,支持多种类型

N

N

Y

用来构建不同类型的Field,通常存储多媒体文件。

不分词,不索引,会存储

TextField(FieldName, FieldValue, Store.NO)

TextField(FieldName, reader)

 

字符串

Y

Y

YN

文本 Field,会分词、会索引、可选是否存储

如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略.

LongField(FieldName, FieldValue,Store.YES)

Long型

Y

Y

Y或N

用来构建Long数字型Field,进行分析和索引,比如(价格)

是否存储在文档中用Store.YES或Store.NO决定

  • 如上所示只是 org.apache.lucene.index.IndexableField 子类中的一部分,其余请自行查找
  • 由上可知,应该根据应用的实际情况,是否需要分词、是否要进行索引、是否要存储等来选择合适的 Field(域)

1)是否分词

  • 分词的作用是为了索引
  • 比如需要分词的有: 文件名称、文件内容、商品价格(Lucene对商品价格等需要对比的字段是进行分词的)等
  • 不需要索引的域不需要进行分词,或者分词后毫无意义的域也不需要分词,如:id、身份证号、图片地址 等

2)是否索引

  • 索引的的目的是为了搜索
  • 需要搜索的域就一定要创建索引,只有创建了索引才能被搜索出来,不需要搜索的域可以不创建索引
  • 需要索引的比如有: 文件名称、文件内容、id、身份证号 等
  • 不需要索引的比如有:图片地址(e:\\xxx.jpg) 等 ,因为根据图片地址搜索无意义

3)是否存储

  • 存储的目的是为了显示
  • 是否存储看应用需要,存储就是将内容放入Document 文档对象中保存起来,以便下次访问时能快速的进行查询
  • 如果不是立刻需要显示出来,则也不需要存储在Lucene中,可以存储在其它数据库中,如 Mysql等,可以将没有结构而要繁多的数据存储在 Lucene 中,而将其余结构化的数据放在 Mysql 等数据库中,根据 Lucene 中查询的结果再查询 Mysql。

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/82106829