欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

学习Elasticsearch一定要清楚的问题

时间:2023-06-20
什么是搜索?

搜索就是从一堆事物中仔细查找,直到找到我们想要的东西。

比如我们说想寻找任何的信息的时候,就会用百度,然后输入关键字去搜索一下,然后期望通过这个关键字得到对应的信息。

什么是结构化搜索?

结构化搜索是指有关探询那些具有内在结构数据的过程。

比如日期、时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作。

比较常见的操作包括比较数字或时间的范围,或判定两个值的大小。

在结构化查询中,我们得到的结果总是非是即否,要么存于集合之中,要么存在集合之外。

结构化查询不关心数据的相关度或评分;它简单的对数据包括或排除处理。

正如我们平时在数据库查询数据时,通常会用类似这样的SQL:select * from products where id=1

什么是全文检索?

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

数据库模糊查询的过程是什么?

例如,当我们执行这样的SQL:select * from products where product_name like "%书%"

这时数据库中字段的文本,可能会很长,有长达数千个,甚至数万个字符,这个时候。

这条SQL在执行的过程中,数据库每次都要对每条记录的所有文本中每个字符进行扫描,来判断包不包含指定的这个关键词(比如说“书”)

并且还不能将搜索词拆分开来,尽可能去搜索更多的符合你的期望的结果,比如输入“胡歌帅”,就搜索不出来“胡歌很帅”。

什么是倒排索引? 正排索引

理解什么是倒排索引之前,需要先了解一下正排索引。

在搜索引擎中每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合(实际上在搜索引擎索引库中,关键词也已经转换为关键词ID)。

例如“文档1”经过分词,提取了20个关键词,每个关键词都会记录它在文档中的出现次数和出现位置。

“文档1”的ID > 单词1:出现次数,出现位置列表;单词2:出现次数,出现位置列表;…………“文档2”的ID > 此文档出现的关键词列表

这时我们通过关键词去查询所有包含的文档时,就得遍历所有的文档并查询该文档中有没有该关键词。这种找法就是正向索引,即通过文档(ID)去找关键词。

然而,文档的数量越多,文档的内容越大,你找的时间越久。因为每次都得找完一本书(这其实类似MySQL中的全表扫描)。

倒排索引

针对这样的内容检索场景,倒排索引就派上用场了。和正排索引相反,倒排索引是通过关键词去找文档(ID)。

“关键词1”的ID > 文档1的id;文档2的id;…………“关键词2”的ID > 文档1的id

通过关键词匹配,一下就能查到该关键词所在的所有文档,效率大大提升。虽然也有可能查询的时候需要匹配所有的关键字,但这就是查询算法的问题了,总之倒排索引的效率比正排索引的效率高多了。

什么是Lucene?

Lucene是Apache的一个全文检索引擎工具包,通过lucene可以快速开发一个全文检索功能。

但是直接基于lucene开发,非常复杂,api复杂(实现一些简单的功能都要写大量的代码),需要深入理解原理(各种索引结构)。

什么是Elasticsearch?

Elasticsearch是一个基于Lucene的免费开源的全文搜索引擎和分析引擎,隐藏其复杂性,于 2010 年首次发布。

随后以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和

可视化的免费开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana)。

为什么不用MySQL 全文索引而选择 Elasticsearch 做搜索?

MySQL 的索引结构是b+tree,有两种索引:一中基于主键id的,叶子节点有这一行所有字段的值,另一种是基于某一列的,叶子节点存主键id,你要是按照多个字段去搜,他只能用某一个字段的索引,而不能全用上,你看执行计划就可以知道,mysql选择cost最小的字段的索引来搜,其他你搜的字段基本上都是在结果里面一个个过滤,这是最核心的不同。

Elasticsearch 就不一样了,多字段的索引他全可以用上,比如用关键字在倒排索引中查到一堆符合条件的文档id,然后再通过类似status,type之类的term查询得到另一部分文档id,本质上每个查询结果是不同的bitset,最后做位运算求并集就得到了所有id,然后用id再查具体的返回字段值,可以从souce里面查还可以通过store为true的字段里面查。

参考文章1
参考文章2

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。