ES搜索结果字段注释
{
# took 值告诉我们执行整个搜索请求耗费了多少毫秒。
"took" : 21,
# timed_out 值告诉我们查询是否超时。默认情况下,搜索请求不会超时。
"timed_out" : false,
# _shards 部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。
"_shards" : {
"total" : 40,
"successful" : 40,
"skipped" : 0,
"failed" : 0
},
# hits 结果集。一个 hits 数组包含所查询结果的前十个文档。
# 在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段。
# 这意味着我们可以直接从返回的搜索结果中使用整个文档。
# 这不像其他的搜索引擎,仅仅返回文档的ID,需要你单独去获取文档。
"hits" : {
# total 符合搜索条件的文件总数,即,命中结果。
"total" : {
"value" : 10000,
"relation" : "gte"
},
## max_score 评分
"max_score" : 0.0,
## hits 结果集具体数据
"hits" : [
{
### _index 该条数据所在索引
"_index" : "*_2023.02.06",
### _type 该条数据所在类型
"_type" : "_doc",
### _id 该数据的唯一标识符
"_id" : "******",
### _score 评分。每个结果还有一个 _score,衡量了文档与查询的匹配程度。降序排列。
"_score" : 0.0,
###
"_routing" : "0",
### _source 具体数据。该条数据的内容,里面由多个fields组成。
"_source" : {
[转]ES搜索结果中各个字段介绍,hits,took,timeout
转自: https://blog.csdn.net/qq_36868951/article/details/108127909
空搜索
搜索API的最基础的形式是没有指定任何查询的空搜索,它简单地返回集群中所有索引下的所有文档:
GET /_search
返回的结果(为了界面简洁编辑过的)像这样:
{
"hits" : {
"total" : 14,
"hits" : [
{
"_index": "us",
"_type": "tweet",
"_id": "7",
"_score": 1,
"_source": {
"date": "2014-09-17",
"name": "John Smith",
"tweet": "The Query DSL is really powerful and flexible",
"user_id": 2
}
},
... 9 RESULTS REMOVED ...
],
"max_score" : 1
},
"took" : 4,
"_shards" : {
"failed" : 0,
"successful" : 10,
"total" : 10
},
"timed_out" : false
}
hits
返回结果中最重要的部分是 hits ,它包含 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档。
在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段。这意味着我们可以直接从返回的搜索结果中使用整个文档。这不像其他的搜索引擎,仅仅返回文档的ID,需要你单独去获取文档。
每个结果还有一个 _score ,它衡量了文档与查询的匹配程度。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。在这个例子中,我们没有指定任何查询,故所有的文档具有相同的相关性,因此对所有的结果而言 1 是中性的 _score 。
max_score 值是与查询所匹配文档的 _score 的最大值。
took
took 值告诉我们执行整个搜索请求耗费了多少毫秒。
shard
_shards 部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。正常情况下我们不希望分片失败,但是分片失败是可能发生的。如果我们遭遇到一种灾难级别的故障,在这个故障中丢失了相同分片的原始数据和副本,那么对这个分片将没有可用副本来对搜索请求作出响应。假若这样,Elasticsearch 将报告这个分片是失败的,但是会继续返回剩余分片的结果。
timeout
timed_out 值告诉我们查询是否超时。默认情况下,搜索请求不会超时。如果低响应时间比完成结果更重要,你可以指定 timeout 为 10 或者 10ms(10毫秒),或者 1s(1秒):
GET /_search?timeout=10ms
在请求超时之前,Elasticsearch 将会返回已经成功从每个分片获取的结果。
应当注意的是 timeout 不是停止执行查询,它仅仅是告知正在协调的节点返回到目前为止收集的结果并且关闭连接。在后台,其他的分片可能仍在执行查询即使是结果已经被发送了。
使用超时是因为 SLA(服务等级协议)对你是很重要的,而不是因为想去中止长时间运行的查询。
es的常用字段类型和查询
转自: https://www.cnblogs.com/hld123/p/15477422.html
概要
在ES中,字段的类型很关键,毕竟无论是es还是传统的数据库,都无法弱化字段的类型。
在索引的时候,如果字段第一次出现,会自动识别某个类型。
那么如果一个字段已经存在了,并且设置为某个类型。再来一条数据,字段的数据不与当前的类型相符,就会出现字段冲突的问题。如果发生了冲突,在2.x版本会自动拒绝。
如果自动映射无法满足需求,就需要使用者自己来设置映射类型,因此,就需要使用者了解ES中的类型。
一、ES数据类型
1、分隔数据
ElasticSearch“真正用于分隔数据的结构“只有index,而没有type,type实际上作为了一个元数据(类似SQL中的id,作为额外的标识数据)来实现逻辑划分。
2、mapping
在index中还有一个mapping,mapping管理了整个index的各个字段的属性,也就是定义了整个index中document的结构。
GET test_alias/_mapping
3、ES数据类型
ES常用的数据类型可分为3大类:核心数据类型、复杂数据类型、专用数据类型
1)核心数据类型
(1)字符串类型: text, keyword
text类型:
a. 支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;
b. test类型最大支持的字符长度无限制,适合大字段存储;
使用场景:
存储全文搜索数据, 例如: 邮箱内容、地址、代码块、博客文章内容等。
默认结合standard analyzer(标准解析器)对文本进行分词、倒排索引。
默认结合标准分析器进行词命中、词频相关度打分。
keyword类型:
a. 不进行分词,直接索引,支持模糊、支持精确匹配,支持聚合、排序操作。
b. keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
使用场景:
存储邮箱号码、url、name、title,手机号码、主机名、状态码、邮政编码、标签、年龄、性别等数据。
用于筛选数据(例如: select * from x where status='open')、排序、聚合(统计)。
直接将完整的文本保存到倒排索引中。
(2)数字类型:long, integer, short, byte, double, float, half_float, scaled_float
(3)日期:date
(4)日期 纳秒:date_nanos
(5)布尔型:boolean
(6)Binary:binary
(7)Range: integer_range, float_range, long_range, double_range, date_range
二、es的常用命令
1、 cat 命令:
cat 命令是监控 es 的节点,内存,索引,分片,集群状态等一些基本信息
# 列出所有_cat命令
GET _cat/
# 显示左右索引并按照存储大小排序
GET _cat/indices?v&s=store.size:desc
# 获取集群状态
GET _cat/health
# 当使用v参数是 会显示列名的详细信息
GET _cat/health?v
# 显示所有的node信息
GET _cat/nodes?v
# 只显示ip和load_5m这两列
GET _cat/nodes?v&h=ip,load_5m
# 通过json格式显示输出
GET _cat/indices?v&format=json&pretty
2、 匹配查找
term用于精确匹配某些值,如数字,日期,布尔值
GET test_alias/_search
{
"query": {
"term": {
"target_id": {
"value": "15464324"
},
{"term":{"age":20}},
{"term":{"date":"2017-08-21"}}
}
}
}
terms与term类似,但允许指定多个匹配条件,当某个字段存在多个值时
{"terms":{"tag":["search","full_text","nosql"]}}
exists****包含某字段
{"exists":{"fields":"tittle"}}
missing****没有某字段
{"missing":{"fields":"tittle"}}
3、范围检索
range
范围查询的符号:
gte 大于或等于
gt 大于
lte 小于或等于
lt 小于
例如:数组范围内的查询
GET book_shop/_search
{
"query": {
"range": {
"price": {
"gte": 40,
"lte": 80,
"boost": 2.0 // 设置得分的权重值(提升值), 默认是1.0
}
}
}
}
GET test_alias/_search
{
"query": {
"bool": {
"filter": [
{
"terms": {
"expend_type": [
1,
13
]
}
},
{
"term": {
"target_id": 2402483
}
},
{
"range": {
"time": {
"gt": 1553217005,
"lt": 1553218095
}
}
}
]
}
}
}
4、分词检索
match
match_all
4) Bool查询
Bool查询包括四种子句:must、filter、should、must_not
must, 返回的文档必须满足must子句的条件,并且参与计算分值
filter, 返回的文档必须满足filter子句的条件。但是跟must不一样的是,不会计算分值, 并且可以使用缓存
从上面的描述来看,如果只看查询的结果,must和filter是一样的。区别是场景不一样。如果结果需要算分就使用must,否则可以考虑使用filter
5、聚合查询
aggs
1) 给定target_id的值,查询同一个target_id下的expend_type为1或者13下的统计值
GET test_alias/_search
{
"size": 0,
"query": {
"bool": {
"must": [
{
"terms": {
"expend_type": [
1,
13
]
}
},
{
"terms": {
"target_id": [
13906061,
13817056,
13904373,
13851977,
13851353
]
}
}
]
}
},
"aggs": {
"phone_count": {
"terms": {
"field": "target_id"
}
}
}
}
查询结果为:

- 给定target_id的值,查询expend_type分别为1和13下的统计值
GET test_alias/_search
{
"size": 0,
"query": {
"bool": {
"must": [
{
"terms": {
"target_id": [
13906061,
13817056,
13904373
]
}
},
{
"terms": {
"expend_type": [
1,
13
]
}
}
]
}
},
"aggs": {
"target": {
"terms": {
"field": "target_id"
},
"aggs": {
"type": {
"terms": {
"field": "expend_type"
}
}
}
}
}
}
查询结果为:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 9,
"successful" : 9,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 620,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"target" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 13906061,
"doc_count" : 502,
"type" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 1,
"doc_count" : 502
}
]
}
},
{
"key" : 13817056,
"doc_count" : 62,
"type" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 1,
"doc_count" : 62
}
]
}
},
{
"key" : 13904373,
"doc_count" : 56,
"type" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 1,
"doc_count" : 56
}
]
}
}
]
}
}
}
3)聚合嵌套查询
curl -XGET localhost:9200/school/student/_search
{
"size":0,
"aggs":{
"group_by_age":{
"range":{
"field":"age",
"ranges":[
{"from":20, "to":30},
{"from":30, "to":40},
{"from":40, "to":50}
]
}
}
},
"aggs":{
"group_by_gender":{
"terms":{
"field":"gender"
},
"aggs":{
"avg":{
"field":"balance"
}
}
}
}
}