Lucene的概述与应用场景(1)

news2024/11/23 8:08:07

文章目录

  • 第1章 Lucene概述
    • 1.1 搜索的实现方案
      • 1.1.1 传统实现方案
      • 1.1.2 Lucene实现方案
    • 1.2 数据查询方法
      • 1.1.1 顺序扫描法
      • 1.1.2 倒排索引法
    • 1.3 Lucene相关概念
      • 1.3.1 文档对象
      • 1.3.2 域对象
        • 1)分词
        • 2)索引
        • 3)存储
      • 1.3.3 常用的Field种类
    • 1.4 分词器

第1章 Lucene概述

Lucene是apache软件基金会 jakarta项目组的一个子项目,是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。其作者是大名鼎鼎的大数据之父Doug-Cutting。Lucene通过使用倒排索引技术,能够快速地从大量的文档中检索出相关信息。对文本数据进行高效的索引和搜索,支持复杂的查询语法,包括布尔运算、短语搜索、模糊搜索等。

在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索[程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。Java中著名的搜索引擎ElasticSearch、Solr等都是采用Lucene作为内核进行开发;

  • Lucene官网:https://lucene.apache.org/

Lucene的应用场景如下:

  • 网站搜索:许多网站使用Lucene或其衍生产品(如Elasticsearch)来提供站内搜索功能。
  • 企业级搜索:在企业内部,Lucene可用于构建文件、邮件、数据库记录等信息的搜索引擎。
  • 日志分析:对于大规模的日志数据,可以通过Lucene快速定位到特定的错误或异常信息。
  • 电子商务:在线购物平台经常利用Lucene来优化商品搜索体验,提高用户满意度。

1.1 搜索的实现方案

1.1.1 传统实现方案

用户发送请求查询到服务器,服务器通过SQL查询数据库将结果返回,最终将结果集响应到用户。

特点:数据库服务器压力大,查询速度慢,搜索不智能化。

1.1.2 Lucene实现方案

说明:根据用户输入的搜索关键词(java),应用服务器通过lucene的API搜索索引库,索引库把搜索结果响应应用服务器,应用服务器再把搜索结果响应给用户。

特点:解决用户量大,数据量很大,系统对搜索速度要求高并且需要智能化搜索的业务需求。

1.2 数据查询方法

1.1.1 顺序扫描法

举个例子:比如我们有大量的文件,文件编号从A,B,C。。。。。。

需求:要找出文件内容中包含有java的所有文件

需求实现:从A文件开始查找,再找B文件,然后再找C文件,以此类推。。。。。

特点:如果文件数量很多,查找将会非常慢。

1.1.2 倒排索引法

举个例子:使用新华字典查找汉字,先找到汉字的偏旁部首,再根据偏旁部首对应的目录(索引)找到目标汉字。这个目录在计算机中被称为索引是用来帮助程序快速查询数据用的。

索引的组织方式有很多,底层结构也不一样,但无论是那种索引都只有一个目标,那就是用于提高查询性能,快速定位到目标数据所在。

以Lucene为例建立倒排索引:

文件一(编号0):I am Chinese I am Chinese

文件二(编号1):I love China

Term(Doc,Freq)
Chinese(0) (2)
love(1)(1)
china(1)(1)

说明:

  1. 建立倒排索引,就是建立词语与文件的对应关系(词语在什么文件出现,出现了几次,在什么位置出现)
  2. 搜索的时候,直接根据搜索关键词(java),在倒排索引中找到目标内容。

1.3 Lucene相关概念

使用Lucene的第一步我们需要采集原始数据,数据的来源可以是传统的关系型数据库、文本文件、网络资源等;

  • 保存在关系数据库中的业务数据MySQL:通过JDBC操作获取到关系数据库中的业务数据(mysql)
  • 保存在文件中的数据:通过IO流获取文件上的数据
  • 网络上的网页文件数据:通过爬虫(蜘蛛)程序获取网络上的网页数据

1.3.1 文档对象

文档对象(Document):一个文档对象包含有多个域(Field)。一个文档对象就相当于关系数据库表中的一条记录,一个域就相当于一个字段。

1.3.2 域对象

在Lucene中,一篇文档对应数据库的一行数据,一个域对象则对应一个字段,一个文档由多个域对象组成。在Lucene中不同的域对象具有不同的属性和功能

1)分词

