当前位置:   article > 正文

elasticsearch7常见查询(term、match、bool、filter、match)_elasticsearch term

elasticsearch term

一、精准查询term

term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇

1、term单值

字段只有一个值时候,用term关键词查询

查询biz_id值为1909190023901225的记录

  1. curl -XGET http://192.168.1.73:9200/xyerp/order/_search -H 'Content-Type: application/json' -d '
  2. {
  3. "query": {
  4. "term": {
  5. "biz_id": "1909190023901225"
  6. }
  7. }
  8. }

进一步优化查询,因为是精准查询,不需要查询进行评分计算,只希望对文档进行包括或排除的计算,所以我们会使用 constant_score 查询以非评分模式来执行 term 查询并以一作为统一评分。推荐如下查询

  1. {
  2. "query" : {
  3. "constant_score" : {
  4. "filter" : {
  5. "term" : {
  6. "biz_id" : "1909190023901225"
  7. }
  8. }
  9. }
  10. }
  11. }'

2、terms多值

字段有一多个值时候,用terms关键词查询,后跟数组

  1. {
  2. "query":{
  3. "terms":{
  4. "biz_id":["1909190023901225"]
  5. }
  6. }
  7. }'

 constant_score 以非评分模式查询,推荐如下查询

  1. {
  2. "query" : {
  3. "constant_score" : {
  4. "filter" : {
  5. "terms" : {
  6. "biz_id" : ["1909190023901225","e1909190111365113"]
  7. }
  8. }
  9. }
  10. }
  11. }'

3、term多个字段

  1. {
  2. "query": [{
  3. "term": {
  4. "biz_id": "1909190023901225"
  5. }
  6. }, {
  7. "term": {
  8. "name": "zhangsan"
  9. }
  10. }]
  11. }

 二、匹配查询match

match和term的区别是,match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析的过程,match查询相当于模糊匹配,只包含其中一部分关键词就行

同时还要注意match系列匹配时,datatype要设置为text,否则不会开启分词

1、match

进行full text search或者exact value(非string字段或not_analyzed的字段),进行匹配,会对要查询的内容按照某种规则进行分词。

如es中存的merchant_id的值为"2500,2501,2502",按照逗号分词。match匹配时查询参数值param="2500,2502",会对param进行分词,分为2500和2502,对merchant_id的值进行匹配,默认是是or,即或者的关系,匹配任意一个分词,就返回数据结果

  1. {
  2. "query": {
  3. "match": {
  4. "merchant_id": "2500,2502"
  5. }
  6. },
  7. "sort": [
  8. {
  9. "trade_finished_time": {
  10. "order": "desc"
  11. }
  12. }
  13. ]
  14. }'

2、match_all

{ "match_all": {}} 匹配所有的, 当不给查询条件时,默认全查,匹配所有字段。

  1. {
  2. "query": {
  3. "match_all": {}
  4. }
  5. }

3、multi_match

同时对查询的关键词,多个字段同时进行匹配,只要其中一个字段匹配到值就返回结果

只要查询的字段merchant_id,_id字段值中任何一个包含2501,就返回对应结果

  1. {
  2. "query":{
  3. "multi_match":{
  4. "query":"2501",
  5. "fields":["merchant_id","_id"]
  6. }
  7. }
  8. }

 同时field还支持更为丰富的查询

在在fields中,按brandName(品牌名)、sortName(分类名)、productName(商品名)productKeyword(商品关键字),搜索“牛仔 弹力”关键词,brandName源值、拼音值、关键字值都是100分,sortName源值、拼音值80分,productName源值60分,productKeyword值20分,分值由高到低优先级搜索

  1. {
  2. "query": {
  3. "multi_match": {
  4. "query": "牛仔 弹力",
  5. "fields": [
  6. "brandName^100",
  7. "brandName.brandName_pinyin^100",
  8. "brandName.brandName_keyword^100",
  9. "sortName^80",
  10. "sortName.sortName_pinyin^80",
  11. "productName^60",
  12. "productKeyword^20"
  13. ],
  14. "type": <multi-match-type>,
  15. "operator": "AND"
  16. }
  17. }
  18. }

4、match_phrase

 match_phrase查询分析文本,并从分析文本中创建短语查询。
类似 match 查询, match_phrase 查询首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索,但只保留那些包含全部搜索词项,且位置与搜索词项相同的文档。

即对给定的短语完整查询匹配,搜索到的结果集都必须包含给定的查询词组

如下,查询 quick brown、quick brown fox、 brown fox可以查询到,quick fox 查询不到

  1. {
  2. "query": {
  3. "match_phrase": {
  4. "title": "quick brown fox"
  5. }
  6. }
  7. }

 如下, 查询 a,b,a和b之间隔3个字符可以查询到,隔不是3个查询不到 

  1. {
  2. "query":{
  3. "match_phrase" :{
  4. "query":"a,b",
  5. "slop":3
  6. }
  7. }
  8. }

5、match_phrase_prefix

左前缀匹配,类似sql中的 like 'zhang%'

如查询姓张的同学有哪些,zhang san,zhang san feng,都能返回结果集

  1. {
  2. "query": {
  3. "match_phrase_prefix": {
  4. "name": "zhang"
  5. }
  6. }
  7. }

 6、wildcard模糊查询

?(只一个)、*(可多个)匹配任意字符,不用于match分词要求的text,这里模糊的字段类型需要是keyword。类似于SQL LIKE,通配符性能自然也会差一些

