倒排索引、ES对比Mysql
为什么需要?
根据id精确匹配时,可以走索引,查询效率较高。而当搜索条件为模糊匹配时,由于索引无法生效,导致从索引查询退化为全表扫描,效率很差。
方式:正向索引根据文档找词条,倒排索引根据词条找文档。
优缺点:
正向索引适合于根据索引字段的精确搜索。
倒排索引根据词条搜索、模糊搜索时,速度非常快。缺点:只能给词条创建索引,而不是字段。无法根据字段做排序。
建表步骤
- 把文档用分词算法拆封,得到一个个词条
- 建立表,给词条建立正向索引(列),字段(列)是文档id
查询步骤
- 搜索"华为手机"。
- 分词,得到词条:华为、手机。
- 拿词条在倒排索引中查找(由于词条有索引,查询效率很高),得到包含词条的文档id:1、2、3。
- 拿文档id到正向索引中查找具体文档(由于id也有索引,查询效率也很高)。
ES概念
文档(Document):每一条数据就是一个文档。可以是数据库中的一条商品数据,一个订单信息。
- elasticsearch是面向文档(Document)存储的,多个文档数据会被序列化为json格式后存储在elasticsearch中:
{ "id": 1, "title": "小米手机", "price": 3499 } { "id": 2, "title": "华为手机", "price": 4999 } { "id": 3, "title": "华为小米充电器", "price": 49 } { "id": 4, "title": "小米手环", "price": 299 }
字段(Field)
- 数据库中的一行数据就是ES中的一个JSON文档;而数据库中每行数据都包含很多列,这些列就是JSON文档中的字段(Field)
词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。
词条(索引) 文档id 小米 1,3,4 手机 1,2 华为 2,3
索引(Index)
- 将类型相同的文档集中在一起管理,称为索引(Index)
- 商品索引
{ "id": 1, "title": "小米手机", "price": 3499 } { "id": 2, "title": "华为手机", "price": 4999 } { "id": 3, "title": "三星手机", "price": 3999
映射(mapping)
- 是索引中文档的字段约束信息,类似表的结构约束。
mysql与elasticsearch概念对比
MySQL Elasticsearch 说明 Table Index 索引(index),就是文档的集合。类似数据库的表(table) Row Document 文档(Document),就是一条条的数据。类似数据库中的行(Row),文档都是JSON格式 Column Field 字段(Field),就是JSON文档中的字段。类似数据库中的列(Column) Schema Mapping Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。