分词(tokenized):对域中的文本内容进行根据要求进行分析,将一段文本分析成一个个符合逻辑的词组;

原始文档:

华为5G智能全面屏拍照游戏手机

分词后:

华为、5G、智能、全面屏、拍照、游戏、手机、游戏手机
  • 需要分词的域(Field):商品名称,商品标题。这些内容用户需要输入关键词进行查询,由于内容格式大,内容多,需要进行分词处理建立索引。
  • 不需要分词的域(Field):商品编号,身份证号。是一个整体,分词以后没有意义,不需要分词。
2)索引

索引(indexed):对分词后的数据(词组)建立索引关系(建立倒排索引表),索引的目的是为了搜索,最终实现的效果是只需要搜索分词后的词组就能找出对应的文档;

创建索引是对词组单元索引,通过词语找文档,这种索引的结构叫倒排索引结构。

原始文档:

doc-01: 华为5G智能全面屏手机
doc-02: vivo智能5G游戏手机

分词后的数据:

doc-01: 华为、5G、智能、全面屏、手机、全面屏手机
doc-02: vivo、智能、5G、游戏、手机、游戏手机
  • 建立的索引(倒排索引表):
Term(Doc,Freq)
华为(1) (1)
5G(1) (1) (2) (1)
智能(1) (1) (2) (1)
全面屏(1) (1)
全面屏手机(1) (1)
游戏(1) (1)
手机(1) (1) (2) (1)
游戏手机(2) (1)
vivo(2) (1)

建立索引其实就是建立词组与文档之间的关系,这个关系表就是倒排索引表,由于倒排索引表中也包含词组,因此索引建立的越多,占用的磁盘空间也会很大;

  • 需要建立索引的域:商品名称,商品描述需要分词建立索引。商品编号,身份证号作为整体建立索引。只要将来要作为用户查询条件的词,都需要索引。
  • 不需要建立索引的域:商品图片路径,不作为查询条件,不需要建立索引。
3)存储

存储(stored):由于索引库的数据都是从其他地方采集的(大多数是从关系型数据库中采集),因此其他地方已经存储一份原始数据,因此有些域我们是不需要存储到Lucenen的索引库的,只有那些需要搜索的域我们才存储到Lucene中;

  • 需要存储的域:商品名称,商品价格。凡是将来在搜索结果页面展现给用户的内容,都需要存储。

  • 不需要存储的域:商品描述。内容多格式大,不需要直接在搜索结果页面展现,不做存储。需要的时候可以从关系数据库取。

1.3.3 常用的Field种类

Field种类数据类型是否分词是否索引是否存储说明
StringField(FieldName,FieldValue,Store.YES))字符串NYY或N字符串类型Field,不分词,作为一个整体进行索引(比如:身份证号,商品编号),是否需要存储根据Store.YES或Store.NO决定
DoublePoint(FieldName,FieldValue)数值型代表YYNDouble数值型Field代表,分词并且索引(比如:价格),不存储
StoredField(FieldName,FieldValue)重载方法,支持多种类型NNY构建不同类型的Field,不分词,不索引,只存储。(比如:商品图片路径)
TextField(FieldName,FieldValue,Store.NO)文本类型YYY或N文本类型Field,分词并且索引,是否需要存储根据Store.YES或Store.NO决定

1.4 分词器

分词器,是将用户输入的一段文本,分析成符合逻辑的一种工具。到目前为止呢,分词器没有办法做到完全的符合人们的要求。和我们有关的分析器有英文的和中文的;

  • 英文分词:

英文分词过程:输入文本-关键词切分-去停用词-形态还原-转为小写。

我们知道英文本身是以单词为单位,单词与单词之间,句子之间通常是空格、逗号、句号分隔。因此对于英文,可以简单的以空格来判断某个字符串是否是一个词,比如:I am Chinese,Chinese很容易被程序处理。

  • 中文分词:

中文是以字为单位的,字与字再组成词,词再组成句子。中文:我是中国人,电脑不知道“是中”是一个词,还是“中国”是一个词?所以我们需要一定的规则来告诉电脑应该怎么切分,这就是中文分词器所要解决的问题。

  • StandardAnalyzer分词器

一元切分法:一个字切分成一个词。

一元切分法“我是中国人”:我、是、中、国、人。扩展字库

  • CJKAnalyzer分词器

