ElasticSearch浅谈(基于ES 7)

ElasticSearch,简称为ES,是一个开源的高可用,高可扩展的分布式全文搜索引擎,可以视为 全文搜索数据库。它可以实现近实时的存储和检索。可以相对方便的扩展到多台服务器上,实现集群的搭建,从而提高吞吐量。

ES是基于 Lucene做的封装和增强,可通过简单的RESTful API实现各种复杂的操作。

ELK(ElasticSearch + Logstash + Kibana)是数据日志收集分析的统称,其中Logstash是日志数据收集服务,负责数据的收集;ES负责将数据进行存储;Kibana负责将数据进行展示。

window下安装为开箱即用,Linux 安装需要一定的配置。安装过程不再赘述,需要安装ES,以及Kibana用于执行命令,安装head用于查看数据以及监测集群的健康状态。

核心概念

索引(Index),由于ES本身属于非关系型数据库,所以没有严格的库表结构取而代之的是索引。可以将索引对应到数据库的概念,或者单纯的理解为一批具有类似结构数据的容器(集合)。其中一个索引可以有多个分片,以及分片对应的副本。

分片(shards)可以理解为是一种 物理概念,直观感受是将一个索引进行拆分,每一部分就可以理解为是分片,这个分片称之为主分片。对应的复制分片可以理解为副本,主分片具有上限(5个),一个主分片的副本没有规定。ES提出主分片以及副本是考虑了高可用(数据冗余不丢失)和高性能(数据查询更快速)的要求。

文档(document),这个可以理解为索引中存储的数据,对应于关系型数据库中的行数据概念。此外需要注意的是,文档和索引之间还有一个类型(Type)的概念,可以对应于关系型数据库中的表的概念,但是随着ES的版本更新,这一概念最终也会被弃用。

字段(field),是文档中的最小的数据单元,可以表示这个数据的的含义,以及类型。

映射(mapping),是随着索引创建后,规范当前索引数据的各个字段以及对应的类型的定义数据。ES可以根据插入的数据自动的生成对应的mapping,但是为了防止出现自动生成的与预先设定的出现偏差,需要进行手动的显示定义。

倒排索引,在搜索领域和NLP相关的内容中非常常见,,本质就是根据字词映射对应的文档列表,不做过多解释。

IK分词器,ES是针对英文做文本处理,拥有自己标准的分词工具。但是对于中文,天然不存在词汇之间的空格分隔,所以需要用适合的分词器将连续的文本分为一个个词汇。ik分词器便是对中文文本分词的支持插件(工具),拥有两种模式,ik_smart(最小切分)和ik_max_word(所有可能切分)。分词器还支持自定义的此表,用于对未登录词汇的切分。

CRUD

RESTful风格

方法URL地址说明PUTlocalhost:9200/索引名称/类型名称/文档id创建,修改文档(指定文档id)POSTlocalhost:9200/索引名称/类型名称创建文档(随机文档id)POSTlocalhost:9200/索引名称/类型名称/文档id/_update修改文档DELETElocalhost:9200/索引名称/类型名称/文档id删除文档GETlocalhost:9200/索引名称/类型名称/文档id通过id查询文档POSTlocalhost:9200/索引名称/类型名称/文档id/_search查询所有数据

字段的数据类型:

创建索引

发送PUT请求直接创建索引

http://localhost:9200/shopping

利用映射创建索引
发送PUT请求

http://localhost:9200/shopping
{
    "mappings":{
        "properties":{
            "name":{"type": "text"},
            "age": {"type": "long"},
            "birthday": {"type": "date"}
        }
    }
}

单独创建映射
先创建索引后单独设置映射关系
发送PUT请求

http://localhost:9200/shopping/_mapping
{
    "properties":{
        "name":{
            "type": "text",
            "index": true
        },
        "sex": {
            "type": "keyword",      # 不可被分词,搜索时仅可以完全匹配
            "index": true
        },
        "tel": {
            "type": "keyword",
            "index": false      # 不可被索引,搜不到这个字段的信息
        }
    }
}

查询索引的映射
发送GET请求

http://localhost:9200/shopping/_mapping

