ES 基础操作

一、集群

健康值的三种状态

  • Green所有索引的所有分片均可用 primaryreplice 均可用。

  • Yellow 至少有一个 replice不可以用, 但是所有的 primary 正常。

  • Red 至少有一个 primary 不可用。

健康值查询

GET _cat/health?v   # 列表的形式查看
GET _cluster/health # json的格式查看 (推荐使用)

kibana 集群 -> 堆栈监控里可视化查看

健康值查询详情

{
  "cluster_name" : "docker-cluster",   # 集群名称
  "status" : "green",                  # 集群的状态,可以是 yellow、 green、red
  "timed_out" : false,                 # 集群的健康检查是否超时
  "number_of_nodes" : 1,               # 节点数
  "number_of_data_nodes" : 1,          # 数据节点数;(常见的节点可分为主节点和数据节点,
                                          - 主节点主要负责创建删除索引,追踪节点状态。
                                          - 数据节点主要负责数据存储和相关操作)
  "active_primary_shards" : 13,        # 已分配的总分片数
  "active_shards" : 13,                # 活跃的总分片数。包括主分片和副本分片
  "relocating_shards" : 0,             # 正在迁移的分片数
  "initializing_shards" : 0,           # 处于初始化中的分片数
  "unassigned_shards" : 0,             # 尚未分配的分片数
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0  # 活跃分片数的百分比
}

二、分词与全文检索

全文检索,是索引系统通过扫描文章中的每个词,对每个词都建立索引,并指出在文章中出现的次数和位置,当用户查找时,索引系统会根据事先建立的索引进行查找,并将查到的结果反馈给用户的检索方式。

id title desc
1 are you kidding ? 你是凯迪吗?
2 No im sure china 不,我是秀儿
3 made in china 麦迪在中国

are you kidding ? No im sure made in china 
term index (词项索引) term dictionary (词项字典) Posting List (倒排表)
im 2
are 1
china 2,3
No 2

分词

大颗粒度的分词

GET _analyze
{
  "analyzer": "ik_smart",
  "text": ["我喜欢刘德华的歌"]
}

更小颗粒度的分词

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": ["我喜欢刘德华的歌"]
}

压缩算法

  • FOR、RoaringBitmap :倒排表

  • FST 词项索引,接近于 hash 算法

其他重要概念

节点

  • 一个节点就是一个 es 实例
  • 一个节点并不是一个物理机,但是建议一台机器上安装只启动一个节点
  • 节点的角色分为 选举节点、数据节点、冷节点、热节点等。

分片

  • es7 以后默认只有一个主分片,主分片的数量一旦确认就不能更改。但是副本可以任意修改数量
  • es 可以自动的进行分片的再平衡
  • 一个 doc 不可能存在于多个主分片中,但是可以存在于多个副本中
  • 每个主分片和其副分片不能存在与同在一个节点上。

三、索引

查看索引的健康值

GET _cat/indices?v

查看某一个的索引信息

GET kibana_sample_data_logs/_search

删除索引

DELETE /shopping?pretty 

四、映射

映射方式分为两种:

  • 动态映射(自动映射)
  • 静态映射(手动映射)

es 的支持的具体的数据类型,建议去 es 官网查看

  • 数字类型。 longintegershortdoublefloat

  • keyworlds: 适合于索引结构化数据,可以应用于过滤、排序、聚合。 keyword 类型的字段只能通过精确值搜索到。索引的 id 应该使用 keyworld 类型。

  • dates 时间类型。

  • text: 字段是可以全文检索的、不用于排序,很少用于聚合。text 默认只创建倒排索引,不会创建倒正排索引。

  • object: 创建单个的 JSON 对象

  • nested: 用于JSON 对象的字符数组。

 为什么不能给 text 类型创建正排索引?是因为加载高基数的 text 的时候,字段索引一旦加载到堆中,就会一直在那里。


默认映射类型

  • 整数:long
  • 浮点:float
  • true|false boolean
  • 日期:date
  • 数组:取决于数组中的第一个字段
  • 对象:object
  • 字符串:不是数字和日期类型,就会被映射成 textkeyword 两个类型。

J除上述类型外,其余类型必须显示指名

查看映射

get /product/_mapping

创建 mobile_phone 索引

PUT /mobile_phone
{
  "mappings": {
    "properties": {
      "classify": {
        "properties": {
          "color": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "memory": {
            "type": "text"
          }
        }
      },
      "des": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "isdel":{
        "type": "boolean"
      },
      "name": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "price": {
        "type": "long"
      },
      "publish_time": {
        "type": "date"
      },
      "tags": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
 }}}}}}

创建 person 索引
索引中,height 是不能被检索的

PUT /person
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "index": true
      },
      "sex": {
        "type": "keyword",
        "index": true
      },
      "height": {
        "type": "long",
        "index": false
      }
    }}}

六、查询

添加数据

GET shopping/_search
DELETE shopping?pretty
PUT shopping
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text",
        "analyzer": "ik_max_word",
        "fields": {
          "keyword":{
             "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "category":{
        "type": "keyword"
      },
      "price":{
        "type": "double"
      }
    }
  }
}

POST shopping/_doc/1
{
  "name":"小米 12s pro",
  "category":"手机",
  "price":"5399.00"
}

POST shopping/_doc/2
{
  "name":"小米 12x",
  "category":"手机",
  "price":"2869.00"
}

POST shopping/_doc/3
{
  "name":"红米 Note11",
  "category":"手机",
  "price":"1199.00"
}

POST shopping/_doc/4
{
  "name":"红米 K40s",
  "category":"手机",
  "price":"2149.00"
}

