elasticsearch
elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容
elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域:
elasticsearch底层是基于lucene来实现的。Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。官网地址:Apache Lucene - Welcome to Apache Lucene 。
倒排索引
-
正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程。
-
而倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程。
正向索引:
-
优点:
-
可以给多个字段创建索引
-
根据索引字段搜索、排序速度非常快
-
-
缺点:
-
根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。
-
倒排索引:
-
优点:
-
根据词条搜索、模糊搜索时,速度非常快
-
-
缺点:
-
只能给词条创建索引,而不是字段
-
无法根据字段做排序
-
mysql与elasticsearch
MySQL | Elasticsearch | 说明 |
---|---|---|
Table | Index | 索引(index),就是文档的集合,类似数据库的表(table) |
Row | Document | 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式 |
Column | Field | 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column) |
Schema | Mapping | Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema) |
SQL | DSL | DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD |
-
Mysql:擅长事务类型操作,可以确保数据的安全和一致性
-
Elasticsearch:擅长海量数据的搜索、分析、计算
往往是两者结合使用:
-
对安全性要求较高的写操作,使用mysql实现
-
对查询性能要求较高的搜索需求,使用elasticsearch实现
-
两者再基于某种方式,实现数据的同步,保证一致性
索引库操作
mapping映射属性?
mapping是对索引库中文档的约束,常见的mapping属性包括:
-
type:字段数据类型,常见的简单类型有:
-
字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
-
数值:long、integer、short、byte、double、float、
-
布尔:boolean
-
日期:date
-
对象:object
-
-
index:是否创建索引,默认为true
-
analyzer:使用哪种分词器
-
properties:该字段的子字段
索引库的CRUD
-
创建索引库:PUT /索引库名
PUT?/索引库名称 { ??"mappings":?{ ????"properties":?{ ??????"字段名":{ ????????"type":?"text", ????????"analyzer":?"ik_smart" ??????}, ??????"字段名2":{ ????????"type":?"keyword", ????????"index":?"false" ??????}, ??????"字段名3":{ ????????"properties":?{ ??????????"子字段":?{ ????????????"type":?"keyword" ??????????} ????????} ??????}, // ...略 ????} ??} }
-
查询索引库:GET /索引库名
GET /索引库名
-
删除索引库:DELETE /索引库名
PUT?/索引库名/_mapping { ??"properties":?{ ????"新字段名":{ ??????"type":?"integer" ????} ??} }
-
添加字段:PUT /索引库名/_mapping
DELETE /索引库名
文档操作
-
创建文档:POST /{索引库名}/_doc/文档id { json文档 }
POST?/索引库名/_doc/文档id { ????"字段1":?"值1", ????"字段2":?"值2", ????"字段3":?{ ????????"子属性1":?"值3", ????????"子属性2":?"值4" ????}, // ... }
-
查询文档:GET /{索引库名}/_doc/文档id
GET /{索引库名称}/_doc/{id}
-
删除文档:DELETE /{索引库名}/_doc/文档id
DELETE /zsyp/_doc/1
-
修改文档:
-
全量修改:PUT /{索引库名}/_doc/文档id { json文档 }
PUT?/{索引库名}/_doc/文档id { ????"字段1":?"值1", ????"字段2":?"值2", // ... 略 }
-
增量修改:POST /{索引库名}/_update/文档id { "doc": {字段}}
POST?/{索引库名}/_update/文档id { ????"doc": { "字段名":?"新的值", } }
-
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!