返回顶部
首页 > 资讯 > 精选 >Lucene倒排索引原理是什么
  • 567
分享到

Lucene倒排索引原理是什么

2023-06-02 10:06:37 567人浏览 独家记忆
摘要

本篇内容主要讲解“Lucene倒排索引原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Lucene倒排索引原理是什么”吧!一、搜索引擎介绍1.1 搜索引擎是什么这里引用百度百科的介绍:搜

本篇内容主要讲解“Lucene倒排索引原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Lucene倒排索引原理是什么”吧!

一、搜索引擎介绍

1.1 搜索引擎是什么

这里引用百度百科的介绍:

搜索引擎(Search Engine)是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统。

1.2 搜索引擎分类

搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等。

本文主要介绍全文索引,即百度使用的搜索引擎分类。

全文索引

首先是数据库中数据的搜集,搜索引擎的自动信息搜集功能分两种:

  • 一种是定期搜索,即每隔一段时间(比如Google一般是28天),搜索引擎主动派出“蜘蛛”程序,对一定IP地址范围内的互联网网站进行检索,一旦发现新的网站,它会自动提取网站的信息和网址加入自己的数据库

  • 另一种是提交网站搜索,即网站拥有者主动向搜索引擎提交网址,它在一定时间内(2天到数月不等)定向向你的网站派出“蜘蛛”程序,扫描你的网站并将有关信息存入数据库,以备用户查询。

当用户以关键词查找信息时,搜索引擎会在数据库中进行搜寻,如果找到与用户要求内容相符的网站,便采用特殊的算法——通常根据网页中关键词的匹配程度、出现的位置、频次、链接质量——计算出各网页的相关度及排名等级,然后根据关联度高低,按顺序将这些网页链接返回给用户。这种引擎的特点是搜全率比较高。

1.3 搜索引擎能解决什么问题

  • 高效查询数据(运用多种算法查询数据,查询速率是毫秒级别,无论是千万条数据还是上亿的数据)

  • 比较容易,将普通的数据库切换成搜索引擎比较容易。

  • 大数据量、时效性、高并发等等。

1.4 搜索引擎的应用场景

  • 数据库达到百万数据级别的时候

  • 要求检索时效性、性能要求高,Ms级响应

1.5 Solr

接下来看在平常的互联网中搜索引擎的应用Solr。那么什么是Solr呢?它和es相比有什么优点和不足呢?

我们先来简单地介绍一下solr:

Solr是一个基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的面向使用的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面。它支持Xml/Http协议,支持JSONapi接口。

它具有如下特点:

  • 可扩展性:Solr可以把建立索引和查询处理的运算分布到一个集群内的多台服务器上。

  • 快速部署:Solr是开源软件,安装和配置都很方便,可以根据安装包内的Sample配置直接上手,可分为单机和集群模式。

  • 海量数据:Solr是针对亿级以上的海量数据处理而设计的,可以很好地处理海量数据检索。

  • 优化的搜索功能:Solr搜索速度够快,对于复杂的搜索查询Solr可以做到毫秒级的处理,通常,几十毫秒就能处理完一次复杂查询。

二、分词介绍

接下来,我们将了解分词是如何实现的。那么,我们为什么要去分词呢,这和搜索引擎有什么关系呢?我们在搜索框里输入的几个词或者一段话是如何拆成多个关键字的呢?

大家听说过哪些分词器吗?比如lucene自带的中文分词器smartcn,还有最常用的IK分词器等等,今天我们主要讲一下IK分词器。

2.1 IK分词器

IK分词器首先会维护几个词典来记录一些常用的词,如主词表:main2012.dic、量词表quantifier.dic、停用词stopWord.dic。

Dictionary为字典管理类中,分别加载了这个词典到内存结构中。具体的字典代码,位于org.wltea.analyzer.dic.DictSegment。 这个类实现了一个分词器的一个核心数据结构,即Tire Tree。

Tire Tree(字典树)是一种结构相当简单的树型结构,用于构建词典,通过前缀字符逐一比较对方式,快速查找词,所以有时也称为前缀树。具体的例子如下。

