Elasticsearch 基础查询

Linux环境docker安装Elasticsearch+kibana

准备一台服务器
第一步:安装docker 参考链接 :https://www.cnblogs.com/yufeng218/p/8370670.html

下载ES和kibana的docker镜像,官网上有,注意下载的版本号要一致 ES版本最好不要超过7.0,各种各样的问题,很无语。kibana 6.7之后的版本才支持中文,
首先需要安装JDK

解压安装包后 docker load -i 或者直接 docker pull
查看镜像id
在这里插入图片描述
直接docker run 就行了。
kibana也是这么启动,需要指定下es
docker run -it -d -e ELASTICSEARCH_URL=http://127.0.0.1:9200 --name kibana --network=container:(es images id) (kibana images id)
之后进到docker里,在/user/share/kibana/config/kibana.yaml 里加一行配置

i18n.locale: zh-CN 注意冒号后边有个空格

之后就可以了
在这里插入图片描述

term查询

这些查询通常⽤于结构化的数据,⽐如:number, date, keyword等,⽽不是对text。

也就是说,全⽂本查询之前要先对⽂本内容进⾏分词,⽽单词级别的查询直接在相应字段的

反向索引中精确查找,单词级别的查询⼀般⽤于数值、⽇期等类型的字段上

Term query 精准匹配查询

POST nba/_search
{
    "query": {
        "term": {
            "jerseyNo": "23"
         }
     }
}

Exsit Query 在特定的字段中查找⾮空值的⽂档

POST nba/_search
{
    "query": {
        "exists": {
            "field": "teamNameEn"
         }
     }
}

Prefifix Query 查找包含带有指定前缀term的⽂档

POST nba/_search
{
    "query": {
        "prefix": {
            "teamNameEn": "Rock"
         }
     }
}

Wildcard Query ⽀持通配符查询,*表示任意字符,?表示任意单个字符

POST nba/_search
{
    "query": {
        "wildcard": {
            "teamNameEn": "Ro*s"
         }
     }
}

Regexp Query 正则表达式查询

POST nba/_search
{
    "query": {
        "regexp": {
            "teamNameEn": "Ro.*s"
         }
     }
}

Ids Query(查找id为1和2的球员)

POST nba/_search
{
    "query": {
        "ids": {
            "values": [1,2]
         }
     }
}

范围查询

查找指定字段在指定范围内包含值(⽇期、数字或字符串)的⽂档。
查找在nba打了2年到10年以内的球员

POST nba/_search
{
    "query": {
        "range": {
            "playYear": {
                "gte": 2,
                "lte": 10
             }
         }
     }
}

查找1980年到1999年出⽣的球员

POST nba/_search
{
    "query": {
        "range": {
            "birthDay": {
                "gte": "01/01/1999",
                "lte": "2022",
                "format": "dd/MM/yyyy||yyyy"
             }
         }
     }
}

布尔查询

must :必须出现在匹配⽂档中
filter :必须出现在⽂档中,但是不打分
must_not :不能出现在⽂档中
should :应该出现在⽂档中

must (查找名字叫做James的球员)

POST /nba/_search
{
    "query": {
        "bool": {
            "must": [
                 {
                    "match": {
                        "displayNameEn": "james"
                     }
                 }
             ]
         }
     }
}

效果同must,但是不打分(查找名字叫做James的球员)

POST /nba/_search
{
    "query": {
        "bool": {
            "filter": [
                {
                    "match": {
                        "displayNameEn": "james"
                     }
                 }
             ]
         }
     }
}

must_not (查找名字叫做James的⻄部球员)

POST /nba/_search
{
    "query": {
        "bool": {
            "must": [
                 {
                    "match": {
                        "displayNameEn": "james"
                     }
                 }
             ],
            "must_not": [
                 {
                    "term": {
                        "teamConferenceEn": {
                            "value": "Eastern"
                         }
                     }
                 }
             ]
         }
    }
}

should(查找名字叫做James的打球时间应该在11到20年⻄部球员)
1、即使匹配不到也返回,只是评分不同

POST /nba/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "displayNameEn": "james"
                    }
                }
            ],
            "must_not": [
                {
                    "term": {
                        "teamConferenceEn": {
                            "value": "Eastern"
                        }
                    }
                }
            ],
            "should": [
                {
                    "range": {
                        "playYear": {
                            "gte": 11,
                            "lte": 20
                        }
                    }
                }
            ]
        }
    }
}

2、如果minimum_should_match=1,则变成要查出名字叫做James的打球时间在11到20年⻄部球员

POST /nba/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "displayNameEn": "james"
                    }
                }
            ],
            "must_not": [
                {
                    "term": {
                        "teamConferenceEn": {
                            "value": "Eastern"
                        }
                    }
                }
            ],
            "should": [
                {
                    "range": {
                        "playYear": {
                            "gte": 11,
                            "lte": 20
                        }
                    }
                }
            ],
            "minimum_should_match": 1
        }
    }
}
 

排序查询

⽕箭队中按打球时间从⼤到⼩排序的球员

