elasticsearch5.0.0中聚合和腳本的變化

聚合的變化javascript

聚合的變化,數字類型在新版本中進行了重構,採用了不一樣的數據結構,這種結構有更好的範圍查詢。然而,這種結構不參與文檔評分操做。爲了評估在後臺的匹配文檔的數量數字字段須要返回到運行的查詢中,這可能會致使效率的下降。java

若是這個數字字段須要進行排序,範圍查詢,統計聚合的時候,建議用keyword字段來代替數字字段。node

IP範圍聚合如今,Elasticsearch支持IPv6協議,ip地址在存儲的時候用了二進制存儲而不是用數字進行存儲。所以IP聚合的時候將不在返回數字範圍。api

地理信息網格聚合的時候,將再也不支持size: 0爲零,新版本中要求size必須是大於零的數字。安全

時間值不在支持小數,例如1.5h將不在被支持,應該寫成90m。數據結構

腳本的變化less

系統默認的腳本語言從Groovy 到Painless。Painless腳本語言有相似Groovy的語法,被設計爲更安全和更快。從Groovy 轉到Painless是很是簡單的。elasticsearch

Groovy和Painless在語法上有個顯著的不一樣是使用參數上。全部的Painless參數必須有一個前綴,好比:函數

Groovy:ui

{
  "script_score": {
    "script": {
      "lang": "groovy",
      "inline": "Math.log(_score * 2) + my_modifier",
      "params": {
        "my_modifier": 8
      }
    }
  }
}

Painless (my_modifer is prefixed with params):

{
  "script_score": {
    "script": {
      "lang": "painless",
      "inline": "Math.log(_score * 2) + params.my_modifier",
      "params": {
        "my_modifier": 8
      }
    }
  }
}

 script.default_lang的設置被移除,由於系統不在支持默認其餘腳本語言。若是要使用其餘腳本語言,須要在請求的參數中顯示的指出來。

本文由賽克 藍德(secisland)原創,轉載請標明做者和出處。

有部分已經存儲的過濾查詢是沒有制定具體的腳本語言,這時候默認的語言由script.legacy.default_lang設置。

在1.X版本中定義的內聯腳本/模板將被移除。基於腳本/模板的索引或者文件將被刪除。

腳本和字符串參數將再也不被使用,將使用腳本對象的語法來代替,這適用於update api, script sort, script_score function, script query, scripted_metric aggregation,script_heuristic aggregation。

內聯腳本將不在被使用。

{
  "script_score": {
    "lang": "groovy",
    "script": "Math.log(_score * 2) + my_modifier",
    "params": {
      "my_modifier": 8
    }
  }
}

被替換成了下面的寫法。

{
  "script_score": {
    "script": {
      "lang": "groovy",
      "inline": "Math.log(_score * 2) + my_modifier",
      "params": {
        "my_modifier": 8
      }
    }
  }
}

script和script_file參數將不在有效,由基於腳本或者模板的文件file來代替。

基於文件的腳本的用法將再也不有效:

{
  "script_score": {
    "script": "calculate-score",
    "params": {
      "my_modifier": 8
    }
  }
}

如今是:

{
  "script_score": {
    "script": {
      "lang": "groovy",
      "file": "calculate-score",
      "params": {
        "my_modifier": 8
      }
    }
  }
}

script_id參數將不在被使用,由id來代替。

{
  "script_score": {
    "script_id": "indexedCalculateScore",
    "params": {
      "my_modifier": 8
    }
  }
}

如今是:

{
  "script_score": {
    "script": {
      "id": "indexedCalculateScore",
      "lang" : "groovy",
      "params": {
        "my_modifier": 8
      }
    }
  }
}

模板查詢中的query參數將不在被使用,由inline參數代替。

{
    "query": {
        "template": {
            "query": {"match_{{template}}": {}},
            "params" : {
                "template" : "all"
            }
        }
    }
}

如今是:

{
    "query": {
        "template": {
            "inline": {"match_{{template}}": {}},
            "params" : {
                "template" : "all"
            }
        }
    }
}

搜索模板中的頂層模板template字段被替換爲一致的模板/腳本對象語法。

{
    "template" : {
        "query": { "match" : { "{{my_field}}" : "{{my_value}}" } },
        "size" : "{{my_size}}"
    },
    "params" : {
        "my_field" : "foo",
        "my_value" : "bar",
        "my_size" : 5
    }
}

如今是:

