当前位置:   article > 正文

ElastchSearch 基本使用姿势_elatiscsearch 使用

elatiscsearch 使用

ElastchSearch 基本使用姿势,如常见的

  • 添加文档

  • 常见的查询姿势

  • 修改/删除文档

1. 添加文档

首次添加文档时,若索引不存在会自动创建;借助 kibanadev-tools来实现 es 的交互

  1. POST first-index/_doc
  2. {
  3.   "@timestamp""2021-03-31T01:12:00",
  4.   "message""GET /search HTTP/1.1 200 1070000",
  5.   "user": {
  6.     "id""YiHui",
  7.     "name""一张三"
  8.   },
  9.   "addr": {
  10.     "country""cn",
  11.     "province""hubei",
  12.     "city""wuhan"
  13.   },
  14.   "age"18
  15. }
  16. ## 添加两个数据进行测试
  17. POST first-index/_doc
  18. {
  19.   "@timestamp""2021-03-31T02:12:00",
  20.   "message""GET /search HTTP/1.1 200 1070000",
  21.   "user": {
  22.     "id""ErHui",
  23.     "name""二张三"
  24.   },
  25.   "addr": {
  26.     "country""cn",
  27.     "province""hubei",
  28.     "city""wuhan"
  29.   },
  30.   "age"19
  31. }

当然也可以直接使用 http 进行交互,下面的方式和上面等价(后面都使用 kibanan 进行交互,更直观一点)

  1. curl  -X POST 'http://localhost:9200/first-index/_doc?pretty' -H 'Content-Type: application/json' -d '
  2. {
  3.   "@timestamp""2021-03-31T01:12:00",
  4.   "message""GET /search HTTP/1.1 200 1070000",
  5.   "user": {
  6.     "id""YiHui",
  7.     "name""一张三"
  8.   },
  9.   "addr": {
  10.     "country""cn",
  11.     "province""hubei",
  12.     "city""wuhan"
  13.   },
  14.   "age"18
  15. }'

2. 查询文档

2.0 kibana 配置并查询

除了基础的查询语法之外,直接使用 kibana 进行查询,对于使用方而言,门槛最低;首先配置上面的 es 索引

  • Management -> Stack Management -> Kiabana Index Patterns

  • index pattern name

  • 时间字段,选择 @timestamp 这个与实际的文档中的 field 有关

 

 

 

接下来进入Discover 进行查询

比如字段查询

 

2.1 查询所有

不加任何匹配,捞出文档(当数据量很多时,当然也不会真的全部返回,也是会做分页的)

  1. GET my-index/_search
  2. {
  3.   "query": {
  4.     "match_all": {
  5.     }
  6.   }
  7. }

 

2.2 term 精确匹配

根据 field 进行 value 匹配,忽略大小写;