如下:模糊匹配包含“海淀”的学校名字

  1. {
  2. "size": 20,
  3. "from": 0,
  4. "query": {
  5. "bool": {
  6. "must": [
  7. {
  8. "wildcard": {
  9. "school_name": "*海淀*"
  10. }
  11. }
  12. ]
  13. }
  14. }
  15. }

三、bool查询

bool查询包含四种操作符,分别是must,should,must_not,filter。它们均是一种数组,数组里面是对应的判断条件

must: 必须匹配,与and等价。贡献算分

must_not:必须不匹配,与not等价,常过滤子句用,但不贡献算分

should: 选择性匹配,至少满足一条,与 OR 等价。贡献算分

filter: 过滤子句,必须匹配,但不贡献算分

需要注意的是must与should同时使用时候,不可平级出现,必须是一个嵌套在另一个其中

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [{
  5. "term": {
  6. "merchant_id": 100
  7. }
  8. },
  9. {
  10. "bool": {
  11. "should": [{
  12. "term": {
  13. "creator": "zhangsan"
  14. }
  15. }, {
  16. "term": {
  17. "id": 40
  18. }
  19. }]
  20. }
  21. }
  22. ],
  23. "filter": {
  24. "term": {
  25. "trade_type": 2
  26. }
  27. }
  28. }
  29. }
  30. }

 四、filter查询

过滤器,会查询对结果进行缓存,不会计算相关度,避免计算分值,执行速度非常快。我们可以把经常被查询且不频繁变更的条件放到filter中

如下, 查询出12月份已付款的订单,付款状态不会经常变动,所以放在filter中

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [{
  5. "term": {
  6. "month": "2022-12"
  7. }
  8. }],
  9. "filter": {
  10. "term": {
  11. "trade_status": 2
  12. }
  13. }
  14. }
  15. }
  16. }

filter也常和range范围查询一起结合使用,range范围可供组合的选项

gt : 大于

lt : 小于

gte : 大于等于

lte :小于等于

如下,查询merchant_id值为2501下的交易数据

  1. {
  2. "query": {
  3. "bool": {
  4. "must": {
  5. "term": {
  6. "merchant_id": "2501"
  7. }
  8. },
  9. "filter": {
  10. "range": {
  11. "trade_finished_time": {
  12. "from": "2019-09-01T00:00:00",
  13. "to": "2019-09-30T23:59:59"
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }

如下查询,must下匹配,filter进行过滤,range定义范围

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [
  5. {
  6. "match": {
  7. "title": "Search"
  8. }
  9. },
  10. {
  11. "match": {
  12. "content": "Elasticsearch"
  13. }
  14. }
  15. ],
  16. "filter": [
  17. {
  18. "term": {
  19. "status": "1"
  20. }
  21. },
  22. {
  23. "range": {
  24. "publish_date": {
  25. "gte": "2015-01-01"
  26. }
  27. }
  28. }
  29. ]
  30. }
  31. }
  32. }

五、常见组合查询

1、bool-must-filter结合

查询商户ID为3582,订单号为360102199003072618,按时间范围过滤,按下单时间倒序,每次查询100条

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [{
  5. "term": {
  6. "merchant_id": "3582"
  7. }
  8. }, {
  9. "term": {
  10. "order_num": "360102199003072618"
  11. }
  12. }],
  13. "filter": [{
  14. "range": {
  15. "order_time": {
  16. "from": "2019-11-01T17:00:00+08:00",
  17. "to": "2019-11-01T20:00:00+08:00"
  18. }
  19. }
  20. }]
  21. }
  22. },
  23. "size": 100,
  24. "sort": [{
  25. "order_time": "desc"
  26. }]
  27. }

2、bool-must-should-match

查询venderId值为1234,taskId为1234,字段itemCodes和templateCodes的值至少有一个match匹配到结果,才返回对应数据集。

即must下两个terms同时满足,should下两个match至少满足一条

  1. {
  2. "bool": {
  3. "must": [{
  4. "terms": {
  5. "venderId": [
  6. "1234"
  7. ]
  8. }
  9. },
  10. {
  11. "terms": {
  12. "taskId": [
  13. "1234"
  14. ]
  15. }
  16. },
  17. {
  18. "should": [{
  19. "match": {
  20. "itemCodes": {
  21. "query": "12,124"
  22. }
  23. }
  24. },
  25. {
  26. "match": {
  27. "templateCodes": {
  28. "query": "t123,t124,t125"
  29. }
  30. }
  31. }
  32. ]
  33. }
  34. ]
  35. }
  36. }

3、bool-must-wildcard-range

根据促销ID和促销名称查询某个时间段的促销,并时间排序

  1. {
  2. "from": 0,
  3. "size": 10,
  4. "query": {
  5. "bool": {
  6. "must": [{
  7. "term": {
  8. "promt_id": {
  9. "value": 200352052277
  10. }
  11. }
  12. }, {
  13. "wildcard": {
  14. "promt_name": {
  15. "wildcard": "*业务部*"
  16. }
  17. }
  18. }, {
  19. "range": {
  20. "promt_end_time": {
  21. "from": "2022-10-01 00:00:00"
  22. }
  23. }
  24. }, {
  25. "range": {
  26. "promt_begin_time": {
  27. "to": "2022-10-31 23:59:59"
  28. }
  29. }
  30. }]
  31. }
  32. },
  33. "sort": [{
  34. "created_time": {
  35. "order": "desc",
  36. "unmapped_type": "keyword"
  37. }
  38. }]
  39. }

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

闽ICP备14008679号