倒排索引、ES对比Mysql

为什么需要?

根据id精确匹配时,可以走索引,查询效率较高。而当搜索条件为模糊匹配时,由于索引无法生效,导致从索引查询退化为全表扫描,效率很差。

方式:正向索引根据文档找词条,倒排索引根据词条找文档。

优缺点:

正向索引适合于根据索引字段的精确搜索。

倒排索引根据词条搜索、模糊搜索时,速度非常快。缺点:只能给词条创建索引,而不是字段。无法根据字段做排序。

建表步骤

  1. 把文档用分词算法拆封,得到一个个词条
  2. 建立表,给词条建立正向索引(列),字段(列)是文档id

查询步骤

  1. 搜索"华为手机"。
  2. 分词,得到词条:华为、手机。
  3. 拿词条在倒排索引中查找(由于词条有索引,查询效率很高),得到包含词条的文档id:1、2、3。
  4. 拿文档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概念对比

    MySQLElasticsearch说明
    TableIndex索引(index),就是文档的集合。类似数据库的表(table)
    RowDocument文档(Document),就是一条条的数据。类似数据库中的行(Row),文档都是JSON格式
    ColumnField字段(Field),就是JSON文档中的字段。类似数据库中的列(Column)
    SchemaMappingMapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)

无聊的企鹅
3 声望0 粉丝