举例

比如:我是北京海淀区中关村的中国人民。

我们设置的词典是:北京、海淀区、中关村、中国、中国人民,那么根据词典组成的字典树如图所示:

Lucene倒排索引原理是什么

然后我们根据这个字典树来对这段话进行词语切分。IK分词器中,基本可以分为两种模式:一种是smart模式、一种是非smart模式,可以在代码中初始化的时候去配置。

我们其实不用解释这两种模式的字面含义,直接打印两种模式的结果就可以看出来:

  • 原句:我是北京海淀区中关村的中国人民

  • smart模式:北京、海淀区、中关村、中国人民

  • 非smart模式:北京、海淀区、中关村、中国、中国人民

显而易见,非smart模式是将能够分出来的词全部输出;smart模式是根据内在的方法输出一个合理的分词结果,这就涉及到了歧义判断。

举例

举个更有代表性的例子:张三说的确实在理。

根据正向匹配可能的词元链:

  • L1:{张三,张,三}

  • L2:{说}

  • L3:{的确,的,确实,确,实在,实,在理,在,理}

首来看一下最基本的一些元素结构类:

public class Lexeme implements Comparable{      ……         //词元的起始位移      private int offset;      //词元的相对起始位置      private int begin;      //词元的长度      private int length;      //词元文本      private String lexemeText;      //词元类型      private int lexemeType;       ……  }

这里的Lexeme(词元),可以理解为是一个词语或单词。其中的begin,是指其在输入文本中的位置。注意,它是实现Comparable的,起始位置靠前的优先,长度较长的优先,这可以用来决定一个词在一条分词结果的词元链中的位置,可以用于得到上面例子中分词结果中的各个词的顺序。   

  public int compareTo(Lexeme other) {  //起始位置优先      if(this.begin < other.getBegin()){          return -1;      }else if(this.begin == other.getBegin()){       //词元长度优先       if(this.length > other.getLength()){           return -1;       }else if(this.length == other.getLength()){           return 0;       }else {//this.length < other.getLength()           return 1;       }              }else{//this.begin > other.getBegin()       return 1;      }  }

smart模式歧义消除算法:  

  • 词元位置权重比较(词元长度积),含义是选取长的词元位置在后的集合

  • L31:{的,确实,在理}1*1+2*2+3*2=11

  • L32:{的确,实,在理} 1*2+2*1+3*2=10

  • L33:{的确,实在,理} 1*2+2*2+3*1=9

  • 最后的分词结果:张三,说,的,确实,在理

三、倒排索引算法

3.1 介绍

我们可以把倒排索引算法想象成查字典时的目录一样,我们知道需要查的字的目录后,就会很快地查找到。如果用专业的语言解释的话就是:

倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。

倒排文件(倒排索引),索引对象是文档或者文档集合中的单词等,用来存储这些单词在一个文档或者一组文档中的存储位置,是对文档或者文档集合的一种最常用的索引机制。

搜索引擎的关键步骤就是建立倒排索引,倒排索引一般表示为一个关键词,然后是它的频度(出现的次数),位置(出现在哪一篇文章或网页中,及有关的日期,作者等信息),它相当于为互联网上几千亿页网页做了一个索引,好比一本书的目录、标签一般。读者想看哪一个主题相关的章节,直接根据目录即可找到相关的页面。不必再从书的第一页到最后一页,一页一页地查找。

3.2 Lucene倒排索引原理

Lucerne是一个开放源代码的高性能的基于java的全文检索引擎工具包,不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者以此为基础建立起完整的全文检索引擎。

假设有两篇文章1和2:

文章1的内容为: Jack lives in BeiJing,I live in BeiJing too.    文章2的内容为: He lived in Taiyuan.

1)取得关键词 

首先我们要用我们之前讲的方式分词,然后由于英文的原因,我们需要将in、on、of这些没用实际意义的词过滤掉,然后将第三人称单数加s或者过去式加ed这些词还原回去,如lived变回live,lives变回live,然后把不需要的标点符号也去掉。经过上面的处理之后,剩下的关键字为:

文章1的所有关键词为:[Jack] [live] [BeiJing] [i] [live] [BeiJing]    

文章2的所有关键词为:[he] [live] [Taiyuan]

2)建立倒排索引

