一起探索Elasticsearch是怎样搜索数据的

背景

  1. 最近产品经理反馈查报文麻烦,后期和领导讨论做一个日志收集服务,日志存储选择用ES
  2. 在学习ES之前,带上下面的疑问点进行学习,下面请求参数是啥意思?
    2.1 url:/plume_log_run_20210804*/_search?from=0&size=100
    2.2 查询参数
    {"query":{"bool":{"must":[{"match_phrase":{"appName":{"query":"plumelog_demo"}}},{"range":{"dtTime":{"gte":1628041788000,"lt":1628045658000}}}]}},"highlight":{"fields":{"content":{"fragment_size":2147483647}}},"sort":[{"dtTime":"desc"},{"seq":"desc"}]}
    

Elasticsearch搜索都发生了什么?

  1. REST API 搜索请求被发送到所连接的节点,该节点根据要查询的索引,将这个请求依次发送到所有的相关分片(主分片或者副本分片)。从所有分片收集到足够的排序和排名信息之后,只有包含所需文档的分片才被要求返回相关的内容
  2. 搜索路由的行为是可以配置的
    2.1 转发请求
    在这里插入图片描述
    2.2 聚集结果
    在这里插入图片描述

搜索请求的结构

确定搜索范围

  1. 所有的REST搜索请求使用_search的REST端点,既可以是GET请求,也可以是POST请求
  2. 可以通过在搜索URL中指定索引或类型的名称来限制范围
    2.1 例如/plume_log_run_20210804*/_search?from=0&size=100,限制以plume_log_run_20210804开头的索引
    2.2 size:代表了返回文档的数量
    2.3 from:和size一起使用,from用于分页操作

搜索请求的基本模块

query:搜索请求中最重要的组成部分。该模块使用DSL和过滤器DSL来配置
sort:默认排序是基于文档的得分,添加额外的sort将帮助你控制哪些文档被返回

常用的基础查询

match查询
  1. match查询是一个散列映射,包含了希望搜索的字段和字符串
  2. 布尔查询行为
    2.1 默认情况下,match查询使用布尔行为和OR操作符
    (1)搜索文本"ES Denver",ES会搜索"ES OR Denver",同时匹配"ES Amsterdan"和"Denver Clojure"聚会分组
    2.2 为了搜索同时包含"ES"和"Denver"关键词的结果,将match字段的name修改为一个映射
    	"query":{
    		"match":{
    			"name":{
    				"query" : "ES Denver",
    				"operator" : "and"
    			}
    		}
    	}
    
  3. 词组查询行为
    3.1 每个单词的位置之间可以留有余地(slop:表示词组中多个分词之间的距离)
    	"query":{
    			"match":{
    				"name":{
    					"type" : "phrase",
    					"query" : "ES Denver",
    					"slop" : 1
    				}
    			}
    		}
    
    3.2 match_phrase 查询同样可写成一种类型为 phrase 的 match 查询
range查询
  1. 为了使用范围查询,需要指定某个字段的上界和下界值
    	"query":{
    			"range" :{
    				"create_on":{
    					"gt" : "2012-06-01",
    					"lt" : "2012-09-01"
    				}
    			}
    		}
    

组合查询或复合查询

  1. bool查询允许你在单独的查询中组合任意数量的查询
    1.1 指定的查询子句表明哪些部分是必须(must)匹配、应该(should)匹配或者是不能(must_not)匹配上ES索引里的数据

使用聚集来探索数据

  1. Elasticsearch的聚集(aggregations)加载了和搜索相匹配的文档,并且完成了各种的计算
  2. 聚集分为两个主要的类别:度量型桶型
    2.1 度量型聚集是指一组文档的统计分析,可以得到诸如最大值、最小值、标准差等度量值
    2.2 桶聚集将匹配的文档切分一个或多个容器(桶),然后告诉你每个桶里的文档数量
  3. 有了桶聚集,可以嵌套其他的聚集,让子聚集在上层聚集所产生的每个文档桶上运行
聚集的具体结构
	"aggregations": {
	    "2": {
	      "date_histogram": {
	        "field": "dtTime",
	        "interval": 60000,
	        "min_doc_count": 0
	      }
	    }
	  }
  1. 使用键aggregations或者aggs来进行标记。需要给每个聚集起一个名字,指定它的类型以及该类型相关的选项
  2. 运行在查询的结果之上。和查询不匹配的文档不会计算在内
histogram聚集
  1. 定义一个固定的间距,然后Elasticsearch会为你构建多个范围
  2. histogram聚集有一个用于日期的变体,称为date_histogram聚集
    2.1 需要在interval字段里插入日期
    2.2 使用min_doc_count选项显示空的桶,或者是忽略只包含少量文档的桶
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值