elasticsearch 的 update by query 使用案例

水的精神發表於2020-12-03

 為了優化我的查詢時間,我想要跳過巢狀查詢和父子關聯查詢,其實有很多時候我的查詢條件,關注的是有沒有,而不是 是什麼。

 所以我完全可以通過打標籤的方式,跳過巢狀查詢和父子關聯查詢。

  舉個例子:我的軟體資訊是巢狀型別的,而我展示結果的時候想要把帶有軟體資訊的放在前邊展示。這個需求裡邊我並不關注軟體的內容,關注的只是有軟體資訊的。但是我查詢條件在做打分排序的時候,我需要對軟體的欄位進行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"
            }
          }
        }
      ]
    }
  }
}

 

# # 官網文件上的內容以及需要主義的點

 待整理 

相關文章