关键词            文章号[出现频率]              出现位置   BeiJing             1[2]                      3,6   he                  2[1]                      1   i                   1[1]                      4   live                1[2]                      2,5,                     2[1]                      2   Taiyuan             2[1]                      3   tom                 1[1]                      1

  以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的(lucene没有使用B树结构),因此lucene可以用二元搜索算法快速定位关键词。  

3.3 实现

实现时,lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。  

3.4 压缩算法

为了减小索引文件的大小,Lucene对索引还使用了压缩技术。

首先,对词典文件中的关键词进行了压缩,关键词压缩为<前缀长度,后缀>,例如:当前词为“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯语”压缩为<3,语>。

其次大量用到的是对数字的压缩,数字只保存与上一个值的差值(这样可以减小数字的长度,进而减少保存该数字需要的字节数)。例如当前文章号是16389(不压缩要用3个字节保存),上一文章号是16382,压缩后保存7(只用一个字节)。

3.5 使用原因

假设要查询单词 “live”,lucene先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。词典通常非常小,因而,整个过程的时间是毫秒级的。   

而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。

四、solr基本配置以及使用

我们在windows系统中安装solr。

解压后:

Lucene倒排索引原理是什么

cmd 进入solr的bin目录,使用命令 solr start(为了更方便,可以配置solr的环境变量,配好后可以直接在cmd中使用solr命名)

Lucene倒排索引原理是什么

看到这个界面,说明solr服务启动成功,端口号为 8983,访问 http://localhost:8983,会自动跳转到http://localhost:8983/solr/#/

Lucene倒排索引原理是什么

在这个页面会显示 solr的基本信息,lucene信息,Java信息等

然后我们介绍一个solr的指令: solr -h 可以看到solr的基本信息

Lucene倒排索引原理是什么

配置solr

配置核心core

solr create -c mycore -d baisc_configs:-c参数指定定义的核心名称,-d参数指定配置目录

Lucene倒排索引原理是什么

执行该命令后,会多出一个test目录。

Lucene倒排索引原理是什么

访问Solr Admin页面:http://localhost:8983/,查看core,多了一个 test

Lucene倒排索引原理是什么

在\solr-6.3.0\server\solr\test目录下有conf和data目录,分别对应配置和数据。

Lucene倒排索引原理是什么

给core添加数据

打开目录:\solr-6.3.0\server\solr\test\conf,添加一个字段:

<field name="name" type="string" indexed="false" stored="true" required="true" multiValued="false" />

然后重启solr: solr restart -p 8983

Lucene倒排索引原理是什么

到Solr Admin页面,选择core-test-document,在Document(s)中填写数据:

{"id":"1","name":"宝马"}

点击submit,返回Status: success,则代表添加数据成功。

Lucene倒排索引原理是什么

多加几条后,点击Query,查询数据:

Lucene倒排索引原理是什么

查询界面的 q,代表 查询条件,如输入:name:"宝马",再次执行查询

Lucene倒排索引原理是什么

也可以直接get方式访问url:http://localhost:8983/solr/test/select?q=name:宝马

Lucene倒排索引原理是什么

到此,相信大家对“Lucene倒排索引原理是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Lucene倒排索引原理是什么

