专栏首页码农小胖哥的码农生涯分布式搜索引擎面试题(一)

分布式搜索引擎面试题(一)

1.Lucene是什么?

Lucene是一套用于全文检索和搜索的开放源代码程序库。实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你你要搜索的关键词出现在哪里。

2.全文检索是什么?

全文检索首先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索。

全文检索大体分两个过程,索引创建(Indexing)和搜索索引(Search)索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。搜索索引:通过用户的查询请求搜索创建的索引,然后返回查询结果的过程。

说到结构化和非结构化数据,而我们生活中的数据分为结构化数据非结构化数据

  • 结构化数据:具有固定格式或有限长度的数据,可以用二维表结构来逻辑表达实现的,如数据库,元数据等。
  • 非结构化数据:指不定长或无固定格式的数据,如办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等等。也叫全文数据。

对于结构化数据的搜索:如对数据库的搜索,用 SQL 语句。再如对元数据的搜索,如利用windows 搜索对文件名,类型,修改时间进行搜索等。对非结构化数据的搜索:如利用 windows 的搜索也可以搜索文件内容,Linux 下的 grep命令,在如用 Google 和百度可以搜索大量内容数据。

对非结构化数据也即对全文数据的搜索主要有两种方法:

1.顺序扫描法:从头到尾的去找,直到扫描项目里面的所有文件。window 的搜索文件内容,linux 的 grep 命令就是如此的。小数据量的文件还可以接受,如果对于大量的文件,方法就很慢了。

2.索引:把非结构化数据重新设计成有一定的结构,利用结构化的数据采取一定的搜索算法加快速度。把非结构化数据中提取出的然后重新组织的信息,称之为索引。比如字典,字典的拼音表和部首检字表就是相当于字典的索引,对每一个字的解释就是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。

索引的目的可以理解为把非结构化的数据按某些特性抽离出,形成结构化的数据,然后再使用抽离出的结构化的数据,使用一定的检索方法去快速查询非结构的话数据。

3.Lucene和sola

形象的来说Solr和Lucene之间关系的方式是汽车和引擎,你不能驾驶一台发动机,但可以开一辆汽车。同样,Lucene是一个程序化库,不能按原样使用,而Solr是一个完整的应用程序,可以立即使用它

4.lucene的底层原理 / 什么是倒排索引

倒排索引。由item查询key的过程,是倒排索引。对于网页搜索,倒排索引可以理解为Map<item, list>,能够由查询词快速(时间复杂度O(1))找到包含这个查询词的网页的数据结构。

举个例子,假设有3个网页:

url1 -> “我是中国人”

url2 -> “我是程序员”

url3 -> “我爱敲代码”

这是一个正排索引Map<url, page_content>。

分词之后:

url1 -> {我,是,中国人}

url2 -> {我,是,程序员}

url3 -> {我,爱,敲代码}

这是一个分词后的正排索引Map<url, list>。

分词后倒排索引:

我 -> {url1, url2,, url3}

是 -> {url1, url2}

爱 -> {url3}

中国人 -> {url1}

程序员 -> {url2}

敲代码 -> {url3}

由检索词item快速找到包含这个查询词的网页Map<item, list>就是倒排索引。

5.什么是正排索引

由key查询实体的过程,是正排索引。

用户表:t_user(id, name, passwd, age, sex),由id查询整行的过程,就是正排索引查询。

网页库:t_web_page(url, page_content),由url查询整个网页的过程,也是正排索引查询。

网页内容分词后,page_content会对应一个分词后的集合list。

简易的,正排索引可以理解为Map<url, list>,能够由网页快速(时间复杂度O(1))找到内容的一个数据结构。

本文分享自微信公众号 - 码农小胖哥(Felordcn)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL性能优化(三)-- 索引

    如果查询id为9,name为ii的,在表中需要查询9次,但是在二叉树中需要查询3次。

    码农小胖哥
  • Java面试通关要点汇总集之核心篇参考答案

    res = mysql_query( 'select * from order where date < = $curDate'); 原因: 释放了数据库的CP...

    码农小胖哥
  • 玩转Mybatis中的类型转换器TypeHandler

    日常java开发中经常有这种需求,用0或者1这些代码(不局限于数字)来表示某种状态。比如用0表示女性,用1来表示男性。而且写入数据库可能是一个标识,从数据库读取...

    码农小胖哥
  • ElasticSearch全文检索引擎-介绍

    gaobinzhan
  • 基于Redis的定时任务

    基于Redis的定时任务 最近遇到一个业务场景,某次活动开始后要在250秒后自动关闭,然后修改活动的状态。考虑一下可以用传统的定时任务去处理 会出现250秒时间...

    冷冷
  • ElasticSearch(7.2.2)-全⽂搜索引擎的概念

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    cwl_java
  • 技术分享 | 常见索引问题处理

    数据库技术爱好者,爱可生 DBA 团队成员,负责 MySQL 日常问题处理以及数据库运维平台的问题排查,擅长 MySQL 主从复制及优化,喜欢钻研技术问题,还有...

    爱可生开源社区
  • MySQL索引的原理及使用

      上篇文章中学习了MySQL库的架构以及存储引擎,了解了基本索引(普通索引,唯一索引,主键索引),着重介绍了innerDB的存储方式以及内存模型,本篇文章和大...

    会说话的丶猫
  • 密钥交换有点不安全 No.89

    今天聊聊关于对称加密算法中关于密钥的问题。如果对于密码学的基础概念还不太熟悉的可以复习一下我上一篇文章。手把脚看看密码学No.72。 我们都知道对称密钥可以用于...

    大蕉
  • 数据库MySQL-索引

    带索引的表在数据库中需要更多的存储空间 增、删、改命令需要更长的处理时间,因为它们需要对索引进行更新

    cwl_java

扫码关注云+社区

领取腾讯云代金券