POST nba/_search
{
    "query": {
        "match": {
            "teamNameEn": "Rockets"
        }
    },
    "sort": [
        {
            "playYear": {
                "order": "desc"
            }
        }
    ]
}

⽕箭队中按打球时间从⼤到⼩,如果年龄相同则按照身⾼从⾼到低排序的球员

POST nba/_search
{
    "query": {
        "match": {
            "teamNameEn": "Rockets"
        }
    },
    "sort": [
        {
            "playYear": {
                "order": "desc"
            }
        },
        {
            "heightValue": {
                "order": "asc"
            }
        }
    ]
}

聚合查询

ES聚合分析是什么

  • 聚合分析是数据库中重要的功能特性,完成对⼀个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最⼤值、最⼩值,计算和、平均值等。ES作为搜索引擎兼数据库,同样提供了强⼤的聚合分析能⼒

  • 对⼀个数据集求最⼤、最⼩、和、平均值等指标的聚合,在ES中称为指标聚合

  • ⽽关系型数据库中除了有聚合函数外,还可以对查询出的数据进⾏分组group by,再在组上进⾏指标聚合。在ES中称为桶聚合

指标聚合
max求最大值/min求最小值/sum求合/avg求平均值

求出⽕箭队球员的平均年龄

aggs 跟query、sort一样,代表聚合

avgAge 别名,代表聚合结果的字段名称

avg 聚合类型,求平均值

field 聚合字段

size 查询结果,查询的记录条数为0,不返回记录详情,也就是,只返回聚合结果

POST /nba/_search
{
    "query": {
        "term": {
            "teamNameEn": {
                "value": "Rockets"
            }
        }
    },
    "aggs": {
        "avgAge": {
            "avg": {
                "field": "age"
            }
        }
    },
    "size": 0
}

value_count 统计⾮空字段的⽂档数,跟mysql中的count()功能一样
写法1:求出⽕箭队中球员打球时间不为空的数量

POST /nba/_search
{
    "query": {
        "term": {
            "teamNameEn": {
                "value": "Rockets"
            }
        }
    },
    "aggs": {
        "countPlayerYear": {
            "value_count": {
                "field": "playYear"
            }
        }
    },
    "size": 0
}

写法2:查出⽕箭队有多少名球员

POST nba/_count
{
    "query": {
        "term": {
            "teamNameEn": {
                "value": "Rockets"
            }
        }
    }
}

Cardinality 值去重计数,跟mysql中的distinct去重一样
查出⽕箭队中年龄不同的数量

POST /nba/_search
{
    "query": {
        "term": {
            "teamNameEn": {
                "value": "Rockets"
            }
        }
    },
    "aggs": {
        "counAget": {
            "cardinality": {
                "field": "age"
            }
        }
    },
    "size": 0
}

stats 统计count max min avg sum 5个值
查出⽕箭队球员的年龄stats

POST /nba/_search
{
    "query": {
        "term": {
            "teamNameEn": {
                "value": "Rockets"
            }
        }
    },
    "aggs": {
        "statsAge": {
            "stats": {
                "field": "age"
            }
        }
    },
    "size": 0
}

Extended stats ⽐stats多4个统计结果: 平⽅和、⽅差、标准差、平均值加/减两个标准差的区间
查出⽕箭队球员的年龄Extend stats

POST /nba/_search
{
    "query": {
        "term": {
            "teamNameEn": {
                "value": "Rockets"
            }
        }
    },
    "aggs": {
        "extendStatsAge": {
            "extended_stats": {
                "field": "age"
            }
        }
    },
    "size": 0
}

Percentiles 占⽐百分位对应的值统计,默认返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值
1%的人,最大年龄是多少

5%的人,最大年龄是多少

25%的人,最大年龄是多少

50%的人,最大年龄是多少

75%的人,最大年龄是多少

95%的人,最大年龄是多少

99%的人,最大年龄是多少

查出⽕箭的球员的年龄占⽐

POST /nba/_search
{
    "query": {
        "term": {
            "teamNameEn": {
                "value": "Rockets"
            }
        }
    },
    "aggs": {
        "pecentAge": {
            "percentiles": {
                "field": "age"
            }
        }
    },
    "size": 0
}

查出⽕箭的球员的年龄占⽐(指定分位值)

POST /nba/_search
{
    "query": {
        "term": {
            "teamNameEn": {
                "value": "Rockets"
            }
        }
    },
    "aggs": {
        "percentAge": {
            "percentiles": {
                "field": "age",
                "percents": [
                    20,
                    50,
                    75
                ]
            }
        }
    },
    "size": 0
}

桶聚合-------mysql中group by
Terms Aggregation 根据字段项分组聚合
⽕箭队根据年龄进⾏分组

field 分组字段,group by age

size 返回的分组数,如下,分组结果一共分成了100个组,size:10,则返回10个分组的数据

POST /nba/_search
{
    "query": {
        "term": {
            "teamNameEn": {
                "value": "Rockets"
            }
        }
    },
    "aggs": {
        "aggsAge": {
            "terms": {
                "field": "age",
                "size": 10
            }
        }
    },
    "size": 0
}

