使用kibana或postman操作Elasticsearch的高级搜索命令

原文地址:https://blog.csdn.net/qq_26230421/article/details/80366649

前言

运行系统:windows10

JDK版本:1.8

Elasticsearch版本:5.6.6

插件:kibana、elasticsearch-head

工具:postman

本文介绍高级搜索命令,建议首先参考简单的命令:点击打开链接

五、高级查询

高级查询有很多种,下面介绍常用的几种:

1. 精准查询(短语搜索)

与简单的查询 点击打开链接 里面的4.3的模糊查询(全文搜索)正好相反,这个是精确匹配

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "match_phrase": {

  5.       "name": "叶良辰"

  6.     }

  7.   }

  8. }

2. 多字段匹配查询

注意:这样的查询也是模糊查询,会把“叶良辰”拆分成“叶”、“良”和“辰”进行查询;并且在多个字段里查询!

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "multi_match": {

  5.       "query": "叶良辰",

  6.       "fields": ["name","desc"]

  7.     }

  8.   }

  9. }

3. 语法查询

注意:“叶良辰 AND 风”会先把“叶良辰”拆分成“叶”、“良”和“辰”,然后后面必须有“风”;

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "query_string": {

  5.       "query": "叶良辰 AND 风"

  6.     }

  7.   }

  8. }

下面的语法匹配,自行脑补

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "query_string": {

  5.       "query": "(叶良辰 AND 火) OR (赵日天 AND 风)",

  6.       "fields": ["name","desc"]

  7.     }

  8.   }

  9. }

4. 字段查询(结构化查询)

下面的是精准查询:

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "term": {

  5.       "name": "叶良辰"

  6.     }

  7.   }

  8. }

5. 分页查询

 
  1. GET /people/_search

  2. {

  3. "query": {

  4. "match_all": {}

  5. },

  6. "from": 1,

  7. "size": 1

  8. }

6. 范围查询

6.1 数字类型

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "range": {

  5.       "age": {

  6.         "gt": 16,

  7.         "lte": 30

  8.       }

  9.     }

  10.   }

  11. }

6.2 日期类型

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "range": {

  5.       "birthday": {

  6.         "gte": "2013-01-01",

  7.         "lte": "now"

  8.       }

  9.     }

  10.   }

  11. }

7. 过滤查询

两种方式:一种是通过constant_score:

 
  1. POST /people/man/_search

  2. {

  3. "query": {

  4. "constant_score": {

  5. "filter": {

  6. "range": {

  7. "age": {

  8. "gte": 20,

  9. "lte": 30

  10. }

  11. }

  12. },

  13. "boost": 1.2

  14. }

  15. }

  16. }

另一种是通过bool:

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "bool": {

  5.       "filter": {

  6.         "term": {

  7.           "age": 18

  8.         }

  9.       }

  10.     }

  11.   }

  12. }

8. 分数查询

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "constant_score": {

  5.       "filter": {

  6.         "match": {

  7.           "name": "叶良辰"

  8.         }

  9.       },

  10.       "boost": 2

  11.     }

  12.   }

  13. }

9. 布尔查询

注意:条件可以是数组[ ],也可以是单个条件{ }

9.1 should查询

注意:should相当于 或 ,里面的match也是模糊匹配

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "bool": {

  5.       "should": [

  6.         {

  7.           "match": {

  8.             "name": "叶良辰"

  9.           }

  10.         },

  11.         {

  12.           "match": {

  13.             "desc": "赵日天"

  14.           }

  15.         }

  16.       ]

  17.     }

  18.   }

  19. }

9.2 must查询

注意:两个条件都要满足,并且这里也会把must里面的“叶良辰”拆分成“叶”、“良”和“辰”进行查询;“赵日天”拆分成“赵”、“日”、和“天”!

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "bool": {

  5.       "must": [

  6.         {

  7.           "match": {

  8.             "name": "叶良辰"

  9.           }

  10.         },

  11.         {

  12.           "match": {

  13.             "desc": "赵日天"

  14.           }

  15.         }

  16.       ]

  17.     }

  18.   }

  19. }

9.3 must与filter相结合

