Relational DB

Elasticsearch

数据库(database)

索引(indices)

表(tables)

types

行(rows)

documents

字段(columns)

fields

库表行字段,index,type,id,fields,  索引类型文档字段

 

创建一篇文档

PUT t1/doc/1     
{
 "name": "小黑的小姨妈",
 "age": 18
}

index/type/id  id是单个文档

查询所有索引

GET _cat/indices?v

查询指定的索引信息

GET t1

查询文档信息

GET t1/doc/1           #查询指定文档
GET t1/doc/_search     #查询所有文档

删除指定索引

DELETE /t1

 

修改文档

PUT zhifou/doc/1
{
  "name":"顾老二",
  "age":30,
  "from": "gu",
  "desc": "皮肤黑、武器长、性格直",
  "tags": ["黑", "长", "直"]
}

我们要将黑修改成黄:
POST zhifou/doc/1/_update
{
  "doc": {
    "desc": "皮肤很黄,武器很长,性格很直",
    "tags": ["很黄","很长", "很直"]
  }
}

查询字符串

方式一:
GET zhifou/doc/_search?q=from:gu
属性是from,属性值是gu的文档

方式二:
GET zhifou/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  }
}

match条件查询,查询含有(匹配)指定字段值的文档

我们查看来自顾家的都有哪些人

GET zhifou/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  }
}

match查询全部文档

查询zhifou索引下的doc类型中的所有文档,那就是查询全部

GET zhifou/doc/_search
{
  "query": {
    "match_all": {}
  }
}

match_phrase(短语查询)

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

title字段中包含短语中国
GET t1/doc/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "中国世界",
        "slop": 2
      }
    }
  }
}
slop了。相当于正则中的中国.*?世界。这个间隔默认为0,指定短语间隔

match_phrase_prefix(最左前缀查询)

GET t3/doc/_search
{
  "query": {
    "match_phrase_prefix": {
      "desc": "bea"
    }
  }
}
desc字段bea开头字
GET t3/doc/_search
{
  "query": {
    "match_phrase_prefix": {
      "desc": {
        "query": "bea",
        "max_expansions": 1
      }
      
    }
  }
}
max_expansions来设置最大的前缀扩展数量

multi_match(多字段查询)

方法一:
GET t3/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "beautiful"
          }
        },
        {
          "match": {
            "desc": "beautiful"
          }
        }
      ]
    }
  }
}

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

multi_match甚至可以当做match_phrase和match_phrase_prefix使用,只需要指定type类型即可:
GET t3/doc/_search
{
  "query": {
    "multi_match": {
      "query": "gi",
      "fields": ["title"],
      "type": "phrase_prefix"
    }
  }
}
GET t3/doc/_search
{
  "query": {
    "multi_match": {
      "query": "girl",
      "fields": ["title"],
      "type": "phrase"
    }
  }
}

 

term查询#单个匹配项

POST _analyze
{
  "analyzer": "standard",
  "text": "Beautiful girl!"
}
# 结果
["beautiful", "girl"]

GET w10/doc/_search
{
  "query": {
    "term": {
      "t1": "beautiful"
    }
  }
}

terms查询#多个匹配项

GET w10/doc/_search
{
  "query": {
    "terms": {
      "t1": ["beautiful", "sexy"]
    }
  }
}

排序查询:sort#按某个字段降序查询

查询顾府都有哪些人,并根据age字段按照降序

GET zhifou/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

按某个字段升序查询

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

分页查询:from/size#

GET zhifou/doc/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ], 
  "from": 2,
  "size": 1
}

from:从哪开始查
size:返回几条结果

bool查询

must#(and)并且,满足多个条件

单个条件查询:布尔查询所有from属性为gu的数据:
GET zhifou/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "from": "gu"
          }
        }
      ]
    }
  }
}
多个条件查询:想要查询from为gu,并且age为30的数据
GET zhifou/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "from": "gu"
          }
        },
        {
          "match": {
            "age": 30
          }
        }
      ]
    }
  }
}

bool查询should(or),满足一个就行

查询只要是from为gu或者tags为闭月的数据
GET zhifou/doc/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "from": "gu"
          }
        },
        {
          "match": {
            "tags": "闭月"
          }
        }
      ]
    }
  }
}

 

bool查询must_not(not)  既不,也不是

查询from既不是gu并且tags也不是可爱,还有age不是18的数据
GET zhifou/doc/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "from": "gu"
          }
        },
        {
          "match": {
            "tags": "可爱"
          }
        },
        {
          "match": {
            "age": 18
          }
        }
      ]
    }
  }
}

 

bool查询filter  满足某个条件,某个字段还可以比较大小范围

