八、ElasticSerach搜索
8.1、批量导入数据
ES提供了Bulk的API 来进行批量操作。
数据结构类型,以换行区分
// 必须有一个索引叫book
{"index": {"_index": "book", "_type": "_doc", "_id": 1}}
{"name": "权力的游戏"}
{"index": {"_index": "book", "_type": "_doc", "_id": 2}}
{"name": "疯狂的石头"}
// 结尾必须有换行
请求
curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' --data-binary @name
// name就是文件的路径和名字
测试查询
{
"query":{
"match_all":{}
},
"from": 0,
"size": 100
}
8.2、trem多种查询
单词级别查询
1、这些查询通常⽤于结构化的数据,比如:number、date、keyword等,而不是对text。
2、也就是说,全⽂本查询之前要先对⽂本内容进⾏分词,⽽单词级别的查询直接在相应字段的反向索引中精确查找,单词级别的查询⼀般⽤于数值、⽇期等类型的字段上
准备索引,进行批量导入,数据在player中
{
"mappings":{
"properties":{
"birthDay":{
"type":"date"
},
"birthDayStr": {
"type":"keyword"
},
"age":{
"type":"integer"
},
"code": {
"type":"text"
},
"country":{
"type":"text"
},
"display_affiliation":{
"type":"text"
},
"display_name": {
"type":"text"
},
"draft": {
"type":"long"
},
"height_value":{
"type":"float"
},
"jersey_no": {
"type":"text"
},
"play_year":{
"type":"long"
},
"player_id": {
"type":"keyword"
},
"position":{
"type":"text"
},
"school_type": {
"type":"text"
},
"team_conference": {
"type":"keyword"
},
"team_name": {
"type":"keyword"
},
"weight": {
"type":"text"
}
}
}
}
8.2.1、term query精准匹配查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"term": {
"jerse_no": 322
}
},
"from": 0,
"size": 100
}
响应
8.2.2、exsit query在特定的字段中查找非空值的文档POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
// 语义:查找team_name 不为空的数据
"query": {
"exists": {
"field": "team_name"
}
},
"from": 0,
"size": 3
}
响应
8.2.3、prefix query 查找包含带有指定前缀term的文档POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
// 语义:查找team_name 不为空的数据team_name必须为text类型
// 使用前缀类型必须为keyword,不能为text
"query": {
"prefix": {
"team_name": "逗比组"
}
},
"from": 0,
"size": 3
}
响应
8.2.4、wildcard query 支持通配符查询POST请求
*
表示任意字符,?
表示任意单个字符,类似SQL模糊查询
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"wildcard": {
"team_name": "*"
}
},
"from": 0,
"size": 3
}
响应(响应内容和其他一致)
8.2.5、ids query 通过id批量查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"ids": {
"values": [1,2,3]
}
},
"from": 0,
"size": 3
}
响应(响应内容和其他一致)
8.3、范围查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
// play_year为232-234之间的数据
"query": {
"range": {
"play_year":{ //play_year是Long类型 不要写成字符串
"gte": 232,
"lte" : 234
}
}
},
"from": 0,
"size": 3
}
响应
8.4、布尔查询
type | description |
must | 必须出现在匹配文档中 |
filter | 必须出现在文档中,但是不打分 |
must_not | 不能出现在文档中 |
should | 应该出现在文档中 |
8.4.1、must查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"bool": { // 布尔查询
"must":[ //匹配查询方式
{
"match": { // 全文搜索
"jerse_no": 322
}
}
]
}
},
"from": 0,
"size": 3
}
响应
8.4.2、filter查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"bool": {
"filter":[
{
"match": {
"jerse_no": 322
}
}
]
}
},
"from": 0,
"size": 3
}
响应
8.4.3、should第一种查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
// should应该但是不是必须
"query": {
"bool": {
"filter": [
{
"match": {
"name": "超级逗比"
}
}
],
"must_not": [
{
"term": {
"teamConferenceEn": {
"value": "233"
}
}
}
],
"should": [
{
"range": {
"play_year": {
"gte": 232,
"lte": 234
}
}
}
]
}
},
"from": 0,
"size": 3
}
响应
8.4.4、should第二种查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
// minimum_should_match=1最小匹配精度,至少有一个条件满足
"query": {
"bool": {
"filter":[
{
"match": {
"name": "超级逗比"
}
}
],
"must_not": [
{
"term": {
"teamConferenceEn": {
"value": 233
}
}
}
],
"should": [
{
"range": {
"play_year": {
"gte": 232,
"lte": 234
}
}
}
]
, "minimum_should_match": 1
}
},
"from": 0,
"size": 3
}
响应
8.5、排序查询
8.5.1、第一种排序查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"match": {
"team_name": "逗比组"
}
},
"sort": [
{
"play_year": {
"order": "desc"
}
}
],
"from": 0,
"size": 3
}
响应
8.5.2、第二种排序查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"match": {
"team_name": "逗比组"
}
},
"sort": [
{
"play_year": {
"order": "desc"
}
},
{
"heightValue": {
"order": "asc"
}
}
],
"from": 0,
"size": 3
}
响应
8.6、聚合查询指标聚合
聚合分析是数据库中重要的功能特性,完成对⼀个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最⼤值、最⼩值、计算和、平均值等。ES作为搜索引擎兼数据库,同样提供了强⼤的聚合分析能力。
对⼀个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合。而关系型数据库中除了有聚合函数外,还可以对查询出的数据行分组group by,再在组上进行指标聚合。在ES中称为桶聚合。
8.6.1、max、min、sum、avg指标聚合查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"term": {
"team_name": "逗比组"
}
},
"aggs": { // aggs 代表使用聚合函数
"avgAge": { // avgAge是自定义的,因为是查年年龄平均所以起名avgAge
"avg": { // avg 平均
"field": "age"
}
}
},
"from": 0,
"size": 3
}
响应(因为没有数据)
8.6.2、_count指标聚合查询(严格来说不属于聚合)POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"term": {
"team_name": "逗比组"
}
}
}
响应(因为没有数据)
8.6.3、cardinality指标聚合查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"term": {
"team_name": "逗比组"
}
},
"aggs": {
"countAge": { // 自定义名字
"cardinality": { // 去掉相同的只保留一个值
"field": "age"
}
}
},
"size": 0
}
响应
8.6.4、status种指标聚合查询POST请求
stats统计count、max、min、avg、sum共5个值
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"term": {
"team_name": "逗比组"
}
},
"aggs": {
"status": {
"stats": {
"field": "age"
}
}
},
"size": 0
}
响应
8.6.5、extended status种指标聚合查询POST请求
Extended stats比stats多4个统计结果:平⽅和、⽅差、标准差、平均值加减两个标准差的区间
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"term": {
"team_name": "逗比组"
}
},
"aggs": {
"extendedStatsAge": {
"extended_stats": {
"field": "age"
}
}
},
"size": 0
}
响应(因为没有数据)
8.7、聚合查询桶聚合
8.7.1、terms aggregation桶聚合查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"term": {
"team_name": "逗比组"
}
},
"aggs": {
"aggrAge": {
"terms": { // 因为根据年龄做桶聚合所以使用terms
"field": "age",
"size": 3 // 指定显示桶数
}
}
},
"size": 0
}
响应
8.7.2、order分组聚合查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"query": {
"term": {
"team_name": "逗比组"
}
},
"aggs": {
"aggrAge": {
"terms": {
"field": "age",
"size": 3,
"order": {
"_key": "desc"
}
}
}
},
"size": 0
}
响应
8.7.3、range aggregation范围分组聚合查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"aggs": {
"ageRange": {
"range": {
"field": "age",
"ranges": [
{
"to": 20, // 小于等于 20
"key": "A" //别名 A
},
{
"from": 20, // 大于等于20
"to": 35, // 小于等于 35
"key": "B" //别名 B
},
{
"from": 35, // 大于等于35
"key": "C" //别名 C
}
]
}
}
},
"size": 0
}
响应
8.7.4、date rabge aggregation时间范围分组聚合查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"aggs": {
"birthDayRange": {
"date_range": { // 时间类型
"field": "birthDay", // 生日,生日是时间类型
"format": "MM-yyy", //时间格式,月份年份
"ranges": [
{
"from": "01-1989" // 小于1989年1月出生
},
{
"from": "01-1989", // 1989年1月到1999年1月
"to": "01-1999"
},
{
"from": "01-1999", // 1999年1月到2009年1月
"to": "01-2009"
},
{
"from": "01-2009"
}
]
}
}
},
"size": 0
}
响应
8.7.5、date histogram aggregation时间范围分组聚合查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
"aggs": {
"birthday_aggs": {
"date_histogram": {
"field": "birthDay", //生日字段
"format": "yyyy", // 时间格式
"calendar_interval": "year" // 根据年
}
}
},
"size": 0
}
响应
8.8、query_string查询
8.8.1、query_string AND OR单字段查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
// 语义: 指定单个字段查询
"query": {
"query_string": {
"default_field": "team_name",
"query": "逗比组" // 这里可以使用or或and也就是sql里的or和and
}
},
"size": 3
}
响应
8.8.2、query_string AND OR多字段查询POST请求
请求
http://localhost:9200/malamala/_search
请求体
{
// 语义:指定多个字段查询
"query": {
"query_string": {
"fields": [ // 指定多个字段
"display_name",
"team_name"
],
"query": "*" // 查询条件
}
},
"size": 3
}
响应