查看所有索引

发送GET请求

http://localhost:9200/_cat/indices?v

查看单个索引

发送GET请求, 查看索引的详细信息

http://localhost:9200/shopping

删除索引
发送DELETE请求

http://localhost:9200/shopping

创建文档
发送POST请求

http://localhost:9200/shopping/_doc

{
    "title": "小米手机",
    "category": "小米",
    "price": 3999.00
}

由于没有给定id,所以ES会自动生成一个随机的id,该方式只能发送POST请求,而PUT请求需要明确id

发送PUT请求

http://localhost:9200/test3/_doc/1
{
    "name": "张三",
    "age": 18
}

修改文档
发送PUT请求,会覆盖所有字段,且更新数据中不包含的字段会被删除

http://localhost:9200/test3/_doc/1
{
    "name": "李四"
}

发送POST请求,会保留所有字段,更新新数据到原有文档中

http://localhost:9200/shopping/_doc/1/_update
{
    "title": "华为手机"
}

删除文档
发送DELETE请求

http://localhost:9200/shopping/_doc/1

当前删除为逻辑删除,并不会马上进行物理删除。

根据文档id查询
发送GET请求

http://localhost:9200/shopping/_doc/1

查询文档下的所有内容
发送GET请求

http://localhost:9200/shopping/_search

带有请求体的方式

http://localhost:9200/shopping/_search
{
    "query":{
        "match_all": {}
    }
}

条件查询
发送GET请求

http://localhost:9200/shopping/_search
{
    "query":{
        "match":{
            "category": "小米"
        }
    }
}

返回指定字段
发送GET请求

http://localhost:9200/shopping/_search
{
    "query":{
        "match_all": {}
    },
    "_source": ["title"]
}

分页查询

http://localhost:9200/shopping/_search
{
    "query":{
        "match_all":{}
    },
    "from": 0,
    "size": 2
}

查询排序

http://localhost:9200/shopping/_search
{
    "query": {
        "match_all":{}
    },
    "sort":{
        "price":{
            "order": "desc"
        }
    }
}

多条件查询
逻辑与 must 逻辑或 should

http://localhost:9200/shopping/_search
{
    "query":{
        "bool":{
            "must": [{
                "match": {
                    "categroy": "小米"
                }
            },{
                "match": {
                    "price": 3999.00
                }
            }]
        }
    }
}

范围查询

http://localhost:9200/shopping/_search
{
    "query":{
        "bool": {
            "should":[{
                "match":{
                    "categroy": "小米"
                }
            },{
                "match":{
                    "categroy": "华为"
                }
            }
            ]
        },
        "filter":{
            "range":{
                "price":{
                    "gt": 2000
                }
            }
        }
    }
}

全文检索(匹配数组)
查询query进行分割,再召回进行搜索

http://localhost:9200/shopping/_search
{
    "query":{
        "match":{
            "categroy": "小 为"
        }
    }
}

完全匹配
不会将查询语句进行分词处理的查询

http://localhost:9200/shopping/_search
{
    "query":{
        "match_phrase":{
            "categroy": "小 为"
        }
    }
}

精确查询
term代表精确匹配,不会对搜索文本进行分词,并且对keyword进行匹配,text被分词后,有可能不会被查询出来

http://localhost:9200/shopping/_search
{
    "query":{
        "term":{
            "name": "张三"
        }
    }
}

高亮查询

http://localhost:9200/shopping/_search
{
    "query":{
        "match":{
            "name": "张三"
        }
    },
    "highlight":{
        "pre_tags": "",
        "post_tags": ""
        "fields":{
            "name":{}
        }
    }
}

聚合查询

http://localhost:9200/shopping/_search
{
    "aggs": {
        "price_group":{
            "terms":{
                "field": "price"
            }
        }
    }
}

求平均

http://localhost:9200/shopping/_search
{
    "aggs":{
        "price_avg": {
            "avg":{
                "field": "price"
            }
        }
    },
    "size": 0
}

Original: https://blog.csdn.net/qq_19672707/article/details/124560441
Author: 技术宅zch
Title: ElasticSearch浅谈(基于ES 7)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528391/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球