这里也会把must里面的“叶良辰”拆分成“叶”、“良”和“辰”进行查询

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "bool": {

  5.       "must": [

  6.         {

  7.           "match": {

  8.             "name": "叶良辰"

  9.           }

  10.         },

  11.         {

  12.           "match": {

  13.             "desc": "赵日天"

  14.           }

  15.         }

  16.       ],

  17.       "filter": [

  18.         {

  19.           "term": {

  20.             "age": 18

  21.           }

  22.         }

  23.       ]

  24.     }

  25.   }

  26. }

9.4 must_not

注意:下面语句是精准匹配

 
  1. POST /people/_search

  2. {

  3.   "query": {

  4.     "bool": {

  5.       "must_not": {

  6.         "term": {

  7.           "name": "叶良辰"

  8.         }

  9.       }

  10.     }

  11.   }

  12. }

10. 高亮查询

10.1 默认标签<em>

 
  1. GET people/_search

  2. {

  3. "query": {

  4. "match": {

  5. "name": "叶良辰"

  6. }

  7. },

  8. "highlight": {

  9. "fields": {

  10. "name": {}

  11. }

  12. }

  13. }

查询结果中会有<em>标签标识,可以结合上面的查询方式查看

10.2 指定标签

设置pre_tagspost_tags的属性

 
  1. GET people/_search

  2. {

  3. "query": {

  4. "match": {

  5. "name": "叶良辰"

  6. }

  7. },

  8. "highlight": {

  9. "pre_tags": ["<b>"],

  10. "post_tags": ["</b>"],

  11. "fields": {

  12. "name": {}

  13. }

  14. }

  15. }

11 聚合查询

11.1 根据字段类型查询

 
  1. GET /people/man/_search

  2. {

  3. "size": 0,

  4. "aggs": {

  5. "group_by_age": {

  6. "terms": {

  7. "field": "age"

  8. }

  9. }

  10. }

  11. }

 

11.2 查询总体值

 
  1. POST /people/_search

  2. {

  3.   "aggs": {

  4.     "grads_age": {

  5.       "stats": {

  6.         "field": "age"

  7.       }

  8.     }

  9.   }

  10. }

11.3 查询最小值

 
  1. POST /people/_search

  2. {

  3.   "aggs": {

  4.     "grads_age": {

  5.       "min": {

  6.         "field": "age"

  7.       }

  8.     }

  9.   }

  10. }

11.4 先分组后计算

根据国家分组,然后计算年龄平均值:

 
  1. GET /people/man/_search

  2. {

  3. "size": 0,

  4. "aggs": {

  5. "group_by_age": {

  6. "terms": {

  7. "field": "country"

  8. },

  9. "aggs": {

  10. "avg_age": {

  11. "avg": {

  12. "field": "age"

  13. }

  14. }

  15. }

  16. }

  17. }

  18. }

执行之后,发现报错:

解决:上面的reason里面说的很清楚,将fielddata设置为true就行了:

 
  1. POST /people/_mapping/man

  2. {

  3. "properties": {

  4. "country": {

  5. "type": "text",

  6. "fielddata": true

  7. }

  8. }

  9. }

然后重新执行命令,得到下面的结果:

12.排序查询

排序查询通常没有排到我们想要的结果,因为字段分词后,有很多单词,再排序跟我们想要的结果又出入

解决办法:把需要排序的字段建立两次索引,一个排序,另一个不排序。

如下面的案例:把title.raw的fielddata设置为true,是排序的;而title的fielddata默认是false,可以用来搜索

index: true 是在title.raw建立索引可以被搜索到,

fielddata: true是让其可以排序

 
  1. PUT /blog

  2. {

  3. "mappings": {

  4. "article": {

  5. "properties": {

  6. "auther": {

  7. "type": "text"

  8. },

  9. "title": {

  10. "type": "text",

  11. "fields": {

  12. "raw":{

  13. "type": "text",

  14. "index": true,

  15. "fielddata": true

  16. }

  17. }

  18. },

  19. "content":{

  20. "type": "text",

  21. "analyzer": "english"

  22. },

  23. "publishdate": {

  24. "type": "date"

  25. }

  26. }

  27. }

  28. }

  29. }

对应的搜索命令:

 
  1. GET /blog/article/_search

  2. {

  3. "query": {

  4. "match_all": {}

  5. },

  6. "sort": [

  7. {

  8. "title.raw": {

  9. "order": "desc"

  10. }

  11. }

  12. ]

  13. }