本文链接: https://lsjlt.com/news/229819.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Lucene倒排索引原理是什么
    本篇内容主要讲解“Lucene倒排索引原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Lucene倒排索引原理是什么”吧!一、搜索引擎介绍1.1 搜索引擎是什么这里引用百度百科的介绍:搜...
    99+
    2023-06-02
  • 搜索引擎的倒排索引是什么
    本篇内容主要讲解“搜索引擎的倒排索引是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“搜索引擎的倒排索引是什么”吧!什么是倒排索引?  见其名知其意,有倒排索引,对应肯定,有正向索引。&nbs...
    99+
    2023-06-04
  • lucene全文索引是什么
    本篇内容主要讲解“lucene全文索引是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“lucene全文索引是什么”吧!一、Lucene介绍及应用Apache Lucene是当下最为流行的开源...
    99+
    2023-06-02
  • Lucene查询原理是什么
    本篇内容介绍了“Lucene查询原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lucene查询原理本节主要是一些Lucene的背景...
    99+
    2023-06-02
  • Lucene fnm索引文件格式是什么
    这篇文章主要介绍“Lucene fnm索引文件格式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Lucene fnm索引文件格式是什么”文章能帮助大家解决问题。简介后缀为f...
    99+
    2023-07-05
  • 什么是MySQL索引原理
    下面一起来了解下什么是MySQL索引原理,相信大家看完肯定会受益匪浅,文字在精不在多,希望什么是MySQL索引原理这篇短内容是你想要的。 索引原理&本质MySQL官方解释:索引是为MySQ...
    99+
    2024-04-02
  • MySQL索引原理是什么
    这篇文章主要介绍MySQL索引原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!摘要: 就一起来聊一聊MySQL索引。 什么是索引? 百度百科是这样描述的: 索引是为来加速对表...
    99+
    2024-04-02
  • 什么是mysql的索引原理
    下面讲讲关于mysql的索引原理,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完mysql的索引原理这篇文章你一定会有所受益。      ...
    99+
    2024-04-02
  • MySQL索引的原理是什么
    本篇内容介绍了“MySQL索引的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!索引,可能让好很多...
    99+
    2024-04-02
  • MySQL的索引原理是什么
    本篇内容介绍了“MySQL的索引原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、索引的本质索引...
    99+
    2024-04-02
  • 【漫画】ES原理 必知必会的倒排索引和分词
    倒排索引的初衷 倒排索引,它也是索引。索引,初衷都是为了快速检索到你要的数据。 我相信你一定知道mysql的索引,如果对某一个字段加了索引,一般来说查询该字段速度是可以有显著的提升。 每种数据库都有自己要解决的问题(或者说擅长...
    99+
    2018-07-11
    【漫画】ES原理 必知必会的倒排索引和分词
  • MySQL8.0倒序索引数据的数据排列方式是什么
    本篇内容主要讲解“MySQL8.0倒序索引数据的数据排列方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL8.0倒序索引数据的数据排列方式是什么...
    99+
    2024-04-02
  • 如何理解Elasticsearch倒排索引与分词
    本篇内容主要讲解“如何理解Elasticsearch倒排索引与分词”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Elasticsearch倒排索引与分词...
    99+
    2024-04-02
  • mysql中innodb索引原理是什么
    这篇文章主要介绍了mysql中innodb索引原理是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。聚集索引(clustered index)...
    99+
    2024-04-02
  • MySQL中索引的原理是什么
    这期内容当中小编将会给大家带来有关MySQL中索引的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。索引目的索引的目的在于提高查询效率,可以类比字典,如果要查“m...
    99+
    2024-04-02
  • SqlServer中索引的原理是什么
    本篇文章为大家展示了SqlServer中索引的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。索引的概念索引的用途:我们对数据查询及处理速度已成为衡量应用系...
    99+
    2024-04-02
  • Java搜索引擎Apache Lucene 3.4.0有什么用
    这篇文章将为大家详细讲解有关Java搜索引擎Apache Lucene 3.4.0有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Apache Lucene是一个开放源程序的搜索引擎,利用它可以轻易...
    99+
    2023-06-17
  • Mysql的B+Tree索引原理是什么?
    首先,正确的创建合适的索引,是提升数据库查询性能的基础。索引是什么?索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。索引的工作机制是怎样的?如上图中,如果现在有一条sql语句 selec&#...
    99+
    2024-04-02
  • MySQL中 Innodb索引的原理是什么
    本篇文章给大家分享的是有关MySQL中 Innodb索引的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是索引?索引(index...
    99+
    2024-04-02
  • mysql索引的工作原理是什么
    本篇内容介绍了“mysql索引的工作原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  索引的工作...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作