elasticsearch 的 update by query 使用案例

 为了优化我的查询时间,我想要跳过嵌套查询和父子关联查询,其实有很多时候我的查询条件,关注的是有没有,而不是 是什么。

 所以我完全可以通过打标签的方式,跳过嵌套查询和父子关联查询。

  举个栗子:我的软件信息是嵌套类型的,而我展示结果的时候想要把带有软件信息的放在前边展示。这个需求里边我并不关注软件的内容,关注的只是有软件信息的。但是我查询条件在做打分排序的时候,我需要对软件的字段进行should,它是嵌套查询的。

  基于以上想法,我想把包含软件信息的打上一个标签:这样我查的时候,只需要对非嵌套类型的标签进行should,跳过了嵌套查询。

  所以用到了这条语句:update_by_query

 为了实现这个需求,我也是努力的查看了官网,但是感觉还是不是很清晰,又问了elasticsearch社区的人。最终把这个语句写出来了!

 但是还有一些问题,下边介绍。先介绍语句。

 先介绍一下使用的两个栗子,基本上也就两种情况了,一种是原来没有值,然后添加值;一种是原来有值,然后修改。

 

# # 情景一:update_by_query,其中update的内容为添加的内容

   为了方便以后扩展,我这个标签是两层。外层是 labels ,第二层是:hasSoftType

POST device_search_20200716/_update_by_query?conflicts=proceed&timeout=1d&&slices=5
{
  
   "script": {
   // labels 是一级字段 params是下边定义的,里边存放着二级字段,和二级字段的值
    "source": "ctx._source.put('labels',params.labels)",
    "lang": "painless",
    "params":{
      "labels":{
        "hasSoftType":"1"
      }
    }
  },
   "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "deviceInfo.deviceType"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "labels.hasSoftType": {
              "value": "1"
            }
          }
        }
      ]
    }
  }
}

# # 情景二:update_by_query,其中update的内容为修改的内容

  执行这个的时候,如果要修改的字段没有内容会报错

POST device_search_20200716/_update_by_query?conflicts=proceed
{
   "script": {
    "source": "ctx._source['labels'].hasSoftType='2';",
    "lang": "painless"
  },
   "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "deviceInfo.deviceType"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "labels.hasSoftType": {
              "value": "1"
            }
          }
        }
      ]
    }
  }
}

 

 # # 情景三:update_by_query,其中update的字段是一级字段,没有嵌套关系

POST device_search_20200716/_update_by_query?conflicts=proceed
{
   "script": {
    "source": "ctx._source['labels']='2';",
    "lang": "painless"
  },
   "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "deviceInfo.deviceType"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "labels.hasSoftType": {
              "value": "1"
            }
          }
        }
      ]
    }
  }
}

 

# # 官网文档上的内容以及需要主义的点

 待整理 

### 使用HTTP与Elasticsearch交互 对于在Elasticsearch中执行的操作,可以通过发送HTTP请求来完成。每种类型的文档管理活动——创建、读取、更新和删除(CRUD),以及索引管理和查询都可以通过特定的HTTP方法实现。 当向Elasticsearch集群中的某个节点发出HTTP请求时,该节点会处理这个请求并将其转发给其他必要的节点以获取数据或应用更改。一旦操作完成,响应会被返回到客户端[^3]。 #### 创建映射 为了定义字段及其属性,在指定索引上设置自定义映射可以使用`PUT`(也可以使用`POST`)。以下是用于放置映射的一个基本URL模式: ```plaintext http://<server>/<index_name>/_mapping ``` 此命令允许用户为存储于特定索引内的文档结构提供详细的描述信息,从而优化搜索性能并确保一致性。 #### 发送JSON格式的数据 无论是上传新文档还是修改现有记录,都需要构建有效的JSON对象作为负载的一部分传递给API端点。例如,要添加一条新的日志条目至名为`mylogs`的索引下,则可采用如下方式: ```bash curl -X POST 'http://localhost:9200/mylogs/_doc' -H 'Content-Type: application/json' -d' { "@timestamp": "2023-10-05T14:00:00Z", "message": "This is a test log entry.", "level": "INFO" }' ``` 这段代码展示了如何利用`curl`工具通过POST请求将带有时间戳(`@timestamp`)的消息体提交给本地运行着的Elasticsearch实例。 #### 查询数据 检索已存入系统的资料可通过GET请求配合相应的参数达成目的。比如想要查找所有级别等于ERROR的日志项,就可以这样写: ```bash curl -X GET 'http://localhost:9200/mylogs/_search?q=level:ERROR' ``` 上述指令告诉服务器仅返回那些满足条件的结果集。 #### 更新已有文档 如果需要部分更新某份文件而不必重写整个内容的话,那么应该考虑运用_update API接口。下面的例子说明了怎样增加一个新的标签tag到ID为1的那个项目里去: ```bash curl -X POST 'http://localhost:9200/mylogs/_update/1' -H 'Content-Type: application/json' -d' { "script" : { "source": "ctx._source.tags.add(params.tag)", "lang": "painless", "params" : { "tag" : "new_tag_value" } } }' ``` 这里采用了脚本化的方式动态地改变了目标实体的部分特性而无需重新索引全部数据。 #### 删除单个文档或多条记录 最后,若是要移除某些不再需要的信息单元,只需简单地调用DELETE动作即可。针对单一资源而言,其语法形式如下所示;而对于批量清除任务来说则需借助_search/delete_by_query功能模块的帮助。 ##### 单一文档删除 ```bash curl -X DELETE 'http://localhost:9200/mylogs/_doc/<document_id>' ``` ##### 批量删除符合条件的多条记录 ```bash curl -X POST 'http://localhost:9200/mylogs/_delete_by_query' -H 'Content-Type: application/json' -d' { "query": { "match": { "status": "closed" } } }' ``` 以上就是关于如何基于HTTP协议同Elasticsearch打交道的一些基础指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值