二元切分法:把相邻的两个字,作为一个词。

二元切分法“我是中国人”:我是,是中、中国、国人。

  • SmartChineseAnalyzer 词库分词器

通常一元切分法,二元切分法都不能满足我们的业务需求。SmartChineseAnalyzer,对中文支持较好,但是扩展性差,针对扩展词库、停用词均不好处理。

  • IK-analyzer:IK分词器

最新版在 https://code.google.com/p/ik-analyzer/上,支持 Lucene 4.10 从 2006 年 12 月推出1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目 Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。从 3.0 版本开 始,IK 发展为面向 Java 的公用分词组件,独立 于 Lucene 项目,同时提供了对 Lucene 的默认优化实现。适合在项目中应用。

ik分词器本身就是对Lucene提供的分词器Analyzer扩展实现,使用方式与Lucene的分词器一致。

依赖:

<dependency>
    <groupId>com.janeluo</groupId>

    <artifactId>ikanalyzer</artifactId>

    <version>2012_u6</version>

</dependency>

但是IK分词器在2012年就不再更新了,在Lucene 5.4.0版本出现了部分兼容问题,因此我们本次使用的是:

<dependency>
    <groupId>com.github.magese</groupId>

    <artifactId>ik-analyzer</artifactId>

    <version>8.5.0</version>

</dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2230117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不适合的学习方法

文章目录 不适合的学习方法1. 纯粹死记硬背2. 过度依赖单一资料3. 线性学习4. 被动学习5. 一次性学习6. 忽视实践7. 缺乏目标导向8. 过度依赖技术9. 忽视个人学习风格10. 过于频繁的切换 结论 以下是关于不适合的学习方法的更详细描述&#xff0c;包括额外的内容和相关公式&…

华为OD机试真题(Python/JS/C/C++)- 考点 - 细节

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题 点这里。 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。

Linux中使用NGINX

NGINX简介 Nginx&#xff08;engine x&#xff09;是俄罗斯人编写的十分轻量级的HTTP服务器是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP代理服务器官方网站&#xff1a;http://nginx.org/ NGINX概述 Nginx默认配置文件&#xff1a;/etc/ngin…

scrapy爬取名人名言

爬取名人名言&#xff1a;http://quotes.toscrape.com/ 1 创建爬虫项目&#xff0c;在终端中输入&#xff1a; scrapy startproject quotes2 创建之后&#xff0c;在spiders文件夹下面创建爬虫文件quotes.py&#xff0c;内容如下&#xff1a; import scrapy from scrapy.spi…

mmsegmentation训练自己的数据集

文章目录 前言一、安装MMSegmentation二、数据集转换1.labelme标签数据转化为voc数据 三、训练设置1.建立数据集文件&#xff0c;并存入数据集2.设置训练配置文件 四、使用官方权重1、选择预测的方法2、查看方法支持的预训练数据集和权重权重位置找到对应的数据集下载权重 3、使…

LeetCode994. 腐烂的橘子(2024秋季每日一题 54)

在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格中没有…

Pinctrl子系统中Pincontroller构造过程驱动分析:imx_pinctrl_soc_info结构体

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析 input子系统专栏&#xff1a; 专栏地址&#xff1a;input子系统input角度&#xff1a;I2C触摸屏驱动分析…

地理信息科学专业想搞GIS开发:学前端还是后端?

地理信息科学专业的同学是学前端开发比较好呢还是学后端开发比较好呢&#xff1f; 部分网友&#xff1a;学前端更好 主修前端更好&#xff0c;因为地信学后端&#xff0c;是卷不赢学计算机的 本科卷前端&#xff0c;硕士阶段可以卷后端 甚至有网友直呼&#xff0c;地信根本没有…

批处理之for语句从入门到精通--呕血整理

文章目录 一、前言二、for语句的基本用法三、文本解析显神威&#xff1a;for /f 用法详解四、翻箱倒柜遍历文件夹&#xff1a;for /r五、仅仅为了匹配第一层目录而存在&#xff1a;for /d六、计数循环&#xff1a;for /l后记 for语句从入门到精通 一、前言 在批处理中&#…

第8章利用CSS制作导航菜单(第八次作业)

效果图如下&#xff1a; Html代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>山水之间</title><style type"text/css">import url("../css/work1.css");</style…

