栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

elasticsearch学习(2)- elasticsearch的高级操作

elasticsearch学习(2)- elasticsearch的高级操作

1. 批量(Bulk)操作

Bulk批量操作是将文档的增删改查一系列操作,通过一次请求全部做完,减少网络传输次数。
语法:

POST /_bulk
{
	"action":{"metadata"}
	{"data"}
}

举例:

GET person/_search

# 批量操作
# 1 删除4号记录
# 2 修改xMqiWnwBLL2snwrIBtEv号记录,name改成张三二号
# 3 添加3号记录
POST person/_bulk
{"delete":{ "_index":"person","_id":4 } } 
{ "create":{ "_index":"person","_id":3 } } 
{ "name":"三号", "age":23, "addr":"北京昌平区"  } 
{ "update":{ "_index":"person", "_id":"xMqiWnwBLL2snwrIBtEv" } } 
{ "doc":{ "name":"张三二号" } }

注意:中间不能有换行,所有的操作之间相互独立,相互不受影响。

2. 各种查询 2.1 matchAll查询
GET person/_search
{
  "query": {
    "match_all": {}
  }
}

注意:ES 存在默认分页,默认一次性查询10条数据
如果想指定分页,如下:

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

from表示从哪一条数据开始,size表示显示条数

2.2 term查询
# term查询中,本质其实是对词条的查询,keyword字段直接可以进行全量查询,将其视为一个词条,text字段是根据词条进行查询,不会全量匹配
GET person3/_search
{
  "query": {
    "term": {
      "addr": {
        "value": "北京海淀区"
      }
    }
  }
}

批量查询

GET person3/_search
{
  "query": {
    "terms": {
      "name": [
        "张三",
        "李四"
      ]
    }
  }
}
2.3 match查询

会对查询条件进行分词,然后将分词后的查询条件和词条进行等值匹配,默认取并集。

GET person/_search
{
  "query": {
    "match": {
      "addr": "华为鸿蒙系统"
    }
  }
}
2.4 模糊查询

wildcard查询:会对查询条件进行分词,还可以使用通配符?(任意单个字符)和*(0个或多个字符)。
注意:尽量不要在前面写通配符,否则就会全部索引扫描。

# 模糊查询 *多个匹配 ?匹配一个
GET person/_search
{
  "query": {
    "wildcard": {
      "addr": {
        "value": "*华"
      }
    }
  }
}

regexp查询 :正则查询。

GET person/_search
{
  "query": {
    "regexp": {
      "addr": "\w+(.)*"
    }
  }
}

prefix查询:前缀查询

# 前缀查询
GET person/_search
{
  "query": {
    "prefix": {
      "addr": {
        "value": "三"
      }
    }
  }
}
2.5 范围查询

range 范围查询:查找指定字段在指定范围内包含值。

# 范围查询 gte>= lte<= gt> lt<
GET person/_search
{
  "query": {
    
    "range": {
      "age": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

排序

GET person/_search
{
  "query": {
    
    "range": {
      "age": {
        "gte": 10,
        "lte": 20
      }
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}
2.6 queryString查询

有时候需要根据其他字段进行多字段查询,可以用到它。

  • 会对查询条件进行分词。
  • 然后将分词后的查询条件和词条进行等值匹配。
  • 默认取并集。
  • 可以指定多个查询字段。
# queryString查询 首先对你的条件进行分词 然后一个字段一个字段取匹配
# or 表示的是在一个字段中 只要有一个条件满足就ok AND表示在一个字段中必须两个查询条件都满足才可以
GET person/_search
{
  "query": {
    
    "query_string": {
      "fields": ["name","addr"],
      "query": "张三 OR 三星"
    }
  }
}
2.7 布尔查询

boolQuery: 对多个查询条件连接,连接方式:

  • must(and):条件必须成立。
  • must_not(not):条件必须不成立。
  • should(or):条件可以成立。
  • filter:条件必须成立,性能比must高,不会计算得分。
# 布尔查询 must
GET person/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "name": {
              "value": "赵七"
            }
          }
        },
        {
          "match": {
            "addr": "三星"
          }
        }
      ]
    }
  }
}

# 布尔查询 filter
GET person/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "name": {
              "value": "赵七"
            }
          }
        }
      ]
    }
  }
}
2.8 聚合查询
  • 指标聚合:相当于Mysql的聚合函数,max,min,avg,sum等。
  • 桶聚合:相当于Mysql的group by操作。

注意:不要对text类型的数据进行group by,否则会失败。

# 指标聚合 聚合函数
# 对查询的结果进行聚合
# max_age 给聚合结果起个名字,max要聚合的算法 field要聚合的字段
GET person/_search
{
  "query": {
    "match": {
      "addr": "北京"
    }
  },
  "aggs": {
    "max_age": {
      "max": {
        "field": "age"
      }
    }
  }
}

# 桶聚合 分组
# 对查询结果进行分组
# age_group 聚合别名 terms要根据指定的字段进行分组,总共显示size条数

GET person/_search
{
  "query": {
    "match": {
      "addr": "北京"
    }
  },
  "aggs": {
    "age_group": {
      "terms": {
        "field": "age",
        "size": 100
      }
    }
  }
}
2.9 高亮查询

高亮三要素:高亮字段,高亮前缀,高亮后缀。

# 高亮查询
# 后续可能需要高亮字段将原有字段替换
GET person/_search
{
  "query": {
    "match": {
      "addr": "北京"
    }
  },
  "highlight": {
    
    "fields": {
      "addr": {
        "pre_tags": ""
        , "post_tags": ""
      }
    }
  }
}
3. 索引别名和重建索引

随着业务需求变更,索引的结构可能会发生变化。但是ES的索引一旦创建,只允许添加字段,不允许改变字段,因为需要重建倒排索引,影响内部缓存结构,性能太低。
那么此时,就需要重新创建一个新的索引,并将原有的数据导入到新索引中。

#--------重建索引----------
# 新建person1,注意:索引名称字母必须全部小写
# 现在需求是将person的name字段类型由keyword改成text 直接无法修改,只能创建person1,然后将person数据导入到person1中。
PUT person1
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "addr":{
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}
 
# 将person数据拷贝到person1
# _reindex
POST _reindex
{
  "source": {
    "index": "person"
  },
  "dest": {
    "index": "person1"
  }
}

但是代码中仍然使用的是老的索引,我们的办法是要么修改代码,要么给索引起别名。

# 给person1起别名为person,前提是不存在person这个索引
POST person1/_alias/person
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/303697.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号