当前位置:   article > 正文

ElasticSearch常用查询操作_es查询

es查询

ES查询

     一般我们使用ES最多的就是查询,今天就讲一下ES的查询。这里我是建了一个person的索引。

  1. "person" : {
  2. "aliases" : { },
  3. "mappings" : {
  4. "properties" : {
  5. "address" : {
  6. "type" : "text",
  7. "fields" : {
  8. "keyword" : {
  9. "type" : "keyword",
  10. "ignore_above" : 256
  11. }
  12. }
  13. },
  14. "age" : {
  15. "type" : "long"
  16. },
  17. "name" : {
  18. "type" : "text",
  19. "fields" : {
  20. "keyword" : {
  21. "type" : "keyword",
  22. "ignore_above" : 256
  23. }
  24. }
  25. }
  26. }
  27. }

基本查询操作

1.查询所有数据并进行排序

  1. GET person/_search
  2. {
  3. "query":{
  4. "match_all": {}
  5. },
  6. "sort":{
  7. "age":"desc"
  8. }
  9. }

说明:这里是一个GET请求,person代表索引,_search表示搜索(固定写法)。

"query"表示查询。“match_all”表示查询所有。后面的sort就表示要对查询结果进行排序。age 表示要排序的字段。而desc表示降序排序。asc升序排序。

 结果说明:took表示查询花费时间(ms),_shards分片信息。搜索了多少个分片。hits查询结果,tatoal.value搜索到了几个文档。

2.分页查询

主要就是用到一个from(第几页),size(每页大小)。

  1. GET person/_search
  2. {
  3. "query":{
  4. "match_all": {}
  5. },
  6. "sort":{
  7. "age":"desc"
  8. },
  9. "from":1,
  10. "size":1
  11. }

3.查询段落匹配

比如我们想查某个字段里面包好了某个字符串的话,就可以使用这种查询。比如我想查地址里面包含疾风的数据。

  1. GET person/_search
  2. {
  3. "query":{
  4. "match_phrase": {
  5. "address": "疾风"
  6. }
  7. }
  8. }

 

复合查询 

1.多条件bool查询

通过布尔将较小的查询组合成大的查询。

如果存在多个查询条件就需要用到这种查询。比如我要查年龄为23岁,并且地址不在海南的人。这里查询注意格式,方括号大括号不能少,这是我觉得比较难受的一个点。

  1. GET person/_search
  2. {
  3. "query":{
  4. "bool":{
  5. "must":[
  6. {"match":{"age":"23"}}
  7. ],
  8. "must_not": [
  9. {"match": {
  10. "address": "海南"
  11. }}
  12. ]
  13. }
  14. }
  15. }

bool表示这是一个布尔查询,must和must_not表示必须满足和不满足,而里面的就是条件,必须匹配条件为年龄23,且地址不为海南的人。

特点:

  • 子查询可以任意顺序出现。

  • 可以嵌套多个查询,包括布尔查询

除了上面的must和must_not,还有should(选择性匹配至少满足一条),filter过滤,必须匹配。

全文搜索

1.Match类型

使用match全文搜索

  1. GET person/_search
  2. {
  3. "query": {
  4. "match": {
  5. "name": "冯"
  6. }
  7. }
  8. }

这个查询首先回去判断name是text类型,text类型是会被分词的,那么查询字符串本身也会被分词。然后查询字符串会被传入标准分析器中,因为自由一个字所以这个查询的底层是单个的term查询。term查询会计算每个文档的相关度评分_score,如果是多个汉字是怎样?

  1. GET person/_search
  2. {
  3. "query": {
  4. "match": {
  5. "name": "老板"
  6. }
  7. }
  8. }

 结果:

这里我并没有安装新的分词器,默认是一个汉字分成一个词。他可以等同如下查询:

 

他等同于should的两个term查询,只要满足任意一个就可以。其实match还有一个operator参数,默认是or,所以should也能查询出来,如果改成and就是需要同时满足.

 等同于:

2.quert string类型

首先看例子

  1. GET person/_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "default_field": "address",
  6. "query": " 疾风 OR 达州"
  7. }
  8. }
  9. }

 

        

  1. GET person/_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "default_field": "address",
  6. "query": "疾风 AND 归途"
  7. }
  8. }
  9. }

 

