查询类型

https://blog.csdn.net/weixin_45866849/article/details/126032976

概述

ElasticSearch 是一个分布式,高性能、高可用、可伸缩、RESTful 的搜索和数据分析引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。通常作为 Elastic Stack 的核心来使用。

Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API来隐藏 Lucene的复杂性,从而让全文搜索变得简单。Lucene只是一个库,想要使用它,必须使用Java来作为开发语言并将其直接集成到你的应用中。
RESTful 的四个关键字:PUT(修改),POST(添加),DELETE(删除),GET(查询)。其中在ES里面PUT和POST的界限并不是很分明,有时候PUT也作为添加。

ES 是一个近实时(NRT)的搜索引擎,一般从添加数据到能被搜索到只有很少的延迟(大约是1s),而查询数据是实时的。一般我们可以把ES配合logstash,kibana 来做日志分析系统,或者是搜索方面的系统功能。

工作原理

当 ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置) 寻找集群中的其它节点,并与之建立连接。这个过程如下图所示:


image.png

ELK = Elasticsearch + Logstash + Kibana

Elasticsearch:分布式存储以及全文检索
Logstash:日志加工、”搬运工“
Kibans:数据可视化展示

特点和优势

分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
实时分析的分布式搜索引擎。
可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。也可以运行在单台PC上
支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。

索引擎原理

反向索引又叫倒排索引,是根据文章内容中的关键字建立索引。
搜索引擎原理就是建立反向索引。
Elasticsearch 在 Lucene 的基础上进行封装,实现了分布式搜索引擎。
Elasticsearch 中的索引、类型和文档的概念比较重要,类似于MySQL中的数据库、表和行。
Elasticsearch 也是 Master-slave 架构,也实现了数据的分片和备份。
Elasticsearch 一个典型应用就是 ELK 日志分析系统。

全文检索

全文检索就是对一篇文章进行索引,可以根据关键字搜索,类似于mysql里的like语句。

全文索引就是把内容根据词的意义进行分词,然后分别创建索引,例如”你们下周末干什么“可能会被分词成: ”你们“,”下周末“,”干什么“ 等,这样当你搜索”你们“或者”下周末“ 都会把这句搜出来。

基本概念

ES MySQL
字段
文档 一行记录
类型(已废弃)
索引 数据库

mySQL里的数据其实是数据库下的表里面的一行记录。

ES里的数据其实是指索引下的类型里面的JSON格式的数据。

  • 关系型数据库中的数据库(DataBase),等价于ES中的索引(Index)
  • (已废弃)一个数据库下面有N张表(Table),等价于1个索引Index 下面有N多类型(Type)
  • 一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个索引(Index)下的类型(Type)由多个文档(Document)和多Field组成。
  • 在数据库中的增insert、删delete、改update、查select操作等价于ES中的增PUT/POST、删DELETE、改PUT、查GET**

文档(Document)

ElasticSearch是面向文档的,也就是说 文档是所有可搜索数据的最小单元。ES的文档就像MySQL中的一条记录,只是ES的文档会被序列化成** json 格式,保存在 ElasticSearch 中;
这个
json 对象是由字段组成,字段就相当于MySql的列,每个字段都有自己的类型(字符串、数值、布尔、二进制、日期范围类型)**;
当我们创建文档是,如果不指定字段的类型,ElasticSearch 会帮我们自动匹配类型;
每个文档都有一个ID,类似MySql的主键,可以自己指定,也可以让ElasticSearch 自动生成;
文档的 json 格式支持数组/嵌套,在一个 索引(数据库)或 类型(表)里面,你可以存储任意多的文档。
注意:虽然在实际存储上,文档存在于某个索引里,但是文档必须被赋予一个索引下的类型才可以。

类型(Type)(已废弃)

类型就相当于 MySQL 里的表,我们知道MySQL里的一个库下可以有很多表,最原始的时候ES也是这样,一个索引下可以有很多类型,但是从 6.0版本开始,type 已经被逐渐废弃,但是这时候一个索引仍然可以设置多个类型,一直到 7.0版本开始,一个索引就只能创建一个类型了

索引(Index)

索引就相当于 MySQL 里的数据库,它是具有某种相似特性的文档集合。反过来说不同特性的文档一般都放在不同的索引里;
索引的名称必须全部是小写;
在单个集群中, 可以定义任意多个索引;
索引具有 mapping 和 setting 的概念,mapping用来定义文档字段的类型,setting用来定义不同数据的分布

集群(Cluster)

ES 可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。

在ES里面默认有一个配置,clustername 默认值是 ElasticSearch,如果这个值是一样的就属于同一个集群,不一样的值就是不一样的集群。

集群中有多个节点,其中一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。ES的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看ES集群,在逻辑上是个整体,你与任何一个节点的通信和与整个ES集群通信是等价的。

