zoukankan      html  css  js  c++  java
  • Elasticsearch --- 2. 常用操作

    0.创建

    PUT s1/doc/1
    {
      "name":"张三",
      "age":"23",
      "sex":""
    }
    
    PUT s1/doc/2
    {
      "name":"李四",
      "age":"30",
      "sex":""
    }
    
    
    
    PUT s1/doc/3
    {
      "name":"小六",
      "age":"18",
      "sex":""
    }


    GET s1/doc/_search   #查询所有

    GET s1/doc/1      #指定查询

     

    1.两种条件查询方式

      ①字符串查询

    GET s1/doc/_search?q=age:23

      ②结构化查询(DSL)


    #1.match
    GET s1/doc/_search { "query": { "match": { "age": "23" } } }


    #2.match_all
    GET s18/doc/_search   #查询所有
    {
    "query": {
    "match_all": {}
    }
    }


    #3.match_phrase (短语查询)

    GET t1/doc/_search
    {
      "query": {
        "match_phrase": {
          "title": {
            "query": "中国"
    } } } }


    ②两个词组之间有了2个词的间隔
    GET t1/doc/_search {
      "query": {
        "match_phrase": {
          "title": {
            "query": "中国世界",
            "slop": 2
    } } } }



    #4.
    match_phrase_prefix(最左前缀查询)

    GET t3/doc/_search {
      "query": {
        "match_phrase_prefix": {
          "desc": "bea"
    } } }

    #5.multi_match(多字段查询)(与must效果一致)

    GET t3/doc/_search {
      "query": {
        "multi_match": {
          "query": "beautiful",
          "fields": ["title", "desc"]
    } } }


    2.修改指定字段

    #只修改文档1中的 "age" ,其他不变

    POST s1/doc/1/_update { "doc":{ "age":25 } }

    3.排序sort

    #降序

    GET s1/doc/_search { "query": { "match_all": {} }, "sort": [ { "age": { "order": "desc" } } ] }
    #升序

    GET s1/doc/_search { "query": { "match_all": {} }, "sort": [ { "age": { "order": "asc" } } ] }

    4.分页

    #按索引从1的位置开始查,查2个

    GET s1/doc/_search { "query": { "match_all": {} }, "from": 1, "size": 2 }

    5.布尔查询:

      1.should(or),must(and),must_not(not)

    #①查询姓名是"张三",或者年龄是"18"的

    GET s1/doc/_search { "query": { "bool": { "should": [ { "match": { "name": "张三" } }, { "match": { "age": "18" } } ] } } }
    #②查询出年龄是30的男性

    GET s1/doc/_search { "query": { "bool": { "must": [ { "match": { "sex": "" } }, { "match": { "age": "30" } } ] } } }
    #③查询出既不是男性,又不是30岁的

    GET s1/doc/_search { "query": { "bool": { "must_not": [ { "match": { "sex": "" } }, { "match": { "age": "30" } } ] } } }

      2.大于(gt),大于等于(gte),小于(lt),小于等于(lte)

    #①大于(其他类似)
    查询大于25岁的男性

    GET s1/doc/_search { "query": { "bool": { "must": [ { "match": { "sex": "" } } ], "filter": { "range": { "age": { "gt": 25 } } } } } }
    #②查询小于25岁的非男性

    GET s1/doc/_search { "query": { "bool": { "must_not": [ { "match": { "sex": "" } } ], "filter": { "range": { "age": { "lt": 25 } } } } } }

    6.高亮查询


    PUT s2/doc/1 { "name":"wangdi", "desc": "骚的打漂" } GET s2/doc/_search { "query": { "match": { "desc": "打漂" } }, "highlight": { #高亮显示查询的结果 "pre_tags": "<b style='color:red;font-size:20px;' class='wangdi'>", "post_tags": "</b>", "fields": { "desc": {} } } }

    7.结果过滤

    #①只将结果的姓名显示

    GET s1/doc/_search { "query": { "match": { "name": "张三" } }, "_source": "name" }
    #②将结果的姓名和年龄显示

    GET s1/doc/_search { "query": { "match": { "name": "张三" } }, "_source": ["name","age"] }

    8.聚合查询(sum,max,min,avg)

    求男性的年龄总和

    GET s1/doc/_search { "query": { "match": { "sex": "" } }, "aggs":{ "my_sum":{ "sum": { "field": "age" } } } }
    求男性的最大值

    GET s1/doc/_search { "query": { "match": { "sex": "" } }, "aggs":{ "my_max":{ "max": { "field": "age" } } } }
    # 求所有人的平均值 avg
    GET s1/doc/_search
    {
      "aggs": {
        "my_avg": {
          "avg": {
            "field": "age"
          }
        }
      }
    }

    9.分组

    #根据年龄,10-20,,20-30, 30-50 进行分组


    GET s1/doc/_search { "aggs": { "my_group":{ "range": { "field": "age", "ranges": [ { "from": 10, "to": 20 }, { "from": 20, "to": 30 }, { "from": 30, "to": 50 } ] } } } }
    对分组结果进行求和


    GET s1/doc/_search { "aggs": { "my_group":{ "range": { "field": "age", "ranges": [ { "from": 10, "to": 20 }, { "from": 20, "to": 30 }, { "from": 30, "to": 50 } ] }, "aggs":{   "my_sum":{   "sum":{ "field":"age" } } } } } }

    10.映射(mappings)

      自定义表结构

    简单类型,如文本(text)、关键字(keyword)、日期(data)、整形(long)、
    双精度(double)、布尔(boolean)或ip。
    可以是支持JSON的层次结构性质的类型,如对象或嵌套。
    或者一种特殊类型,如geo_point、geo_shape或completion。

      ①基本的映射(可添加新字段,es自动生成)

    PUT s3
    {
      "mappings": {
        "doc":{
          "properties":{
            "name":{
              "type":"text"
            },
              "age":{
                "type":"long"
              },
              "desc":{
                "type":"text"
              }
            }
          }
        }
    }
    
    
    GET s3/_mapping

    GET s3

      ②dynamic的三种状态

    #① true 状态(默认状态,可以添加新字段,可建立新映射关系,)

    PUT s4 {
    "mappings": { "doc":{ "dynamic": true, "properties":{ "name":{ "type":"text" } } } } }
    ② false 状态(可建立新字段,不能建立新的映射关系,不能做查询的条件,伴随主查询条件出现)

    PUT s5 {
    "mappings": { "doc":{ "dynamic": false, "properties":{ "name":{ "type":"text" } } } } }
    ③ strict 状态(严格类型,不可添加新字段)

    PUT s6 {
    "mappings": { "doc":{ "dynamic":"strict", "properties":{ "name":{ "type":"text" } } } } }

      ③ ignore_above(限制字节数)

    超过时不能进行搜索(索引),但会插入数据

    PUT s7 {
    "mappings": { "doc":{ "properties":{ "title":{ "type":"keyword", "ignore_above": 10 } } } } }

      ④ index()

    # true:可以对该字段(作为主查询)进行搜索  (默认)
    # false: 不能对该字段作为搜索条件 进行搜索


    PUT s8 {
    "mappings": { "doc":{ "properties":{ "t1":{ "type":"text", "index": true }, "t2":{ "type":"text", "index": false } } } } }

      ⑤copy_to 复制属性

    该属性允许我们将多个字段的值复制到组字段中,然后将组字段作为单个字段进行查询
    建立映射

    PUT s9 {
    "mappings": { "doc":{ "properties":{ "t1":{ "type":"text", "copy_to":"full_name" }, "t2":{ "type":"text", "copy_to":"full_name" }, "full_name":{ "type":"text" } } } } }
    插入数据

    PUT s9/doc/1 { "t1":"xxx", "t2":"ooo" }
    进行查询两种方式

    GET s9/doc/_search { "query": { "match": { "t1": "xxx" } } } GET s9/doc/_search { "query": { "match": { "full_name": "xxx" } } }

      ⑥多层嵌套(内套在加peoperties)

    PUT w1
    {
      "mappings": {
        "doc":{
          "properties":{
            "name":{
              "type":"text"
            },
            "age":{
              "type":"long"
            },
            "info":{
              "properties":{
                "addr":{
                  "type":"text"
                },
                "tel":{
                  "type":"long"
                }
              }
            }
          }
        }
      }
    }
    插入数据

    PUT w1/doc/2 { "name":"tom", "age":"18", "info":{ "addr":"北京", "tel":"10010" } }
    查询嵌套的条件

    GET w1/doc/_search { "query": { "match": { "info.tel": "10010" } } }

      ⑦settings(设置主,副分片)

    PUT w2
    {
      "mappings": {
        "doc":{
          "properties":{
            "title":{
              "type":"text"
            }
          }
        }
      }, 
      "settings": {
        "number_of_shards": 3,     #主
        "number_of_replicas": 3  #副
      }
    }
  • 相关阅读:
    史记 · 码农列传
    死侍在新片中,扮演了一个 AI 驱动的 NPC
    什么是高中物理?一篇长长长长文告诉你!
    你管这玩意叫网络?
    你管这破玩意叫计算机?
    try-catch-finally中的4个巨坑,老程序员也搞不定!
    未来几年,软件测试九大新兴趋势
    代码中大量的if/else,你有什么优化方案?
    PHP部署服务端常见问题整理
    PHP服务端环境搭建
  • 原文地址:https://www.cnblogs.com/sc-1067178406/p/10901438.html
Copyright © 2011-2022 走看看