order 分组聚合排序
⽕箭队根据年龄进⾏分组,分组信息通过年龄从⼤到⼩排序 (通过指定字段)

解析:根据组内最大的年龄,对所有分组进行排序

POST /nba/_search
{
    "query": {
        "term": {
            "teamNameEn": {
                "value": "Rockets"
            }
        }
    },
    "aggs": {
        "aggsAge": {
            "terms": {
                "field": "age",
                "size": 10,
                "order": {
                    "_key": "desc"
                }
            }
        }
    },
    "size": 0
}

⽕箭队根据年龄进⾏分组,分组信息通过⽂档数从⼤到⼩排序 (通过⽂档数)

POST /nba/_search
{
    "query": {
        "term": {
            "teamNameEn": {
                "value": "Rockets"
            }
        }
    },
    "aggs": {
        "aggsAge": {
            "terms": {
                "field": "age",
                "size": 10,
                "order": {
                    "_count": "desc"
                }
            }
        }
    },
    "size": 0
}

每⽀球队按该队所有球员的平均年龄进⾏分组排序 (通过分组指标值)

POST /nba/_search
{
    "aggs": {
        "aggsTeamName": {
            "terms": {
                "field": "teamNameEn",
                "size": 30,
                "order": {
                    "avgAge": "desc"
                }
            },
            "aggs": {
                "avgAge": {
                    "avg": {
                        "field": "age"
                    }
                }
            }
        }
    },
    "size": 0
}

筛选分组聚合
湖⼈和⽕箭队按球队平均年龄进⾏分组排序 (指定值列表)

POST /nba/_search
{
    "aggs": {
        "aggsTeamName": {
            "terms": {
                "field": "teamNameEn",
                "include": [
                    "Lakers",
                    "Rockets",
                    "Warriors"
                ],
                "exclude": [
                    "Warriors"
                ],
                "size": 30,
                "order": {
                    "avgAge": "desc"
                }
            },
            "aggs": {
                "avgAge": {
                    "avg": {
                        "field": "age"
                    }
                }
            }
        }
    },
    "size": 0
}

湖⼈和⽕箭队按球队平均年龄进⾏分组排序 (正则表达式匹配值)

POST /nba/_search
{
    "aggs": {
        "aggsTeamName": {
            "terms": {
                "field": "teamNameEn",
                "include": "Lakers|Ro.*|Warriors.*",
                "exclude": "Warriors",
                "size": 30,
                "order": {
                    "avgAge": "desc"
                }
            },
            "aggs": {
                "avgAge": {
                    "avg": {
                        "field": "age"
                    }
                }
            }
        }
    },
    "size": 0
}

Range Aggregation 范围分组聚合
NBA球员年龄按20,20-35,35这样分组

POST /nba/_search
{
    "aggs": {
        "ageRange": {
            "range": {
                "field": "age",
                "ranges": [
                    {
                        "to": 20
                    },
                    {
                        "from": 20,
                        "to": 35
                    },
                    {
                        "from": 35
                    }
                ]
            }
        }
    },
    "size": 0
}

NBA球员年龄按20,20-35,35这样分组 (起别名)

POST /nba/_search
{
    "aggs": {
        "ageRange": {
            "range": {
                "field": "age",
                "ranges": [
                    {
                        "to": 20,
                        "key": "A"
                    },
                    {
                        "from": 20,
                        "to": 35,
                        "key": "B"
                    },
                    {
                        "from": 35,
                        "key": "C"
                    }
                ]
            }
        }
    },
    "size": 0
}

Date Range Aggregation 时间范围分组聚合
NBA球员按出⽣年⽉分组

POST /nba/_search
{
    "aggs": {
        "birthDayRange": {
            "date_range": {
                "field": "birthDay",
                "format": "MM-yyy",
                "ranges": [
                    {
                        "to": "01-1989"
                    },
                    {
                        "from": "01-1989",
                        "to": "01-1999"
                    },
                    {
                        "from": "01-1999",
                        "to": "01-2009"
                    },
                    {
                        "from": "01-2009"
                    }
                ]
            }
        }
    },
    "size": 0
}

Date Histogram Aggregation 时间柱状图聚合
按天、⽉、年等进⾏聚合统计。可按 year (1y), quarter (1q), month (1M), week (1w), day(1d), hour (1h), minute (1m), second (1s) 间隔聚合

NBA球员按出⽣年分组

POST /nba/_search
{
    "aggs": {
        "birthday_aggs": {
            "date_histogram": {
                "field": "birthDay",
                "format": "yyyy",
                "interval": "year"
            }
        }
    },
    "size": 0
}

⾼亮查询

POST /nba_latest/_search
{
    "query": {
        "match": {
            "displayNameEn": "james"
        }
    },
    "highlight": {
        "fields": {
            "displayNameEn": {}
        }
    }
}

⾃定义⾼亮查询

POST /nba_latest/_search

{
    "query": {
        "match": {
            "displayNameEn": "james"
        }
    },
    "highlight": {
        "fields": {
            "displayNameEn": {
                "pre_tags": [
                    "<h1>"
                ],
                "post_tags": [
                    "</h1>"
                ]
            }
        }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值