关于Elasticsearch使用的一些心得

应用层面

查询速度快

存储层面

1.以索引为基础文档形式落库

2.由于数据量大,索引同时开很多的话需要内存多,需要定期关闭不使用的索引(一般不直接删除,由于监管等要求,部分企业可能需要保留五年交易数据)

3.磁盘空间有限制,需要每年定期迁移数据,一般一年以上的索引建议直接迁移备份,只保留一年内的数据进行查询使用

使用层面

查询不如传统数据库方便,同样依赖于字段类型,新建索引的时候有mapping,就相当于表结构,mapping没定义的使用默认类型。

修改很麻烦,只能整体内容替换

删除同理,写语句很麻烦

常见的语句(命令关键字之类基础的,我就不说了,直接查es语句详解得了,我就出点常用的模板)

查询

确定mapping结构
GET /tian-abc-20250308/_mapping
根据字段查询:
{
    "query":{
        //match理解成模糊查询,term理解成精准查询
        //"match":{ 
        "term":{
            "字段名":"要查的条件"
        }
    }
}
复杂查询:

场景:根据_id查询到的内容如下,如何使用_source根据S_0001的内容查询该文档

{ "hits":{ "total":1, "hits":[ { "_index":"tian-abc-20250308", "_type":"_doc", "_id":"202503080001" "_source":{ "requestParams":{ "S_0001":"hhh1", "S_0002":"hhh2" }, "reason":"1", "version":12 } } ] } }

 这样的结果里,可以看到requestParams是我们常规理解的第一层,可以直接查询的内容,而他里面的内容如何查询,首先看requestParams的type是什么,常见的有object、nested、text、keyword、date等

如果 requestParams 是object类型:
适用场景
requestParams.S_0001 的值是精确值(如 "hhh1")。

如果 requestParams.S_0001 是 text 类型,Elasticsearch 会默认生成一个 keyword 子字段(requestParams.S_0001.keyword),用于精确匹配


POST /tian-abc-20250308/_search
{
  "query": {
    "term": {
      "requestParams.S_0001.keyword": "hhh1"
    }
  }
}

--------------------------------------------------------

适用场景
requestParams.S_0001 的值是文本类型(text),并且需要分词匹配。

例如,如果值为 "hhh1 hhh2",查询 "hhh1" 会匹配成功。

POST /tian-abc-20250308/_search
{
  "query": {
    "match": {
      "requestParams.S_0001": "hhh1"
    }
  }
}
如果 requestParams是 nested 类型
POST /tian-abc-20250308/_search
{
  "query": {
    "nested": {
      "path": "requestParams",
      "query": {
        "term": {
          "requestParams.S_0001.keyword": "hhh1"
        }
      }
    }
  }
}
如果你的字段 设置成enabled:"false",更麻烦

如果 requestParams 字段的 enabled 属性被设置为 false,Elasticsearch 不会对该字段进行索引或解析,因此无法直接通过 requestParams.S_0001 进行查询。不过,你仍然可以通过以下方法间接查询或提取 requestParams 中的数据(网上有好多种,比如直接查询所有的,跟咱们需求不符;还有直接用script的,我试了不好使,可能语句不对,我直接写我试过好用的)

GET /tian-abc-20250308/_search
{
  "runtime_mappings": {
    "S_0001_runtime": {
      "type": "keyword",
      "script": {
        "source": "emit(params['_source']['requestParams']['S_0001'])"  // 从 _source 中提取 S_0001
      }
    }
  },
  "query": {
    "term": {
      "S_0001_runtime": "hhh1"  // 查询运行时字段
    }
  }
}

删除

 一般是根据"_id"直接删除一条,需要指定索引名,太麻烦,懒得用,直接写好用的:根据查询条件直接删除索引,可以模糊匹配,但建议不要设置太宽的索引范围,(比如某个文档中没有上述的requestParams或者S_0001字段,都会报错)

//conflicts=proceed是忽略冲突项,比如删除正在修改的数据会报错,这个会忽略冲突
POST /索引名(可以用*进行模糊匹配)/_delete_by_query?conflicts=proceed
{
把刚刚写好的查询语句直接粘贴进来。。就这么简单
}

如
POST /tian-abc-2025*/_delete_by_query
{
  "runtime_mappings": {
    "S_0001_runtime": {
      "type": "keyword",
      "script": {
        "source": "emit(params['_source']['requestParams']['S_0001'])"  // 从 _source 中提取 S_0001
      }
    }
  },
  "query": {
    "term": {
      "S_0001_runtime": "hhh1"  // 查询运行时字段
    }
  }
}

想记录的就这么多,结束课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShyTan

喜欢的给点打赏呗,纯手打

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值