13 scroll查询

当搜索量比较大的时候,我们在短时间内不可能一次性搜索完然后展示出来

这个时候,可以使用scroll进行搜索

比如下面的案例,可以先搜索3条数据,然后结果中会有一个_scroll_id,下次搜索就可以直接用这个_scroll_id进行搜索了:

step1 搜索:

 
  1. GET test_index/test_type/_search?scroll=1m

  2. {

  3.   "query": {

  4.     "match_all": {}

  5.   },

  6.   "sort": "_doc", 

  7.   "size": 3

  8. }

step2 复制结果中的_scroll_id:

step3 把scroll_id粘贴到下面的命令中再次搜索

 
  1. GET _search/scroll

  2. {

  3. "scroll": "1m",

  4. "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAA6FnZPSl9sbVR4UVVDU1NLb2wxVXJlbWcAAAAAAAAAPhZ2T0pfbG1UeFFVQ1NTS29sMVVyZW1nAAAAAAAAADsWdk9KX2xtVHhRVUNTU0tvbDFVcmVtZwAAAAAAAAA8FnZPSl9sbVR4UVVDU1NLb2wxVXJlbWcAAAAAAAAAPRZ2T0pfbG1UeFFVQ1NTS29sMVVyZW1n"

  5. }

后面的操作重复step3就OK了!

14 分词查询

14.1 随便写一个句子进行分词

 
  1. GET _analyze

  2. {

  3. "analyzer": "standard",

  4. "text": "this is a test for analyzer"

  5. }

14.2 自定义分词器

char_filter是映射字符过滤器,该例子是把&符号转化为and

filter中使用停止词过滤器,移除自定义的停止词列表中包含的词

 
  1. PUT /my_index

  2. {

  3. "settings": {

  4. "analysis": {

  5. "char_filter": {

  6. "&_to_and": {

  7. "type": "mapping",

  8. "mappings": ["&=> and "]

  9. }

  10. },

  11. "filter": {

  12. "my_stopwords": {

  13. "type": "stop",

  14. "stopwords": ["the","a"]

  15. }

  16. },

  17. "analyzer": {

  18. "my_analyzer": {

  19. "type": "custom",

  20. "char_filter": ["html_strip","&_to_and"],

  21. "tokenizer": "standard",

  22. "filter": ["lowercase","my_stopwords"]

  23. }

  24. }

  25. }

  26. }

  27. }

然后就可以使用下列命令来测试该分词器:

 
  1. GET my_index/_analyze

  2. {

  3. "analyzer": "my_analyzer",

  4. "text": "Tom&Jerry are the best friends"

  5. }

结果:大写转为了小写;&转为了and;the已经被去掉

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Postman是一款非常强大的API测试工具,除了基本的请求发送和响应查看外,还有很多高级功能可以提高测试效率和准确性。以下是一些Postman高级使用教程: 1. 变量和环境:使用变量和环境可以方便地管理测试数据和配置,避免重复输入和修改。可以在请求中使用{{variable}}的形式引用变量,也可以在环境中定义全局变量和环境变量。在测试集合中可以切换不同的环境,以便在不同的环境中运行测试。 2. 脚本:Postman支持JavaScript脚本,可以在请求前、请求后、测试前、测试后等不同的阶段执行脚本。脚本可以用来生成动态数据、处理响应结果、验证测试结果等。可以在请求或测试的“Tests”选项卡中编写脚本。 3. 数据驱动测试:使用CSV或JSON文件可以实现数据驱动测试,即在同一个请求中多次执行相同的操作,但使用不同的数据。可以在请求的“Pre-request Script”选项卡中读取数据文件,并将数据保存为变量,然后在请求中使用变量。 4. Mock服务:Mock服务可以模拟API的响应,以便在API尚未实现或不可用时进行测试。可以在Postman中创建Mock服务,并设置Mock响应的结构和内容。Mock服务可以在Postman中直接测试,也可以通过URL共享给其他人使用。 5. 自动化测试:Postman支持自动化测试,可以使用第三方工具(如Newman)在命令行中运行Postman测试集合,并生成测试报告。可以将自动化测试集成到CI/CD流程中,以便在每次代码提交后自动运行测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值