搜索理论基础

数据查询方法

1.顺序扫描法

算法描述:

  • 所谓排序扫描,例如要找内容包含一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。

优点:

  • 查询准确率高

缺点:

  • 查询速度会随着查询数据量的增大,越来越慢

使用场景:

  • 数据库中的like关键字模糊查询
  • 文本编辑器的Ctrl + F查询功能

2.倒排索引

先举一个例子:

  • 例如我们使用新华字典查询汉字,新华字典有偏旁部首的目录(索引),我们查字首先查这个目录,找到这个目录中对应的偏旁部首,就可以通过这个目录中的偏旁部首找到这个字所在的位置(文档)。

Lucene会对文档建立倒排索引

  1. 提取资源中关键信息,建立索引(目录)
  2. 搜索时,根据关键字(目录),找到资源的位置

算法描述:

  • 查询前会先将查询的内容提取出来组成文档(正文),对文档进行切分词组成索引(目录),索引和文档有关联关系,查询的时候先查询索引,通过索引找文档的这个过程叫做全文检索。
  • 切分词:就是将一句一句话切分成一个一个的词,去掉停用词(的、地、得、a、an、the等)。去掉空格,去掉标点符合,大写字母转成小写字母,去掉重复的词。

为什么倒排索引比顺序扫描快?

  • 理解:因为索引可以去掉重复的词,汉语常用的字和词大概等于,字典加词典,常用的英文在牛津词典也有收录,如果用计算机的速度查询,字典+词典+牛津词典这些内容是非常快的,但是用这些字典,词典组成的文章却是千千万万不计其数,索引的大写最多也就是字典+词典,所以通过查询索引,再通过索引和文档的关联关系找到文档速度比较快,顺序扫描法则是直接去逐个查询那些不计其数的文章就算是计算的速度也会很慢。

优点:

  • 查询准确率高

  • 查询速度快,并且不会因为查询内容量的增加,而使查询速度逐渐变慢

缺点:

  • 索引文件会占用额外的磁盘空间,也就是占用磁盘量会增大。

使用场景:

  • 海量数据查询

Lucene介绍

什么是全文检索

计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。

什么是Lucene

  • Lucene是apache软件基金会
    jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。

  • Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

  • 目前已经有很多应用程序的搜索功能是基于Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。

  1. Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支 持和提供
  2. Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻, 在Java开发环境里Lucene是一个成熟的免费开放源代码工具
  3. Lucene并不是现成的搜索引擎产品,但可以用来制作搜索引擎产品

Lucene官网

官网: http://lucene.apache.org/

lucene全文检索的流程

索引和搜索的流程图


1、绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:确定原始内容既要搜索的内容

  • 获得文档
  • 创建文档
  • 分析文档
  • 索引文档

2、红色表示搜索过程,从索引库中搜索内容,搜索过程包括:
用户通过搜索界面

  • 创建查询
  • 执行搜索,从索引库搜索
  • 渲染搜索结果

索引流程

对文档索引的过程,将用户要搜索的文档内容进行索引,索引存储在索引库(index)中。

原始内容

原始内容是指要索引和搜索的内容。
原始内容包括互联网上的网页、数据库中的数据、磁盘上的文件等。

获得文档(采集数据)

从互联网上、数据库、文件系统中等获取需要搜索的原始信息,这个过程就是信息采集,采集数据的目的是为了对原始内容进行索引。
采集数据分类:
1、对于互联网上网页,可以使用工具将网页抓取到本地生成html文件。
2、数据库中的数据,可以直接连接数据库读取表中的数据。
3、文件系统中的某个文件,可以通过I/O操作读取文件的内容。
在Internet上采集信息的软件通常称为爬虫或蜘蛛,也称为网络机器人,爬虫访问互联网上的每一个网页,将获取到的网页内容存储起来。

创建文档

获取原始内容的目的是为了索引,在索引前需要将原始内容创建成文档(Document),文档中包括一个一个的域(Field),域中存储内容。
这里我们可以将磁盘上的一个文件当成一个document,Document中包括一些Field,如下图:

注意:每个Document可以有多个Field,不同的Document可以有不同的Field,同一个Document可以有相同的Field(域名和域值都相同)

分析文档

将原始内容创建为包含域(Field)的文档(document),需要再对域中的内容进行分析,分析成为一个一个的单词。
比如下边的文档经过分析如下:
原文档内容:
vivo X23 8GB+128GB 幻夜蓝 全网通4G手机
华为 HUAWEI 麦芒7 6G+64G 亮黑色 全网通4G手机
分析后得到的词:
vivo,x23,8GB,128GB,幻夜,幻夜蓝,全网,全网通,网通,4G,手机,华为,HUAWEI,麦芒7。。。

索引文档

对所有文档分析得出的语汇单元进行索引,索引的目的是为了搜索,最终要实现只搜索被索引的语汇单元从而找到Document(文档)。
创建索引是对语汇单元索引,通过词语找文档,这种索引的结构叫倒排索引结构。

倒排索引结构是根据内容(词汇)找文档,如下图:

倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它的规模较小,而文档集合较大。

Lucene底层存储结构

搜索流程

搜索就是用户输入关键字,从索引中进行搜索的过程。根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容。

用户

就是使用搜索的角色,用户可以是自然人,也可以是远程调用的程序。

用户搜索界面

全文检索系统提供用户搜索的界面供用户提交搜索的关键字,搜索完成展示搜索结果。如下图:

Lucene不提供制作用户搜索界面的功能,需要根据自己的需求开发搜索界面。