查询语法,形如: `{"query": {"term": {"成员名": {"value": "查询值"}}}}

  • querytermvalue 三个 key 为固定值

  • 成员名: 为待查询的成员

  • 查询值: 需要匹配的值

(说明:后面语法中,中文的都是需要替换的,英文的为固定值)

  1. GET first-index/_search
  2. {
  3.   "query": {
  4.     "term": {
  5.       "user.id": {
  6.         "value""yihui"
  7.       }
  8.     }
  9.   }
  10. }

 当 value 不匹配,或者查询的 field 不存在,则查不到的对应的信息,如

2.3 terms 多值匹配

term 表示 value 的精确匹配,如果我希望类似value in (xxx)的查询,则可以使用 terms

语法:

  1. {
  2.  "query": {
  3.   "terms": {
  4.    "成员名": [成员值, 成员值]
  5.   }
  6.  }
  7. }

实例如

  1. GET first-index/_search
  2. {
  3.   "query": {
  4.     "terms": {
  5.       "user.id": ["yihui""erhui"]
  6.     }
  7.   }
  8. }

 

2.4 range 范围匹配

适用于数值、日期的比较查询,如常见的 >, >=, <, <=

查询语法

  1. {
  2.  "query": {
  3.         "range": {
  4.             "成员名": {
  5.                 "gte""查询下界" ,
  6.                 "lte""查询下界"
  7.             }
  8.         }
  9.  }
  10. }
范围操作符说明
gt大于 >
gte大于等于 >=
lt小于 <
lte小于等于 <=

实例如下

  1. GET first-index/_search
  2. {
  3.   "query": {
  4.     "range": {
  5.       "age": {
  6.         "gte"10,
  7.         "lte"18
  8.       }
  9.     }
  10.   }
  11. }

2.5 字段过滤

根据是否包含某个字段来查询, 主要有两个 exists 表示要求存在, missing表示要求不存在

查询语法

  1. {
  2.     "query": {
  3.         "exists/missing": {
  4.             "field""字段值"
  5.         }
  6.     }
  7. }

实例如下

  1. GET first-index/_search
  2. {
  3.   "query": {
  4.     "exists": {
  5.       "field""age"
  6.     }
  7.   }
  8. }

2.6 组合查询

上面都是单个查询条件,单我们需要多个查询条件组合使用时,可以使用bool + must/must_not/should来实现

查询语法

  1. {
  2.     "query": {
  3.         "bool": {
  4.             "must": [ # 相当于and查询
  5.                 "查询条件1",
  6.                 "查询条件2"
  7.             ],
  8.             "must_not": [ # 多个查询条件相反匹配,相当与not
  9.                 ...
  10.             ],
  11.             "should": [ # 有一个匹配即可, 相当于or
  12.                 ...
  13.             ]
  14.         }
  15.     }
  16. }

实例如下

  1. ## user.id = yihui and age < 20
  2. GET first-index/_search
  3. {
  4.   "query": {
  5.     "bool": {
  6.       "must": [
  7.         {
  8.           "term": {
  9.             "user.id": {
  10.               "value""yihui"
  11.             }
  12.           }
  13.         },
  14.         {
  15.           "range": {
  16.             "age": {
  17.               "lt"20
  18.             }
  19.           }
  20.         }
  21.       ]
  22.     }
  23.   }
  24. }
  25. # !(user.id) = yihui and !(age>20)
  26. GET first-index/_search
  27. {
  28.   "query": {
  29.     "bool": {
  30.       "must_not": [
  31.         {
  32.           "term": {
  33.             "user.id": {
  34.               "value""yihui"
  35.             }
  36.           }
  37.         },
  38.         {
  39.           "range": {
  40.             "age": {
  41.               "gt"20
  42.             }
  43.           }
  44.         }
  45.       ]
  46.     }
  47.   }
  48. }
  49. # user.id = 'yihui' or age>20
  50. GET first-index/_search
  51. {
  52.   "query": {
  53.     "bool": {
  54.       "should": [
  55.         {
  56.           "term": {
  57.             "user.id": {
  58.               "value""yihui"
  59.             }
  60.           }
  61.         },
  62.         {
  63.           "range": {
  64.             "age": {
  65.               "gt"20
  66.             }
  67.           }
  68.         }
  69.       ]
  70.     }
  71.   }
  72. }

下面截图以 must_not 输出示意

说明

  • 前面根据字段查询 existing 只能单个匹配,可以借助这里的组合来实现多个的判断

2.7 match 查询

最大的特点是它更适用于模糊查询,比如查询某个 field 中的字段匹配

语法

  1. {
  2.     "query": {
  3.         "match": {
  4.             "字段名""查询值"
  5.         }
  6.     }
  7. }

举例说明

  1. GET first-index/_search
  2. {
  3.   "query": {
  4.     "match": {
  5.       "user.name""张og"
  6.     }
  7.   }
  8. }

 

说明,如果有精确查询的需求,使用前面的 term,可以缓存结果

2.8 multi_match 查询

更多相关信息,可以查看: 官网-multi_match 查询

多个字段中进行查询

语法

  • type: best_fields 、 most_fields 和 cross_fields (最佳字段、多数字段、跨字段)

  • 最佳字段 :当搜索词语具体概念的时候,比如 “brown fox” ,词组比各自独立的单词更有意义

  • 多数字段:为了对相关度进行微调,常用的一个技术就是将相同的数据索引到不同的字段,它们各自具有独立的分析链。

  • 混合字段:对于某些实体,我们需要在多个字段中确定其信息,单个字段都只能作为整体的一部分

  1. {
  2.     "query": {
  3.         "multi_match": {
  4.             "query":                "Quick brown fox",
  5.             "type":                 "best_fields",
  6.             "fields":               [ "title""body" ],
  7.             "tie_breaker":          0.3,
  8.             "minimum_should_match""30%"
  9.         }
  10.     }
  11. }

实例演示

  1. GET first-index/_search
  2. {
  3.   "query": {
  4.     "multi_match": {
  5.       "query""汉",
  6.       "fields": ["user.id""addr.city"]
  7.     }
  8.   }
  9. }

 

上面除了写上精确的字段之外,还支持模糊匹配,比如所有字段中进行匹配

  1. GET first-index/_search
  2. {
  3.   "query": {
  4.     "multi_match": {
  5.       "query""blog",
  6.       "fields": ["*"]
  7.     }
  8.   }
  9. }
2.9 wildcard 查询

shell 统配符

  • ?: 0/1 个字符

  • *: 0/n 个字符

  1. GET first-index/_search
  2. {
  3.   "query": {
  4.     "wildcard": {
  5.       "user.id": {
  6.         "value""*Hu?"
  7.       }
  8.     }
  9.   }
  10. }

说明,对中文可能有问题

2.10 regexp 查询

正则匹配

  1. GET first-index/_search
  2. {
  3.   "query": {
  4.     "regexp": {
  5.       "user.name"".*log"
  6.     }
  7.   }
  8. }
2.11 prefix 查询

前缀匹配

  1. GET first-index/_search
  2. {
  3.   "query": {
  4.     "prefix": {
  5.       "user.name""一"
  6.     }
  7.   }
  8. }
2.12 排序

查询结果排序,根据 sort 来指定

  1. {
  2.  "sort": [
  3.         {
  4.           "成员变量": {
  5.             "order": "desc"
  6.           }
  7.         }
  8.    ]
  9. }

实例如下

  1. GET first-index/_search
  2. {
  3.   "query":{
  4.     "match_all": {}
  5.   },
  6.   "sort": [
  7.     {
  8.       "@timestamp": {
  9.         "order""desc"
  10.       }
  11.     }
  12.   ]
  13. }
2.13 更多

更多操作姿势,可以在官方文档上获取

官方教程

3. 删除文档

需要根据文档 id 进行指定删除

DELETE first-index/_doc/gPYLh3gBF9fSFsHNEe58

 

删除成功

 

4.更新文档

4.1 覆盖更新

使用 PUT 来实现更新,同样通过 id 进行

  • 覆盖更新

  • version 版本会+1

  • 如果 id 对应的文档不存在,则新增

  1. PUT first-index/_doc/f_ZFhngBF9fSFsHNte7f
  2. {
  3.   "age"28
  4. }

 

4.2 增量更新

采用 POST 来实现增量更新

  • field 存在,则更新

  • field 不存在,则新增

  1. POST first-index/_update/gvarh3gBF9fSFsHNuO49
  2. {
  3.   "doc": {
  4.     "age"25
  5.   }
  6. }

此外还可以采用 script 脚本更新

  • 在原来的 age 基础上 + 5

  1. POST first-index/_update/gvarh3gBF9fSFsHNuO49
  2. {
  3.   "script""ctx._source.age += 5"
  4. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/543453
推荐阅读
相关标签
  

闽ICP备14008679号