一、Elasticsearch相关概念与Mysql对比
Elasticsearch是一套搜索引擎技术,整套技术栈的核心就是用来存储、搜索、计算的Elasticsearch。
完整的技术栈包括:
· Elasticsearch:用于数据存储、计算和搜索
· Logstash/Beats:用于数据收集
· Kibana:用于数据可视化
可以通过对比Mqsql的属性字段,增加对Elasticsearch的了解:
Mysql | Elasticsearch | ES的补充描述 |
---|---|---|
Table | Index | 索引=表 |
Row | Document | 文档[json]=行记录 |
Column | Filed | 字段[域]=列 |
Schema | Maping | 映射[结构]=约束条件 |
SQL | DSL | 语句=sql语句 |
二、倒排索引
倒排索引与正向索引的流程相反。
正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程。
倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程。
正向索引
先来回顾一下正向索引:
如果通过数据的独有id来进行精确搜索,获取该条信息的内容,非常快速。如果根据其它字段,如title或price进行搜索,只能通过遍历的方式一条条数据进行比对,效率很差。这就是正向索引。
优点:
- 可以给多个字段创建索引
- 根据索引字段搜索、排序速度非常快
缺点:
- 根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。
因此,正向索引适合于根据索引字段的精确搜索,不适合基于部分词条的模糊匹配。
而倒排索引恰好解决的就是根据部分词条模糊匹配的问题。
倒排索引
倒排索引中有两个非常重要的概念:
1、文档(Document):被搜索的数据,每一条数据就是一个文档,相当于mysql中的row一行记录。
2、词条(Term):对文档或用户搜索的数据利用算法分词,得到的具备含义的词语就是词条。
例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条。
搜索流程:
1)建立词条库:
先把文档内容进行分词,形成词条与文档ID的对应关系:词条库(词条具备唯一性),建立索引。
2)搜索匹配:
对搜索内容进行分词,得到一个关键词列表。关键词与词条库进行匹配,找到对应的文档ID列表。
3)获取搜索结果信息:
根据文档ID列表,找到对应的文档信息。
优点:
- 根据词条搜索、模糊搜索时,速度非常快
缺点:
- 只能给词条创建索引,而不是字段
- 无法根据字段做排序
虽然要先查询倒排索引,再查询倒排索引,但是无论是词条、还是文档id都建立了索引,查询速度非常快!无需全表扫描,效率极高。
在实际开发应用,需要根据不同的需求,选择对应的搜索方式,可以提高程序运行效率。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。