创建查询

用户输入查询关键字执行搜索之前需要先构建一个查询对象,查询对象中可以指定查询要查询关键字、要搜索的Field文档域等,查询对象会生成具体的查询语法,比如:
name:手机:表示要搜索name这个Field域中,内容为“手机”的文档。
name:华为AND手机:表示要搜索既包括关键字“华为”并且也包括“手机”的文档。

执行搜索

搜索索引过程:
1、根据查询语法在倒排索引词典表中分别找出对应搜索词的索引,从而找到索引所链接的文档链表。例如搜索语法为“name:华为AND手机”表示搜索出的文档中既要包括“华为”也要包括“手机”。

2、由于是AND,所以要对包含华为和手机词语的链表进行交集,得到文档链表应该包括每一个搜索词语
3、获取文档中的Field域数据。

渲染结果

以一个友好的界面将查询结果展示给用户,用户根据搜索结果找到自己想要的信息,为了帮助用户很快找到自己的结果,提供了很多展示的效果,如果搜索结果中将关键字高亮显示,百度提供的快照等。

Lucene搜索理论相关推荐

  1. 使用 Apache Lucene 搜索文本——轻松为应用程序构建搜索和索引功能

    简介: 本文将探讨 Apache Lucene -- 性能卓越.功能全面的文本搜索引擎库.我们将学习 Lucene 架构及其核心 API.学习如何使用 Lucene 进行跨平台全文本搜索.建立索引.显 ...

  2. Lucene学习总结之七:Lucene搜索过程解析

    一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...

  3. lucene 搜索_使用Lucene的搜索服务器搜索Jira问题

    lucene 搜索 您可能还记得我的第一篇博客文章 ,该文章描述了Lucene开发人员如何使用Lucene搜索应用程序查找我们的Jira问题来食用我们自己的狗粮. 该应用程序已成为许多现代Lucene ...

  4. vc++调用jni_通过JNI使用C ++尖叫快速进行Lucene搜索

    vc++调用jni 最终,当Lucene执行查询时,在初始设置后,真正的热点通常是相当基本的代码,该代码对整数docID,术语频率和位置的顺序块进行解码,并将它们匹配(例如,对BooleanQuery ...

  5. 通过JNI使用C ++尖叫快速进行Lucene搜索

    一天结束时,Lucene执行查询时,在初始设置后,真正的热点通常是相当基本的代码,它解码整数docID,术语频率和位置的顺序块,并对其进行匹配(例如,对BooleanQuery并集或交集),则为每个匹 ...

  6. lucene搜索优化

    最近一直在做lucene搜索模块,遇到搜索慢,网上收集一些关于优化的文章总结如下: 1.对于按创建时间的排序可以使用doc.id的方式       new SortField(null, SortFi ...

  7. java集成lucene_将Lucene搜索集成到应用程序中

    java集成lucene 本文是我们名为" Apache Lucene基础知识 "的学院课程的一部分. 在本课程中,您将了解Lucene. 您将了解为什么这样的库很重要,然后了解L ...

  8. 将Lucene搜索集成到应用程序中

    本文是我们名为" Apache Lucene基础知识 "的学院课程的一部分. 在本课程中,您将了解Lucene. 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式 ...

  9. java搜索引擎lucene_简单lucene搜索实现(搜索引擎)

    首先下载lucene相关jar包,这里就不多说,自己网上找 在eclipse下建立web工程luceneTest 将jar包加载到你的web工程里面 新建类Index.java,代码如下: impor ...

最新文章

  1. ps作业素材和成品_看完俄罗斯这位PS大神的P图!分分钟感觉自己被秒杀!
  2. LINUX中常用操作命令
  3. 2015-09-14-初级vector
  4. atoi() 与 itoa()函数用法
  5. [2020-11-24 contest]糖果机器(二维偏序),手套(状压dp),甲虫(区间dp),选举(线段树 最大子段和)
  6. POJ2182-Lost Cows【树状数组,二分】
  7. Element-UI-的登录页面_密码框---Element-UI工作笔记004
  8. [Verilog]半减器,全减器设计
  9. WIN10虚拟机安装教程
  10. “crol/cror”函数实现流水灯
  11. 用计算机计算实发工资,工资税率计算器 个税反推应发工资计算公式
  12. 面试系列 | 真 · 大厂面试复盘
  13. 突然,我想恋爱了(一)
  14. DevOps—持续开发Gitlab(三)
  15. 老生常谈之防止刷新重复提交表单。
  16. C#实现监控网络流量
  17. KB927917解决方法
  18. android代码修改mp3文件封面,从android中的mp3文件中提取专辑封面
  19. 如何查找优惠券和返利
  20. Vue-视频加载(vue-video-player)支持.mp4.m3u8.flv.mov格式

热门文章

  1. PCIe to CAN Linux 驱动详细说明
  2. 永磁同步电机绝对位置的调零
  3. Android应用利用libusb设备通信权限问题
  4. 奥比中光深度摄像头_乐视三合一奥比中光Orbbec Astra Pro在ROS中配置显示RGB、深度、IR图像的两种思路...
  5. HTML在线编辑器(HTML+js)
  6. C#动态生成treeview目录树
  7. 构建光线跟踪器(Raytracer)
  8. php+美拍地址+解析,美拍视频采集之视频地址解析下载
  9. 搭建机器人电控系统——如何从零画一块主控板?——搭建最小系统电路原理图
  10. java流水线工程设计_进阶项目(7)流水线设计讲解