elasticsearch使用painless的一些簡單例子

1居夹、背景

此篇文檔僅僅是簡單的記錄一下painless的一些簡單的例子疙描,防止以后忘記嗡贺,不過多涉及painless的語法。

2抖拦、準(zhǔn)備數(shù)據(jù)

2.1 mapping

PUT /index_person
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      },
      "province": {
        "type": "keyword"
      }
    }
  }
}

2.2 插入數(shù)據(jù)

PUT /index_person/_bulk
{"index":{"_id":1}}
{"name":"張三","age":20,"province":"湖北"}
{"index":{"_id":2}}
{"name":"李四","age":25,"province":"北京"}
{"index":{"_id":3}}
{"name":"王五","age":30,"province":"湖南"}

3升酣、例子

3.1 (update)更新文檔 id=1 的文檔,將 age 加 2歲

POST index_person/_update/1
{
  "script": {
    "lang": "painless",
    "source": """
      ctx['_source']['age'] += params['incrAge']
    """,
    "params": {
      "incrAge": 2
    }
  }
}

3.2 (update_by_query)如果 province 是北京的話态罪,就將 age 減少1歲

POST index_person/_update_by_query
{
  "query": {
    "term": {
      "province": {
        "value": "北京"
      }
    }
  },
  "script": {
    "lang": "painless",
    "source": """
      ctx['_source']['age'] -= params['decrAge']
    """,
    "params": {
      "decrAge": 1
    }
  }
}

3.3 (ctx.op)如果張三的年齡小于20歲就不處理噩茄,否則就刪除這個(gè)文檔

POST index_person/_update/1
{
  "script": {
    "lang": "painless",
    "source": """
      // 這是默認(rèn)值,表示的是更新值复颈,重新索引記錄
      ctx.op = 'index';
      if(ctx._source.age < 20){
        // 表示不處理
        ctx.op = 'none';
      }else{
        // 表示刪除這個(gè)文檔
       ctx.op = 'delete'; 
      }
    """
  }
}

3.4 (stored script)如果是湖南省則增加地市字段绩聘,值為長沙

3.4.1 創(chuàng)建存儲(chǔ)腳本

PUT _scripts/add_city
{
  "script":{
    "lang": "painless",
    "source": "ctx._source.city = params.city"
  }
}

add_city為腳本的id

3.4.2 使用存儲(chǔ)腳本

POST index_person/_update_by_query
{
  "query": {
    "term": {
      "province": {
        "value": "湖南"
      }
    }
  },
  "script": {
    "id": "add_city",
    "params": {
      "city": "長沙"
    }
  }
}

3.5 (pipeline)通過pipeline如果插入的文檔的age<10則放入到index_person_small索引中

3.5.1 創(chuàng)建pipeline

PUT _ingest/pipeline/pipeline_index_person_small
{
  "description": "如果插入的文檔的age<10則放入到index_person_small索引中",
  "processors": [
    {
      "script": {
        "source": """
            if(ctx.age < 10){
              ctx._index = 'index_person_small';
            }
          """
      }
    }
  ]
}

3.5.2 使用pipeline

PUT index_person/_doc/4?pipeline=pipeline_index_person_small
{
  "name":"趙六",
  "age": 8,
  "province":"四川"
}

3.5.3 運(yùn)行結(jié)果

運(yùn)行結(jié)果

3.6 function_score中使用script_score算分

3.6.1 需求

如果這個(gè)用戶是湖南的,則使用 age作為分?jǐn)?shù)

3.6.2 dsl

GET index_person/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "script_score": {
            
            "script": """
              if(doc.province.value == 0){
                return 0;
              }
            
              if(doc.province.value == '湖南'){
                return doc.age.value;
              }
              return 0;
            """
          }
        }
      ],
      "boost_mode": "sum",
      "score_mode": "sum"
    }
  }
}

3.6.3 運(yùn)行結(jié)果

運(yùn)行結(jié)果

3.7 script_fields 增加字段

GET index_person/_search
{
  "query": {"match_all": {}},
  "fields": [
    "double_age"
  ], 
  "script_fields": {
    "double_age": {
      "script": {
        "lang": "painless",
        "source": "doc.age.value * 2"
      }
    }
  }
}