上面两个查询仔细看很容易理解,query_string查询就是 根据运算符(and 或者 or)来解析和拆分字符串。然后查询在返回匹配的文档前独立分析每个拆分的文本。

除了这些查询外还有许多其他查询方式,这里这是讲了一种,以后再使用其他的时候可以对照理解。

term查询

1.基于单词的查询,基于id查询。

  1. GET person/_search
  2. {
  3. "query": {
  4. "ids":{
  5. "values":[1,2,3]
  6. }
  7. }
  8. }

2.通过前缀查询

  1. GET person/_search
  2. {
  3. "query": {
  4. "prefix": {
  5. "name": {
  6. "value": "冯"
  7. }
  8. }
  9. }
  10. }

3.分词匹配查询

  1. GET person/_search
  2. {
  3. "query": {
  4. "term": {
  5. "name": {
  6. "value": "老"
  7. }
  8. }
  9. }
  10. }

 

多个分词匹配

这里我之前在项目代码里面遇到过,查询对接人通过职位编码来进行匹配,利用了这种查询。还是比较多用的

  1. GET person/_search
  2. {
  3. "query": {
  4. "terms": {
  5. "name": [
  6. "冯",
  7. "陈"
  8. ]
  9. }
  10. }
  11. }

 

4.通配符:wildcard

  1. GET person/_search
  2. {
  3. "query": {
  4. "wildcard": {
  5. "name": {
  6. "value": "冯*"
  7. }
  8. }
  9. }
  10. }

 范围查询

  1. GET person/_search
  2. {
  3. "query": {
  4. "range": {
  5. "age": {
  6. "gte": 20,
  7. "lte": 30
  8. }
  9. }
  10. }
  11. }

5.正则:regexp

  1. get person/_search
  2. {
  3. "query":{
  4. "regexp": {
  5. "name": "冯*"
  6. }
  7. }
  8. }

6.模糊匹配:fuzzy

  1. get person/_search
  2. {
  3. "query":{
  4. "fuzzy": {
  5. "address": {
  6. "value": "疾"
  7. }
  8. }
  9. }
  10. }

聚合查询

聚合查询就是类似我们在SQL中的group by。聚合查询中有两个概念,一个是桶:满足特定条件的文档的集合。还有一个是指标:就是对桶内的文档进行统计计算。所以在ES里面有三种聚合方式:

1.桶聚合

2.指标聚合

3.管道聚合