Ubuntu22.04 安装图形界面以及XRDP教程

一、准备环境 1.一台服务器安装系统ubuntu&#xff08;这里大部分ubuntu系统可以同用&#xff09; 2.安装的ubuntu系统未安装图形界面 二、操作步骤 1.远程ssh或者直接登录服务器命令行界面 ssh -p 远程端口 rootIP 2.更新系统软件包 sudo apt update # 更新本地的软件包…

深度学习基础知识-编解码结构理论超详细讲解

编解码结构&#xff08;Encoder-Decoder&#xff09;是一种应用广泛且高效的神经网络架构&#xff0c;最早用于序列到序列&#xff08;Seq2Seq&#xff09;任务&#xff0c;如机器翻译、图像生成、文本生成等。随着深度学习的发展&#xff0c;编解码结构不断演变出多种模型变体…

扫描电镜的超低温冷冻制样及传输技术(Cryo-SEM)

扫描电镜的超低温冷冻制样及传输技术(Cryo-SEM) 扫描电镜&#xff08;Scanning Electron Microscope&#xff0c;简称SEM&#xff09;是一种利用聚焦电子束扫描样品表面&#xff0c;通过检测二次电子或反射电子等信号来获取样品表面形貌信息的显微观察技术&#xff1b;然而&…

JS手写:从0开始认识【柯里化】【支持占位符的柯里化】

柯里化 功能介绍 柯里化是拆分函数的一种手段&#xff0c;允许我们以偏函数的方式调用这个函数。 比如说&#xff0c;原来的函数A必须传入三个参数才能运行。经过柯里化处理之后的函数KA传入三个参数&#xff0c;能成功运行&#xff1b;传入两个参数也能&#xff0c;但是会返…

WebSocket 连接频繁断开的问题及解决方案

文章目录 WebSocket 连接频繁断开的问题及解决方案1. 引言2. 什么是 WebSocket&#xff1f;2.1 WebSocket 的优势2.2 WebSocket 的工作原理 3. WebSocket 连接频繁断开的常见原因3.1 服务器端问题3.1.1 服务器负载过高3.1.2 服务器配置不当3.1.3 超时设置 3.2 网络问题3.2.1 网…

openGauss开源数据库实战十二

文章目录 任务十二 openGauss逻辑结构:表管理任务目标实施步骤一、准备工作二、创建表1.新建表默认保存在public模式中2.在一个数据库的不同模式下创建表3.创建表的时候定义约束4.创建表时使用自增数据类型5.使用现有的表创建新表 三、查看表的信息1.在gsql中查看表的定义2.查看…

ADI仿真连接有效性检查方法

1、确认仿真器引脚接插OK. A、检查电脑正常连接 B、确认仿真器引脚定义匹配与上电正确连接 2、打开CCES&#xff0c;打开Debug Configurations 3、连接芯片类型选择 4、点击Configuratior… 5、选择Test…,在点Start&#xff0c;确认状态都OK&#xff0c;即可开始仿真调…

docker部署nginx+nacos+redis+java镜像和容器

nginx镜像制作 Dockerfile内容&#xff1a; # 基础镜像 FROM nginx # author MAINTAINER ruoyi# 挂载目录 VOLUME /home/ruoyi/projects/ruoyi-ui # 创建目录 RUN mkdir -p /home/ruoyi/projects/ruoyi-ui # 指定路径 WORKDIR /home/ruoyi/projects/ruoyi-ui # 复制conf文件到路…

SAP RFC 用户安全授权

一、SAP 通讯用户 对于RFC接口的用户&#xff0c;使用五种用户类型之一的“通讯”类型&#xff0c;这种类型的用户没有登陆SAPGUI的权限。 二、对调用的RFC授权 在通讯用户内部&#xff0c;权限对象&#xff1a;S_RFC中&#xff0c;限制进一步可以调用的RFC函数授权&#xff…

Uniapp的H5以及App不支持后端传FormData类型参数的解决方案

在uniapp中不支持FormData的传参&#xff0c;这就很恶心&#xff1b;如果强行传的话会提示&#xff0c;请求失败的报错信息。 因为后端必须要FormData类型的传参&#xff0c;所以在查阅一系列方案后&#xff0c;有一种解决办法可以完美解决。 代码&#xff1a; init() {const…