3.8 runtime field 增加字段

3.8.1 需求

針對(duì)age<25的文檔,返回double_age字段凿菩,否則不處理驯遇。

3.8.2 dsl

GET index_person/_search
{
  "query": {
    "match_all": {}
  },
  "fields": [
    "double_age"
  ],
  "runtime_mappings": {
    "double_age":{ 
      "type": "keyword",
      "script": """
        if(doc.age.size() == 0){
          return;
        }
        if(doc.age.value < 25){
          emit(doc.age.value * 2 + '');
        }
      """
    }
  }
}

在runtime field 中,需要使用emit來返回?cái)?shù)據(jù)蓄髓,但是不是emit(null)

3.9 _reindex 中使用

3.9.1 dsl

POST _reindex
{
  "source": {
    "index": "index_person"
  },
  "dest": {
    "index": "index_person_new"
  },
  "script": {
    "lang": "painless",
    "source": """
      if(ctx._source.age < 25){
        ctx._source.tag = '年輕人';
      }else{
        ctx._source.tag = '中年人';
      }
    """
  }
}

3.9.2 運(yùn)行結(jié)果

運(yùn)行結(jié)果

3.10 script query 查詢age<25

GET index_person/_search
{
  "query": {
    "script": {
      "script": {
        "lang": "painless",
        "source": """
          if(doc.age.size() == 0){
            return false;
          }
          return doc.age.value < 25;
        """
      }
    }
  }
}

3.11 script 聚合

GET index_person/_search
{
  "size": 0, 
  "aggs": {
    "agg_province": {
      "terms": {
        "script": {
          "lang": "painless",
          "source": """
            return doc.province
          """
        }, 
        "size": 10
      }
    },
    "agg_age":{
      "avg": {
        "script": "params._source.age"
      }
    }
  }
}

4叉庐、painless腳本調(diào)試

painless腳本調(diào)試

可以通過Debug.explain來進(jìn)行一些簡單的調(diào)試。

5会喝、腳本中的doc[..]和params._source[..]

doc[..]:使用doc關(guān)鍵字陡叠,將導(dǎo)致該字段的術(shù)語被加載到內(nèi)存(緩存),這將導(dǎo)致更快的執(zhí)行肢执,但更多的內(nèi)存消耗枉阵。此外,doc[…]表示法只允許簡單的值字段(您不能從中返回json對(duì)象)预茄,并且僅對(duì)非分析或基于單個(gè)術(shù)語的字段有意義兴溜。然而,如果可能的話耻陕,使用doc仍然是訪問文檔值的推薦方法拙徽。
params[_source][..]: 每次使用_source都必須加載和解析, 因此使用_source會(huì)相對(duì)而言要慢點(diǎn)。

腳本中的doc[..]和params._source[..]

6诗宣、painless腳本中的上下文

painless腳本中的上下文

詳細(xì)了解膘怕,請(qǐng)參考這個(gè)文檔https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-contexts.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市召庞,隨后出現(xiàn)的幾起案子岛心,更是在濱河造成了極大的恐慌,老刑警劉巖篮灼,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忘古,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門瓶佳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旦袋,你說我怎么就攤上這事∷模” “怎么了疤孕?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長央拖。 經(jīng)常有香客問我祭阀,道長鹉戚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任专控,我火速辦了婚禮抹凳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伦腐。我一直安慰自己赢底,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布柏蘑。 她就那樣靜靜地躺著幸冻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咳焚。 梳的紋絲不亂的頭發(fā)上洽损,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音革半,去河邊找鬼碑定。 笑死,一個(gè)胖子當(dāng)著我的面吹牛又官,可吹牛的內(nèi)容都是我干的延刘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼赏胚,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼访娶!你這毒婦竟也來了商虐?” 一聲冷哼從身側(cè)響起觉阅,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秘车,沒想到半個(gè)月后典勇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叮趴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年割笙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眯亦。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伤溉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妻率,到底是詐尸還是另有隱情乱顾,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布宫静,位于F島的核電站走净,受9級(jí)特大地震影響券时,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伏伯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一橘洞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧说搅,春花似錦炸枣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至套才,卻和暖如春迂猴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背背伴。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工沸毁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人傻寂。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓息尺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疾掰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搂誉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容