POST shopping/_doc/5
{
  "name":"红米 buds4",
  "category":"耳机",
  "price":"199.00"
}

POST shopping/_doc/6
{
  "name":"红米 buds3",
  "category":"耳机",
  "price":"169.00"
}

POST shopping/_doc/7
{
  "name":"华为 Mate 50 Pro",
  "category":"手机",
  "price":"7799.00"
}

POST shopping/_doc/8
{
  "name":"华为HUAWEI FreeBuds 4E",
  "category":"耳机",
  "price":"579.00"
}

POST shopping/_doc/9
{
  "name":"华为HUAWEI FreeLace Pro",
  "category":"耳机",
  "price":"399.00"
}

更改数据

将华为手机的价格改为 5499

POST /shopping/_update/Wu_7y4AB4H2nHiu3of8g
{
  "doc":{
    "price":5499
  }
}

简单查询

  • match_all: 没有任何查询条件。

  • match:匹配查询,会将查询条件进行分词,多个分词查询以后是 or 的关系。

  • multi_match:与match类似,不同的是可以在多个字段中查询

  • term:精确匹配,不会对查询条件进行分词

  • terms:支持多个关键字精确查询

  • range:范围查询

  • match_phrase: 1.查询条件分词后都必须匹配,类似match中的operator=and2.文档匹配的顺序必须与查询条件分词匹配后一致

详细参考:https://blog.csdn.net/LeoHan163/article/details/126433158

查询示例

# 查询所有数据,默认最多10个。
GET shopping/_search
{
  "query": {
    "match_all": {}
  }
}

# match 会将查询条件分词。然后进行查询;而且不的词之间是 or 的关系
GET shopping/_search
{
  "query": {
    "match": {
      "name": "华为小米"
 }}}

# 查询条件分词,但是存储数据不分词。
GET shopping/_search
{
  "query": {
    "match": {
      "name.keyword": "小米 12x"
  }}}

# 多字段查找;多个字段是 and的关系
GET shopping/_search
{
  "query": {
    "multi_match": {
      "query": "华为手机",
      "fields": ["name","category"]
 }}}

# term 精确匹配
GET shopping/_search
{
  "query": {
    "term": {
      "name": {
        "value": "小米"
 }}}}

# match_phrase 
GET shopping/_search
{
  "query": {
    "match_phrase": {
      "name": "小米"
 }}}

# terms 的多字段查询
GET shopping/_search
{
  "query": {
    "terms": {
      "name": [
        "小米",
        "华为"
 ]}}}

# 查询价格在 1000 到 2000 之间的。
GET shopping/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 1000,
        "lte": 2000
  }}}}

对搜索结果,数量进行限制,只取两个

GET shopping/_search
{
  "query": {
    "match": {
      "name": "手机"
    }
  },
  "from": 1, 
  "size": 2
}

对查询结果限制、排序

# 只想取某一个字段
GET shopping/_search
{
  "query": {
    "match_all": {}
  }
  , "_source": ["name"]
}

# 对查询结果数量限制
GET shopping/_search
{
  "query": {
    "match_all": {}
  },
  "from": 1,
  "size": 2
}

# 对价格进行排序
GET shopping/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

范围查找;搜索价格从 100 到 1000 之间的电子产品

GET shopping/_search
{
 "query": {
   "bool": {
     "filter": {
       "range": {
         "price": {
           "gte": 100,
           "lte": 1000
         }
}}}}}

# 对于时间格式的查询

GET website/_search
{
    "query": {
        "range": {
            "post_date": {
                "gte": "2/1/2018", 
                "lte": "2019",
                "format": "dd/MM/yyyy||yyyy"
}}}}

bool 查询

  • must 必须满足的条件,会计算评分

  • must not 必须不满足,不会计算评分

  • should 满不满足无所谓,但会计算评分

  • filter 必须满足条件,但是不会计算评分

bool 查询示例

# 查看属于手机,但不是小米的数据
GET shopping/_search
{
  "query": {
    "bool": {
      "filter": [
        {"term": {
          "category": "手机"
        }}
      ],
      "must_not": [
        {
          "match": {
            "name": "小米"
}}]}}}

对查询结果高亮显示

GET shopping/_search
{
  "query": {
    "match": {
      "name": "华为手机"
    }
  },
  "highlight": {
    "fields": {
      "name":{}
  }}
}

七、聚合

es 的聚合查询流程,一般分为两步

  • 分组
  • 组内聚合

聚合索引的示例

GET shopping/_search
{
  "size": 0,  //不需要返回数据
  "aggs": {
    "iphone-sum": { //给聚合索引起个名,手机总价
      "sum": {
        "field": "price" //计算总价
      }
    },
    "iphone-min":{
      "min": {
        "field": "price"
      }
    },
    "iphone-max":{
      "max": {
        "field": "price"
}}}}


GET shopping/_search
{
    "size": 0,
    "aggs": {
        "group-category": {  // 先给桶聚合起个名
            "terms": {
                "field": "category", // 选择分桶的字段
                "size": 10,   // 最多显示多少条
                "order": {
                    "_count": "desc" //根据每个桶内样例个数正排
                }
            },
            "aggs": {
                "avg-price": {   // 每个桶内继续子聚合
                    "avg": {
                        "field": "price"
                    }
                },
                "hits": {
                    "top_hits": {   // 每个桶内,显示一个样例数据
                        "size": 1,
                        "_source": [
                            "src_ip",
                            "user_id"
                                  ]
}}}}}}

参考文献

posted @ 2022-01-23 23:57  沧海一声笑rush  阅读(146)  评论(0编辑  收藏  举报