节点(node)

  • 一个节点就是一个ES实例,其实本质上就是一个java进程;
  • 形成集群的每个服务器称为节点;
  • 节点的名称可以通过配置文件配置,或者在启动的时候使用 -E node.name=repledata 指定,默认是随机分配的。建议自己指定,因为节点名称对于管理目的很重要,我们可以通过节点名称确定网络中的哪些服务器对应于ES集群中的哪些节点;

ES的节点类型主要分为如下几种:

  • Master Eligible节点:每个节点启动后,默认就是Master Eligible节点,可以通过设置node.master: false来禁止。Master Eligible 可以参加选主流程,并成为 Master 节点(当第一个节点启动后,它会将自己选为Master节点);注意:每个节点都保存了集群的状态,只有Master节点才能修改集群的状态信息。
  • Data节点:可以保存数据的节点。主要负责保存分片数据,利于数据扩展。
  • Coordinating 节点:负责接收客户端的请求,将请求发送到合适的节点,最终把结果汇集到一起。

注意:每个节点默认都起到了 Coordinating node 的职责。一般在开发环境中一个节点可以承担多个角色,但是在生产环境中,还是设置单一的角色比较好,因为有助于提高性能。

分片(shard)

ES 里面的索引可能存储大量数据,这些数据可能会超出单个节点的硬件限制。当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。
为了解决这个问题,ES提供了将索引细分为多个碎片的功能,这就是分片。简单理解,在创建索引时,只需要定义所需的碎片数量,其实每个分片都可以看作是一个完全功能性和独立的索引,可以托管在集群中的任何节点上。

问题:分片有什么好处和注意事项呢?
通过分片技术,可以水平拆分数据量,同时他还支持跨碎片(可能在多个节点上)分布和并行操作,从而提高性能/吞吐量;
ES可以完全自动管理分片的分配和文档的聚合来完成搜索请求,并且对用户完全透明;
主分片数在索引创建时指定,后续只能通过 Reindex修改,但是较麻烦,一般不进行修改

副本分片(replica shard)

为了实现高可用、遇到问题时实现分片的故障转移机制,ElasticSearch允许将索引分片的一个或多个复制成所谓的副本分片。

问题:副本分片有什么作用和注意事项呢?
当分片或者节点发生故障时提供高可靠性。因此,需要注意的是,副本分片永远不会分配到复制它的原始或主分片所在的节点上(拥有相同数据的分片,是不会在同一个节点上面的);
可以提高扩展搜索量和吞吐量,因为ES允许在所有副本上并行执行搜索;提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复;提高ES的查询效率,ES 会自动对搜索请求进行负载均衡。
副本是一个分片的精确复制,每个分片可以有零或多个副本。ES中可以有许多相同的分片,其中之一被选择更给索引操作,这种特殊的分片成为主分片。
默认情况下,ES 中的每个索引都分配 5 个主分片,并为每个主分片分配1 个副本分片 (5主5副)。主分片在创建索引时指定,不能修改,副本分片可以修改。

其他

  • recovery:代表数据恢复或叫数据重新分布,ES在有节点加入或退出时会根据机器的负载均衡对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
  • river:代表ES的一个数据源,也是其他存储方式(如:数据库)同步数据到ES的一个方法。它是以插件方式存在的一个ES服务,通过读取 river 中的数据并把他索引到ES中,官方的river有couchDB的,Rabbit MQ的,Twitter的,Wikipedia的。
  • gateway:代表ES索引快照的存储方式,ES默认是先把索引存放到内存中,当内存满了时在持久化到本地硬盘。gateway对索引快照进行存储,当这个ES集群关闭再重新启动时就会从gateway中读取索引备份数据。ES支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop 的HDFS和amazon 的s3云存储服务。
  • discovery.zen:代表ES的自动发现节点机制,ES是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
  • Transport:代表ES内部节点或集群与客户端的交互方式,默认内部是使用TCP协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memecached、zeroMQ等传输协议(通过插件方式集成)。

DSL查询

简单来说,DSL就是ES的一种查询方式,DSL基于JSON实现了直观简单的结构化查询功能。由于DSL查询是JSON格式的,所以更加的灵活,而且可以同时包含查询和过滤器,可以很轻松的构造出复杂的查询功能。

term查询

完全匹配,不进行分词,用于查询精准匹配的数值,如数字、日期、布尔值或未经分析的字符串(not_analyzed)

POST /bjydemo/_search
{
  "query": {
    "term": {
      "id": "3"
    }
  }
}

terms查询

允许指定多个判断条件,当某个字段指定多个值,name文档需要用terms一起去做匹配

POST /ropledata/_search
{
    "query": {
        "terms": {
            "id": [3,4]
        }
    }
}

range 查询

按照指定范围进行过滤查询,关键词包含:

  • gt:大于
  • gte:大于等于
  • lt:小于
  • lte:小于等于
POST /bjydemo/_search
{
  "query": {
    "range": {
      "id": {
        "gte": 5,
        "lt": 10
      }
    }
  }
}

