栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ES-05-ElasticSearch高级查询

ES-05-ElasticSearch高级查询

说明

ElasticSearch的高级查询之条件查询、全量查询、排序、分页、范围查询、全文检索、完全匹配、内容高亮、聚合查询既然是查询,那么统一GET请求方式官方文档:https://www.elastic.co/cn/本案例只是列出了一些比较常用的查询操作,更详细的聚合查询请参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.9/index.html(包含所有支持的聚合查询方式,绝对够喝一壶了~)

主要都在:Search your data和Aggregations两个章节中。 常用操作 》纯URL方式

请求格式:/<索引名称>/_searcn?q=<字段名>:<字段值>

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search?q=name:张三

响应结果:

{
	...
	"hits": {
		...
		"hits": [
			{
				"_index": "index001",
				"_type": "_doc",
				"_id": "tJcja34BW7FmJcLFEhTd",
				"_score": 0.5753642,
				"_source": {
					"id": 1001,
					"name": "张三",
					"age": 18
				}
			}
		]
	}
}
》请求体body方式

统一请求格式:/<索引名称>/_searcn 》》match(条件查询)

match关键字模糊匹配某一个字段

match是全文检索,默认模糊匹配该字段包含目标值中的一个或多个词的结果,会进行分词匹配

使用场景:比如可以查询名字包含张三的数据

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "query": {
        "match": {
            "name": "张三"
        }
    }
}'

响应结果:

{
	...
	"hits": {
		...
		"hits": [
			{
				"_index": "index001",
				"_type": "_doc",
				"_id": "1001",
				"_score": 1.9616582,
				"_source": {
					"id": 1001,
					"name": "张三",
					"age": 18
				}
			}
		]
	}
}
》》match_all(全量查询)

match_all关键字匹配索引下所有文档

一般不会直接这么使用,需要配合分页等使用

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "query": {
        "match_all": {}
    }
}'

响应结果:略

》》from&size(分页)

from&size实现分页

from:从第几条开始取数据

size:取几条数据

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "query": {
        "match_all": {}
    },
    "from": 0,
    "size": 2
}'

响应结果:略

》》_source(返回字段过滤)

_source关键字接收一个数组,传入需要返回的字段名列表

使用场景:只需要返回结果中的”name“字段,其他字段不需要

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "query": {
        "match_all": {}
    },
    "from": 0,
    "size": 2,
    "_source": [
        "name"
    ]
}'

响应结果:

{
    ...
    "hits": {
        ...
        "hits": [
            {
                "_index": "index001",
                "_type": "_doc",
                "_id": "1002",
                "_score": 1.0,
                "_source": {
                    "name": "李四"
                }
            },
            {
                "_index": "index001",
                "_type": "_doc",
                "_id": "1001",
                "_score": 1.0,
                "_source": {
                    "name": "张三"
                }
            }
        ]
    }
}
》》sort(排序)

sort关键字会按照给定的规则对结果进行排序后返回

使用场景:排序规则:请按照用户的age倒序返回数据

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "query": {
        "match_all": {}
    },
    "from": 0,
    "size": 2,
    "sort": {
        "age": {
            "order": "desc"
        }
    }
}'

响应结果:

{
  ...
  "hits": {
    ...
    "hits": [
      {
        "_index": "index001",
        "_type": "_doc",
        "_id": "1003",
        "_score": null,
        "_source": {
          "id": 1003,
          "name": "王五",
          "age": 20
        },
        "sort": [
          20
        ]
      },
      {
        "_index": "index001",
        "_type": "_doc",
        "_id": "1002",
        "_score": null,
        "_source": {
          "id": 1002,
          "name": "李四",
          "age": 19
        },
        "sort": [
          19
        ]
      }
    ]
  }
}
》》bool(多条件查询)

bool+must+match:多个条件必须同时满足(相当于:&&)

使用场景:匹配名字为张三并且年龄为18的数据

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "name": "张三"
                    }
                },
                {
                    "match": {
                        "age": "18"
                    }
                }
            ]
        }
    }
}'

响应结果:略

bool+should+match:多个条件至少有一个满足(相当于||)

