您现在的位置是:首页 > 文章 > ElasticSearch 学习笔记 网站文章

ElasticSearch 学习笔记

孙玉超 2021-04-13 13:44:15 0 评论 775 浏览 0 收藏 0


关于 ElasticSearch


ElasticSearch (ES)是一个基于 Apache Lucene 的分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。相对于 MySQL 来说,ES 侧重于数据的检索,可用于电商系统商品搜索、地理数据分析、日志分析处理等。例如要对电商系统商品进行多维度搜索,通过 MySQL 来实现是极其复杂的。


ES 中有几个重要的概念:索引、类型、文档。


● 索引:相当于 MySQL 中的数据库层面

● 类型:相当于 MySQL 中的数据库的一张表

● 文档:相当于 MySQL 中的表里的一行数据


倒排索引


初次接触 ES 的同学很容易被这个名词所误导。其在英文中的描述为 Inverted index 。大概是因为 Inverted 有颠倒的意思,就翻译成了倒排索引。其实将其翻译为索引转换也许更合适。

在传统关系型数据库中,例如 MySQL,一般是通过索引去查询数据(文档)。而在 ES 中,存储时会将文档进行分词,然后将所有包含该分词的文档 id 放在一起。例如对于 “SpringCloud组件之 OpenFeign 基础”这句话,IK 分词之后,分词与索引 id 的对应关系为:

分词包含分词的文档 id
springcloud1,2,3,4,5
组件1,2,3
2,5
openfeign3,4,5,6
基础5,6,7,8

在 ES 中,这句话是类似上述表格的形式存储,当我们去搜索的时候,ES 也会对我们搜索文本进行分词,找到对应的分词所包含于的文档 id 集合返回。例如我们搜索 “springcloud”,会返回 1-5 五条数据。相对于 MySQL 通过索引查找数据,ES 这种通过预先分词,然后相当于用文档去查询索引的方式被称为倒排索引。


简而言之,如果面试的时候问你倒排索引,可以简单地回答为:倒排索引是通过文档去查询索引。


ES 基础命令 cat


● GET  _cat/nodes: 查看所有节点信息

● GET  _cat/health: 查看 ES 健康状况

● GET  _cat/master: 查看主节点信息

● GET  _cat/indices: 查看所有索引


保存文档


● PUT index/type/id  {}

PUT blog/article/1   
{
	"title":"title",
	"content":"content"
}

● POST index/type[/id]  {}

POST blog/article/1  #带上id,并且之前有数据则会进行更新
{
	"title":"title",
	"content":"content"
}
POST blog/article  #不带 id,会新增一条数据,ES 自动生成字符串 id
{
	"title":"title",
	"content":"content"
}


ID 查询文档


● GET index/type/id


更新文档


● POST index/type/id/_update

POST blog/article/1/_update  会检查如果内容变更才会更新
{
    "doc": {
        "title": "title",
        "content": "content"
    }
}


● POST/PUT index/type/id

POST blog/article/1   不会检查内容,直接更新
{
    "title": "title",
    "content": "content"
}

PUT blog/article/1   不会检查内容,直接更新
{
    "title": "title",
    "content": "content"
}


删除文档


● DELETE  index/type/id

● DELETE  index


批量导入文档


● POST  index/type/_bulk   {}

POST blog/article/_bulk  
{"index":{"_id":"1"}}
{"title": "title","content":"content"}
{"index":{"_id":"2"}}
{"title": "title","content":"content"}
//空行

注意在postman中测试批量导入会提示 JSON格式不对,这个本来就不是JSON,不管它就行了,最后一行要空出来一行,不然 ES 会报错。


进阶查询


● GET blog/_search?q=*&sort=age:asc     查询所有并且按age倒序

● GET blog/_search   {}

GET blog/_search
{
    "query": {
        "match_all": {}
    },
    "sort": [
        {
            "age": "desc"
        }
    ],
    "from": 1,
    "size": 1, //分页
    "_source": [ "age", "name" ] //指定字段查询
}


match 查询


match 为指定字段查询,如果字段类型是文本会进行分词,包含分词后内容的文档都能搜索到

GET blog/_search
{
    "query": {
        "match": {"title":"Java"}
    }
}


match_phrase 查询


match_phrase 短语匹配,指定字段,不会对字段值进行分词

GET blog/_search
{
    "query": {
        "match_phrase": {"title":"ElasticSearch 学习笔记"}
    }
}


multi_match 查询


multi_match 多字段匹配 ,如果字段类型是文本会进行分词

GET blog/_search
{
  "query": {
    "multi_match": {
      "query": "springcloud",
      "fields": ["title", "content"]
    }
  }
}


bool 复合查询


bool 为复合查询,可以包括以下几种

● must :必须满足条件

● must_not :必须不满足条件

● shuold:应该满足条件(可以满足可以不满足)


GET blog._search
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "title": "Java"
                    }
                },
                {
                    "match": {
                        "content": "Java"
                    }
                }
            ],
            "must_not": [
                {
                    "match": {
                        "title": "C"
                    }
                },
                {
                    "match": {
                        "content": "C++"
                    }
                }
            ],
            "should": [
                {
                    "match": {
                        "classifyId": "13"
                    }
                }
            ]
        }
    }
}


filter 查询


filter 和 must 或 must_not 有相似功能, 不同的是,filter 不会影响相关性得分 score。上面没有提到 score 的查询都会影响 score,这个叫做相关性的分。如果没有指定排序规则,那么 score 越大的文档越靠前。

使用 filter 查询,结果里面 score 字段都是 0.0 。

GET blog/_search
{
    "query": {
        "bool": {
            "filter": [
                {
                    "range": {
                        "browser": {
                            "gte": 500,
                            "lte": 600
                        }
                    }
                },
                {
                    "match": {
                        "content": "Java"
                    }
                }
            ]
        }
    }
}


term 查询


term 查询和 match 类似,但是 term 适合查询精确字段,例如数值类型的字段。match 会对内容分词进行全文检索,适合查询文本类型。


aggregations 聚合



待完善

转载请注明出处:转载请注明出处

上一篇 : 接口幂等 && 消息幂等 下一篇 : 电商平台秒杀系统设计

留言评论

所有回复

暮色妖娆丶

96年草根站长,2019年7月接触互联网踏入Java开发岗位,喜欢前后端技术。对技术有强烈的渴望,2019年11月正式上线自己的个人博客