exists 查询

用于查找文档中是否包含指定字段,若包含就返回该条数据

POST /bjydemo/_search
{
  "query": {
    "exists": {
      "field": "message"
    }
  }
}

match查询

代表模糊搜索,搜索前会对搜索词进行分词解析,然后按搜索词匹配查找
match 查询是一个标准查询,不管是全文本查询还是精确查询基本上都要用到它。 在使用 match 查询一个全文本字段时,它会在真正查询之前用 分析器 先分析match一下查询字符;如果用match下指定了一个确切值,在遇到数字,日期,布尔值或者 not_analyzed 的字符串时,它将为你搜索你给定的值。

match_phrase查询

match_phrase 和 match 类似,在查询时都会对查询词进行分词,但是match会忽略查询词的空格,而 match_phrase 不会。因此 需要注意的是:查询包含空格的字符串,要用match_phrase!
multi_match可以用来查询多个字段

bool查询

bool 查询可以用来合并多个条件查询结果的布尔逻辑,操作符关键字如下:

  1. must :多个查询条件的完全匹配,相当于 and;
  2. must_not:多个查询条件的相反匹配,相当于 not;
  3. should:至少有一个查询条件匹配,相当于or。
    注意:这些参数可以分别继承一个查询条件或者一个查询条件的数组。

比如查询hobby必须为篮球,id必须不是1,message可以是”食不食油饼“ 的数据

POST /bjydemo/_search
{
  "query": {
    "bool": {
      "must": {
         "match":{
           "hobby":"篮球"
         }
      },
     "must_not": {
          "term":{
            "id":1
          }
      },
      "should": [
        {
          "term": {
            "message": "食不食油饼"
          }
        }
      ]
    }
  }
}

filter查询

filter 用于过滤查询,通常和 bool 连用,就像编程语言一样,用于过滤数据。

POST /bjydemo/_search
{
  "query": {
    "bool": {
      "filter": {
         "term": {
           "hobby": "rap"
         }
      }
    }
  }
}

融合在一起使用

常用的就是如上所述,它们一般是融合在一起使用的。

比如查询"id"必须不是3,“hobby”包含“篮球”,同时“id”大于等于2小于等于5的数据:

POST /bjydemo/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "id": {
            "gte": 2,
            "lte": 5
          }
        }
      },
      "must_not": {
         "term": {
           "id":3
          }
        },
      "must": {
        "match" : {
          "hobby":"篮球"
        }
      }
    }
  }
}

聚合查询

aggs

常用数学统计函数

avg:平均值
max:最大值
min:最小值
sum:求和
size:用来控制返回多少条数组。我们时想要在所有文档里求平均值求和,所以要用size来控制返回一个数据即可,不然ES还会默认返回10条数据。

POST /bjydemo/_search
{
  "aggs": {
    "bjydemo": {
      "avg": {
        "field": "id"
      }
    }
  },
  "size": 0
}

cardinality去重

涉及到聚合查询的场景,如果需要去重的话,EStigon提供了cardinality 去重统计函数来解决这个问题。

POST /bjydemo/_search
{
    "aggs": {
        "bjydemo": {
            "cardinality": {
                "field": "id"
            }
        }
    },
    "size": 0
}

value_count技术统计

涉及到统计个数的情景,可以使用 value_count。比如需要统计有多少条数据:

POST /bjydemo/_search
{
    "aggs": {
        "bjydemo": {
            "value_count": {
                "field": "id"
            }
        }
    },
    "size": 0
}

terms词聚合

terms 词聚合可以基于给定的字段,并按照这个字段对应的每一个数据为一个桶,然后计算每个桶里的文档个数。默认会按照文档的个数排序。

比如要根据’id’字段进行词聚合:

POST /bjydemo/_search
{
    "aggs": {
        "bjydemo": {
            "terms": {
                "field": "id"
            }
        }
    }
}
image.png

top_hits聚合

当我们使用sql时可以很方便的处理top问题,ES也提供了对应的支持,top_hits 就是这样的函数,一般和terms 连用,可以获取到每组前n条数据。

比如想要根据"id"分组,然后拿到前 6 条数据:

POST /bjydemo/_search
{
    "aggs": {
        "bjydemo": {
            "terms": {
                "field": "id"
            },
            "aggs": {
                "count": {
                    "top_hits": {
                        "size": 6
                    }
                }
            }
        }
    },
    "size": 0
}

range范围查询

除了DSL查询时介绍的gt,lt函数,其实在聚合查询里还提供了range 用来进行范围查询。

比如查询id字段的值在 6-9 之间 和 10-20 之间的文档有多少:

POST /bjydemo/_search
{
    "aggs": {
        "group_by_id": {
            "range": {
                "field": "id",
                "ranges": [
                    {
                        "from": 6,
                        "to":9
                    },
                    {
                        "from": 10,
                        "to": 20
                    }
                ]
            }
        }
    },
    "size": 0
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容