使用场景:匹配名字为张三或者年龄为19的数据

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "name": "张三"
                    }
                },
                {
                    "match": {
                        "age": "19"
                    }
                }
            ]
        }
    }
}'

响应结果:略

bool+filter+range:某个值的范围查询,也就是大于或者小于等条件

使用场景:匹配年龄大于等于19并且小于20的数据

请求示例

请求方式:GET

发送请求(写法一):

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "query": {
        "bool": {
            "filter": {
                "range": {
                    "age": {
                        "gte": 19,
                        "lt": 20
                    }
                }
            }
        }
    }
}'

发送请求(写法二):

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "query": {
        "bool": {
            "filter": [
                {
                    "range": {
                        "age": {
                            "gte": 19
                        }
                    }
                },
                {
                    "range": {
                        "age": {
                            "lt": 20
                        }
                    }
                }
            ]
        }
    }
}'

响应结果:

{
	...
	"hits": {
		...
		"hits": [
			{
				"_index": "index001",
				"_type": "_doc",
				"_id": "1002",
				"_score": 0.0,
				"_source": {
					"id": 1002,
					"name": "李四",
					"age": 19
				}
			}
		]
	}
}
》》match_phrase(完全匹配)

match_phrase关键字精确匹配某一个字段

match_phrase是完全匹配,默认精确匹配该字段等于目标值的结果,不会进行分词匹配

使用场景:比如可以查询名字等于张三的数据

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "query": {
        "match_phrase": {
            "name": "张三"
        }
    }
}'

响应结果:

{
	...
	"hits": {
		...
		"hits": [
			{
				"_index": "index001",
				"_type": "_doc",
				"_id": "1001",
				"_score": 1.9616582,
				"_source": {
					"id": 1001,
					"name": "张三",
					"age": 18
				}
			}
		]
	}
}
》》 highlight(内容高亮)

highlight关键字会对指定的字段加入特定标签从而实现高亮显示

使用场景:对匹配到的数据中的name字段高亮显示

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "query": {
        "match_phrase": {
            "name": "张三"
        }
    },
    "highlight": {
        "fields": {
            "name": {}
        }
    }
}'

响应结果:

{
	...
	"hits": {
		...
		"hits": [
			{
				"_index": "index001",
				"_type": "_doc",
				"_id": "1001",
				"_score": 1.9616582,
				"_source": {
					"id": 1001,
					"name": "张三",
					"age": 18
				},
				"highlight": {
					"name": [
						""
					]
				}
			}
		]
	}
}
》》aggs(聚合查询)

aggs+terms:分组查询某字段值出现的次数(类似于MySQL的count+groupby)

使用场景:比如统计各个年龄的人数

注意:聚合查询除了返回统计结果,还会返回所有命中的原始数据hits,这个往往是不需要的,可以通过给定size=0取消返回原始数据

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "aggs": {
        "my_group": {
            "terms": {
                "field": "age"
            }
        }
    },
    "size": 0
}'

my_group说明:自定义返回数据的键,随意即可

响应结果:

{
    ...
    "hits": {
        ...
        "hits": []
    },
    "aggregations": {
        "my_group": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": 18,
                    "doc_count": 1
                },
                {
                    "key": 19,
                    "doc_count": 1
                },
                {
                    "key": 20,
                    "doc_count": 1
                }
            ]
        }
    }
}

aggs+max/min/avg/sum/stats:求某字段的最大值/最小值/平均值/求和/统计

使用场景:比如统计年龄的个数、最小值、最大值、平局值、和

注意:聚合查询除了返回统计结果,还会返回所有命中的原始数据hits,这个往往是不需要的,可以通过给定size=0取消返回原始数据

请求示例

请求方式:GET

发送请求:

curl -X GET http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d '
{
    "aggs": {
        "my_stats": {
            "stats": {
                "field": "age"
            }
        }
    },
    "size": 0
}'

my_avg说明:自定义返回数据的键,随意即可

响应结果:

{
    ...
    "hits": {
        ...
        "hits": []
    },
    "aggregations": {
        "my_stats": {
            "count": 3,
            "min": 18.0,
            "max": 20.0,
            "avg": 19.0,
            "sum": 57.0
        }
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/748364.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号