首先准备一批数据:

  1. POST /test-agg-cars/_bulk
  2. { "index": {}}
  3. { "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
  4. { "index": {}}
  5. { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
  6. { "index": {}}
  7. { "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
  8. { "index": {}}
  9. { "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
  10. { "index": {}}
  11. { "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
  12. { "index": {}}
  13. { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
  14. { "index": {}}
  15. { "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
  16. { "index": {}}
  17. { "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }

1.标准聚合

比如说我们想得到每个颜色的销量

  1. GET test-agg-cars/_search
  2. {
  3. "size":0, //siz指定为0,hits不会返回搜索结果
  4. "aggs": { //聚合查询
  5. "pop_colors": { //为聚合查询的结果指定一个想要的名称
  6. "terms": { //定义桶的类型为terms(桶:满足特定条件的文档集合)
  7. "field": "color.keyword" //每个桶的key都与color字段里找到的唯一词对应
  8. }
  9. }
  10. }
  11. }

查询结果:

doc_count告诉我们每个包含该词项的文档数量。

2.多个聚合

计算两种桶的结果

  1. GET /test-agg-cars/_search
  2. {
  3. "size": 0,
  4. "aggs":{
  5. "pop_colors":{
  6. "terms": {
  7. "field": "color.keyword"
  8. }
  9. },
  10. "make_by":{
  11. "terms": {
  12. "field": "make.keyword"
  13. }
  14. }
  15. }
  16. }

 查询结果

3.聚合嵌套

比如我们要查询每种颜色的平均价格,首先使用聚合查询每种颜色,然后再嵌套一个聚合查询每种颜色的平均价格。

  1. GET test-agg-cars/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "colors": {
  6. "terms": {
  7. "field": "color.keyword"
  8. },
  9. "aggs":{
  10. "avg_price":{
  11. "avg": {
  12. "field": "price"
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }

查询结果:

 4.前置过滤条件:filter

比如我们只想查某一个类型的平均价格,可以先使用filter过滤出来,然后再使用一个嵌套聚合计算平均价格。

  1. GET test-agg-cars/_search
  2. {
  3. "size": 0,
  4. "aggs":{
  5. "make_by":{
  6. "filter": {
  7. "term": {
  8. "make": "honda"
  9. }
  10. },
  11. "aggs": {
  12. "avg_price": {
  13. "avg": {
  14. "field": "price"
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }

查询结果:

 5.对number类型聚合:range

查询某一个范围。

  1. {
  2. "size":0,
  3. "aggs": {
  4. "price_ranges": {
  5. "range": {
  6. "field": "price",
  7. "ranges": [
  8. {
  9. "from": 10000,
  10. "to": 15000
  11. }
  12. ]
  13. }
  14. }
  15. }
  16. }

结果:

 6.对日期类型聚合

我觉得这种聚合查询应用的场景会比较多。查询某个时间范围内的数据。

  1. GET test-agg-cars/_search
  2. {
  3. "size":0,
  4. "aggs": {
  5. "range": {
  6. "date_range": {
  7. "field": "sold",
  8. "ranges": [
  9. {
  10. "from": "2014-10-28",
  11. "to": "2014-11-05"
  12. }
  13. ]
  14. }
  15. }
  16. }
  17. }

结果:

 

聚合查询之metric聚合

metric聚合从分类上来看,可以分为单值分析和多值分析。

  • 单值分析就是只输出一个分析结果,标准的stat型。

1.avg 平均值

2.max 最大值

3.min 最小值

4.sum 和

5.value_count 数量

其他类型 cardinality记述(distinct去重),weighted_avg 带权重的avg。。。

  • 多值分析

    省略,因为我觉得不是很常用,到时候会查文档就行。

单值分析

avg平均值:计算平均值

  1. GET person/_search
  2. {
  3. "size": 0,
  4. "aggs":{
  5.   "avg_age":{
  6.     "avg": {
  7.       "field": "age"
  8.     }
  9.   }
  10. }
  11. }
  12. //返回结果
  13. "aggregations" : {
  14.   "avg_age" : {
  15.     "value" : 30.857142857142858
  16.   }
  17. }

max最大值:

  1. GET person/_search
  2. {
  3. "size":0,
  4. "aggs": {
  5.   "max_age": {
  6.     "max": {
  7.       "field": "age"
  8.     }
  9.   }
  10. }
  11. }
  12. //返回结果
  13. "aggregations" : {
  14.   "max_age" : {
  15.     "value" : 40.0
  16. }

min最小值:与最大值类似

sum求和:

  1. GET person/_search
  2. {
  3. "size":0,
  4. "aggs": {
  5.   "sum_age": {
  6.     "sum": {
  7.       "field": "age"
  8.     }
  9.   }
  10. }
  11. }
  12. //返回结果
  13. "aggregations" : {
  14.   "sum_age" : {
  15.     "value" : 216.0
  16.   }
  17. }

Value_count数量

  1. GET person/_search?size=0
  2. {
  3. "aggs": {
  4.   "name_count": {
  5.     "value_count": {
  6.       "field": "age"
  7.     }
  8.   }
  9. }
  10. }
  11. //返回结果
  12. "aggregations" : {
  13.   "sum_age" : {
  14.     "value" : 216.0
  15.   }
  16. }

 目前就简单介绍了这些查询,其实在es官网可以看到很多不同的查询,包括管道啥之类的,但是我们以后使用的时候要知道大致的查询分为哪几类,然后每种查询得能在官网快速定位,然后通过例子学会使用并理解。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/365243
推荐阅读
相关标签
  

闽ICP备14008679号