查询from为gu,age大于25的数据 。比较符号有gt gte lt lte
GET zhifou/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "from": "gu"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gt": 25
          }
        }
      }
    }
  }
}

查询from是gu,age在25~30之间
GET zhifou/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "from": "gu"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 25,
            "lte": 30
          }
        }
      }
    }
  }
}
must改成should,满足下面的filter但不满足上面的match也会显示出来
GET zhifou/doc/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "from": "sheng"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "lte": 25
          }
        }
      }
    }
  }
}

bool must filter过滤,过滤一个字段是a,并且另一个字段是b或者c

GET xxx-fsmxx_pm_rawxx_mod_unix_linux_211128/_doc/_search
{
    "query": {
        "bool": {
            "must": [{
                "range": {
                    "DCTIME": {
                        "from": 1,
                        "to": 1738028800000,
                        "include_lower": false,
                        "include_upper": false,
                        "boost": 1.0
                    }
                }
            }],
            "filter": [{
                "terms": {
                    "KPI_NO": ["20200413185034"],
                    "boost": 1.0
                }
            }, {
                "terms": {
                    "KBP": ["6518921118106698111","6038954760944889699"]
                }
            }],
            "adjust_pure_negative": true,
            "boost": 1.0
        }
    },
    "sort": [{
        "DCTIME": {
            "order": "asc",
            "unmapped_type": "long"
        }
    }]
}

 

  • must:与关系,相当于关系型数据库中的and
  • should:或关系,相当于关系型数据库中的or
  • must_not:非关系,相当于关系型数据库中的not
  • filter:过滤条件。
  • range:条件筛选范围。
  • gt:大于,相当于关系型数据库中的>
  • gte:大于等于,相当于关系型数据库中的>=
  • lt:小于,相当于关系型数据库中的<
  • lte:小于等于,相当于关系型数据库中的<=

结果过滤:_source

在所有的结果中,我只需要查看name和age两个属性,其他的不要
GET zhifou/doc/_search
{
  "query": {
    "match": {
      "name": "顾老二"
    }
  },
  "_source": ["name", "age"]
}

 

avg

查询from是gu的人的平均年龄
GET zhifou/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_avg": {
      "avg": {
        "field": "age"
      }
    }
  },
  "_source": ["name", "age"]
}
首先匹配查询from是gu的数据。在此基础上做查询平均值的操作,这里就用到了聚合函数,其语法被封装在aggs中,而my_avg则是为查询结果起个别名,封装了计算出的平均值。那么,要以什么属性作为条件呢?是age年龄,查年龄的什么呢?是avg,查平均年龄。

只想看平均值
GET zhifou/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_avg": {
      "avg": {
        "field": "age"
      }
    }
  },
  "size": 0, 
  "_source": ["name", "age"]
}

max

GET zhifou/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_max": {
      "max": {
        "field": "age"
      }
    }
  },
  "size": 0
}

min

GET zhifou/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_min": {
      "min": {
        "field": "age"
      }
    }
  },
  "size": 0
}

sum

GET zhifou/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_sum": {
      "sum": {
        "field": "age"
      }
    }
  },
  "size": 0
}

分组查询和分组聚合

查询所有人的年龄段,并且按照15~20,20~25,25~30分组,
GET zhifou/doc/_search
{
  "size": 0, 
  "query": {
    "match_all": {}
  },
  "aggs": {
    "age_group": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 15,
            "to": 20
          },
          {
            "from": 20,
            "to": 25
          },
          {
            "from": 25,
            "to": 30
          }
        ]
      }
    }
  }
}

查询所有人的年龄段,并且按照15~20,20~25,25~30分组,并且算出每组的平均年龄。每个小组内的数据做平均年龄处理。
GET zhifou/doc/_search
{
  "size": 0, 
  "query": {
    "match_all": {}
  },
  "aggs": {
    "age_group": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 15,
            "to": 20
          },
          {
            "from": 20,
            "to": 25
          },
          {
            "from": 25,
            "to": 30
          }
        ]
      },
      "aggs": {
        "my_avg": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}

 

 curl方法查看es集群信息:

现场磁盘空间使用情况查询
curl -XGET  -u 用户:密码 "http://ip:端口/_cat/nodes?v&h=http,version,jdk,disk.total,disk.used,disk.avail,disk.used_percent,heap.current,heap.percent,heap.max,ram.current,ram.percent,ram.max,master"
好像是查看所有索引分片的吧,反正是一大片输出:
curl -XGET  -u 用户:密码  "http://ip:端口/_cat/shards?v"
查看集群状态:
curl -XGET -u 用户:密码  -H "Content-Type: application/json" http://ip:端口/_cat/health?v