专栏首页进击的全栈Elasticsearch介绍
原创

Elasticsearch介绍

es是什么:

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。

Elasticsearch使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

es主要优点是:实现了分布式的实时文件存储和和分析搜索引擎,其中的每个字段都可以被索引搜索,并且易于扩容。

基本概念:

  • 文档:es是面向文档的,它以文档维度进行存储和搜索,支持索引文档的内容。es使用JSON格式作为文档序列化的格式。
  • 索引:在es中索引相当于关系型数据库中的数据库,每个索引可以有多个类型,每个类型包含多个文档,每个文档中又有多个字段。es与常见的关心型数据库的概念对比如下:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

对标我们的工程中,每条上报的数据就是一个文档,他们的类型就是doc类型,每条记录都会有自己的id。

es支持用api上传一条记录,PUT /{_index}/{_type}/{_id} ,路径中也可以不指定_id,使用es自动生成的自增id

(22个字符长的UUID))。

  • 搜索:执行HTTP GET请求,带上文档存储地址 /{_index}/{_type}/{_id} ,响应的数据包含_index, _type, _id, _version等元数据,原始的文档数据存储在_source字段中。

其他常用的检索:

GET /{_index}/{_type}/_search, 用_search取代_id时会返回所有记录。

GET /{_index}/{_id}/_search?q=last_name:Smith, q指定检索条件,这种是带参数查询,另外还可以用DSL语句查询,例如以下查询语句与上面的带参查询等效:

GET /{_index}/{_id}/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}
  • 分析聚合:es的聚合功能支持在数据上生成复杂的统计分析。例如,将所有interests字段进行聚合,类似数据库中的group_by, 该聚合返回结果名称为all_interests:
GET /{_index}/{_id}/_search
{
  "aggs": {
    "all_interests": {
      "terms": { "field": "interests" }
    }
  }
}

es中的聚合也允许分级汇总,例如计算出各类interests的平均年龄:

GET /{_index}/{_id}/_search
{
    "aggs" : {
        "all_interests" : {
            "terms" : { "field" : "interests" },
            "aggs" : {
                "avg_age" : {
                    "avg" : { "field" : "age" }
                }
            }
        }
    }
}
  • 映射:

es中的数据可以分为两大类:确切值和全文文本,确切值只能精确匹配,全文文本可以进行分词模糊匹配。

各个字段及其类型信息保存在mapping中,可以在创建索引的时候指定映射,也可以稍后再新增映射,但是重要的是已经存在的字段,其类型不允许再修改。

kibana查询语法:

全文搜索和短语搜索:搜索栏直接输入hello world,会过滤出包含hello和world的所有文档,但是当输入“hello world”会过滤出包含该短语的文档。

字段搜索:field:value 为限定字段的全文搜索,field:"value"为限定字段的精确搜索;_exists_:field 文档中存在该字段,_missing_:field 文档中不存在该字段;

通配符:?匹配单个字符,*匹配0或多个字符,但是?和*不能作为第一个字符

范围搜索:[a TO b] {a TO b}, []包含端点,{}不包含端点

逻辑搜索:AND 与,OR 或,+ 搜索结果必须包含此项,- 搜索结果必须不能包含此项;例如:+name:张* -age:20, 过滤出姓张且不为20岁的同学;

分组搜索: (name: 张* OR city:深圳) AND age:20, 过滤出所有姓张和在深圳的20岁的同学

字段分组: field:()

转义字符: + - && || ! () {} [] ^" ~ * ? : \ 以上字符需要用 \ 转义

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • useRef 进阶

    一直以来使用useRef的场景比较常见和基础,大多是为了操作已经mount的dom节点,例如设置焦点之类的,如官方例子所示:

    CIKEY
  • docker 网络

    docker安装时会自动创建三个网络,我们可以用docker network ls指令查看:

    CIKEY
  • nginx 常见问题记录

    官方文档指明,location if语句中只有实用return 和 rewrite指令是绝对安全的。但是如果某些情况必须使用if 语句进行条件判断怎么办呢?需要...

    CIKEY
  • 基于Redis实现消息队列的6种方案之方案简述(下)Redis5.0的新类型Stream

    Redis5.0才有的新数据类型Stream基本上可以满足你对消息队列的所有需求,以下的内容有点长,如果你还在忙的话建议先收藏下。

    不太灵光的程序员
  • 基于客户行为事件的跨领域统一推荐模型探讨

    跨领域深度学习模型一直是近几年推荐系统主要研究方向之一, 本文探讨一种个人客户画像构建的新思路, 并讨论对应的基于个人行为事件的跨领域统一推荐模型。

    华章科技
  • 消息队列设计精要

    消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。 当今市面上...

    美团技术团队
  • 为什么要使用MQ消息中间件?这3个点让你彻底明白!

    一个用消息队列的人,不知道为啥用,有点尴尬。没有复习这点,很容易被问蒙,然后就开始胡扯了。

    程序员追风
  • 消息队列 - 应用场景

    订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据...

    gaobinzhan
  • 《浅入浅出》-RocketMQ

    消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。

    敖丙
  • 一个天天用消息队列的人,不知道为啥用 MQ,这就有点尴尬

    分析:一个用消息队列的人,不知道为啥用,有点尴尬。没有复习这点,很容易被问蒙,然后就开始胡扯了。

    lyb-geek

扫码关注云+社区

领取腾讯云代金券