{
    "inline" : {
        "query": { "match" : { "{{my_field}}" : "{{my_value}}" } },
        "size" : "{{my_size}}"
    },
    "params" : {
        "my_field" : "foo",
        "my_value" : "bar",
        "my_size" : 5
    }
}

索引腳本和模板

索引腳本和模板已被存儲的腳本所取代,集羣state中存儲的腳本或者模板來代替.scripts索引。

存儲腳本的默認大小不能超過65535個字節。能夠經過script.max_size_in_bytes參數來修改這個值。若是腳本很是大,能夠考慮用native scripts本地腳原本代替存儲腳本。

之前存儲在.scripts索引中的腳本將不能在使用,如今ES將在集羣state中讀取腳本。升級到5.X後,.scripts索引依然存在,若是要繼續使用次腳本,須要將存儲在.scripts中的腳本遷移到集羣state中。二者的語法是同樣的,不須要修改。

Python遷移腳本

下面的Python腳本能夠用來導入索引腳本到羣集state中存儲:

from elasticsearch import Elasticsearch,helpers

es = Elasticsearch([
        {'host': 'localhost'}
])

for doc in helpers.scan(es, index=".scripts", preserve_order=True):
        es.put_script(lang=doc['_type'], id=doc['_id'], body=doc['_source'])

該腳本使用了官方Elasticsearch客戶端所以你須要確保在環境中安裝了客戶端。

Perl的遷移腳本

下面的Perl腳本能夠用來導入索引腳本到羣集state中存儲:

use Search::Elasticsearch;

my $es     = Search::Elasticsearch->new( nodes => 'localhost:9200');
my $scroll = $es->scroll_helper( index => '.scripts', sort => '_doc');

while (my $doc = $scroll->next) {
  $e->put_script(
    lang => $doc->{_type},
    id   => $doc->{_id},
    body => $doc->{_source}
  );
}

該腳本使用了官方Elasticsearch客戶端所以你須要確保在環境中安裝了客戶端。

驗證遷移腳本

當已經經過以前的腳本或以其餘方式遷移了,能夠用如下請求來驗證,例如:

GET _cluster/state?filter_path=metadata.stored_scripts

響應應該包括.scripts索引中的全部腳本。當證實全部的.scripts索引都被移走了,能夠刪除.scripts索引。

java API索引腳本

全部與索引腳本交互的方法都已被刪除。和存儲腳本進行交互的java API的方法在clusteradminclient類中。若是一個字符串須要提供bytesarray類應用,則提供腳本的惟一途徑是經過bytesreference實現。

腳本引擎如今只能有一種方式註冊

在5.0.0以前,腳本引擎能夠登記多方式。Javascript腳本語言能夠登記爲"lang": "js" 或者"lang": "javascript"。腳本引擎如今只能註冊一個單一的語言,全部的"lang": "js"將被替換爲"lang": "javascript"。

腳本的擴展文件名稱只能有一種寫法

以前腳本文件的擴展名有多種寫法,好比"js" 和"javascript",如今全部的擴展文件名只能有js這一種寫法。

.javascript文件後綴的方法將不在支持。

Update REST接口中刪除了string參數。

cript, script_id 和scripting_upsert查詢參數將被移除。

java傳輸客戶

TemplateQueryBuilder類將被移除。

TransportClient transportClient = TransportClient.builder()
        .settings(Settings.builder().put("node.name", "node"))
        .addPlugin(MustachePlugin.class)
        .build();
transportClient.addTransportAddress(
        new InetSocketTransportAddress(new InetSocketAddress(InetAddresses.forString("127.0.0.1"), 9300))
);

在QueryBuilders類中建立TemplateQueryBuilder實例的方法被移除。TemplateQueryBuilder的構造函數如今可使用。

模板查詢接口將不建議使用,在下個版本中將移除。

在GeoPoint腳本中將移除如下方法。

factorDistance

factorDistanceWithDefault

factorDistance02

factorDistance13

arcDistanceInKm

arcDistanceInKmWithDefault

arcDistanceInMiles

arcDistanceInMilesWithDefault

distanceWithDefault

distanceInKm

distanceInKmWithDefault

distanceInMiles

distanceInMilesWithDefault

geohashDistanceInKm

geohashDistanceInMiles

用下面的方法進行代替。

arcDistance, arcDistanceWithDefault, planeDistance, planeDistanceWithDefault, geohashDistance, geohashDistanceWithDefault

本文由賽克 藍德(secisland)原創,轉載請標明做者和出處。

相關文章
相關標籤/搜索