스크립트 함수를 사용하려면 구성 파일 elasticsearch.yml 에 설정해야 합니다
컴퓨터 프로그래밍 언어
스크립트. disable_dynamic: false
Elastic Search 스크립트에 대한 문장 정보는 항상 끊임없이 수정됩니다.
ES 는 업데이트를 지원하지만 업데이트는 제공된 스크립트를 통해 이루어집니다. ES 가 한 일은
Index 는 레코드가 저장된 해당 노드를 찾아 스크립트를 실행한 후 새 인덱스를 반환합니다. 사실, 이것은 획득 및 색인 재지정 프로세스입니다.
버전 관리는 다른 업데이트 작업을 제어하지 않습니다 (이 기능은 0. 19 이후에 사용 가능). 구체적인 구현 원칙은 elasticsearch 와 일치해야 합니다.
버전 관련.
Get, reindex 는 es 가 먼저 이 레코드를 꺼낸 다음 새 데이터를 기반으로 새 레코드를 생성한 다음 다시 ES 에 넣는 것을 의미합니다 (이전 레코드를 덮어쓰지 않음).
지금은 데이터가 없습니다. 먼저 레코드를 만들어야 합니다.
컴퓨터 프로그래밍 언어
$ curl-xputlocalhost: 9200/xiaorui.cc/blog/1-d' {
[카운터]: 1,
태그: ["빨강"]
}'
$ curl-xputlocalhost: 9200/xiaorui.cc/blog/1-d' {
[카운터]: 1,
태그: ["빨강"]
}'
데이터를 직접 수정할 때는 직접 업데이트가 이전 데이터를 덮어쓴다는 점에 유의해야 합니다. 또한 업데이트 시 /index/type/id 가 필요하며 id 가 있어야 합니다. Elasticsearch 는 수정된 데이터를 업데이트하기 위한 검색 질의 모드를 지원하지 않아야 합니다.
컴퓨터 프로그래밍 언어
Curl-xput' localhost: 9200/xiaorui.cc/blog/1? 예쁘다
{
[이름]: "xiaorui.cc"
}'
Curl-xput' localhost: 9200/xiaorui.cc/blog/1? 예쁘다
{
[이름]: "xiaorui.cc"
}'
Elasticsearch 는 이전 데이터를 직접 덮어쓰지 않고 로컬에서 수정할 수 있는 로컬 업데이트 매개변수 doc 를 제공합니다. 특정 k v 필드에 대해 수정됩니다.
컴퓨터 프로그래밍 언어
Curl-xpost' localhost: 9200/xiaorui.cc/blog/1/_ 업데이트? 예쁘다
{
Doc: {"이름": "서풍운"}
}'
Curl-xpost' localhost: 9200/xiaorui.cc/blog/1/_ 업데이트? 예쁘다
{
Doc: {"이름": "서풍운"}
}'
Elasticsearch API 가 요구 사항을 충족하지 못할 경우 Elasticsearch 를 사용하면 스크립트를 사용하여 자신의 논리를 구현할 수 있습니다. 스크립트는 검색, 정렬, 집계 및 문서 업데이트와 같은 많은 API 를 지원합니다. 스크립트는 요청의 일부로 실행할 수 있습니다. 스크립트 인덱스 또는 디스크에서 로드.
다음은 groovy 에서 개발한 es 스크립트의 사용법입니다. 다음 문은 counter 값에 4 를 더하는 것을 의미합니다.
컴퓨터 프로그래밍 언어
$ curl-xpost' localhost: 9200/xiaorui.cc/blog/1/_ update'-d' {
스크립트: CTX. _source.counter += count ",
"params": {
[수]: 4
}
}'
$ curl-xpost' localhost: 9200/xiaorui.cc/blog/1/_ update'-d' {
스크립트: CTX. _source.counter += count ",
"params": {
[수]: 4
}
}'
위의 예를 통해 우리는 tags 가 목록이라는 것을 알고 있다. Doc 가 로컬에서 업데이트한 구문을 사용하는 경우 추가할 수 없거나 tags 필드를 덮어씁니다. 그렇다면 목록 확장을 구현하는 방법은 무엇입니까? Elasticsearch 스크립트를 사용하여 구현하십시오.
컴퓨터 프로그래밍 언어
$ curl-xpost' localhost: 9200/xiaorui.cc/blog/1/_ update'-d' {
스크립트: CTX. _source.tags += tag ",
"params": {
[레이블]: "흰색"
}
}'
$ curl-xpost' localhost: 9200/xiaorui.cc/blog/1/_ update'-d' {
스크립트: CTX. _source.tags += tag ",
"params": {
[레이블]: "흰색"
}
}'
_update 는 upsert 기능도 지원합니다. 이 필드나 키워드가 없으면 해당 레코드가 추가됩니다. 여기 한 가지 예가 있습니다. 카운터 필드가 없는 경우 다음과 같이 삽입하십시오.
컴퓨터 프로그래밍 언어
$ curl-xpost' localhost: 9200/xiaorui.cc/blog/1/_ update'-d' {
스크립트: CTX. _source.counter += count ",
"params": {
[수]: 4
},
"upsert": {
[카운터]: 1
}
}'
$ curl-xpost' localhost: 9200/xiaorui.cc/blog/1/_ update'-d' {
스크립트: CTX. _source.counter += count ",
"params": {
[수]: 4
},
"upsert": {
[카운터]: 1
}
}'
좀 더 복잡한 groovy 스크립트의 사용법을 살펴 보겠습니다. 너의 출처가 중요한 중국이 없을 때, 나는 kv 를 추가할 것이다.
컴퓨터 프로그래밍 언어
Curl -XPOST "" -d "
{
스크립트: 다음 경우 (! Ctx. _ source.containskey (\ "China \") {CTX. _ source.attending = newField} ",
"params": {"newField": "blue"},
내 필드: 데이터
}'
Curl -XPOST "" -d "
{
스크립트: 다음 경우 (! Ctx. _ source.containskey (\ "China \") {CTX. _ source.attending = newField} ",
"params": {"newField": "blue"},
내 필드: 데이터
}'
다음 스크립트 구문은 비교적 복잡하며 사전 세트를 통과한 다음 판단하고 값을 할당합니다.
{
55555″: 22,
[이름]: "이사",
"distr_pan": [
{
[k]:15,
[v]:15
},
{
K”:20,
[v]: 20
}
] 을 참조하십시오
}
컴퓨터 프로그래밍 언어
$ curl-xput' localhost: 9200/xiaorui.cc/blog/9123/_ update'-d'
{
스크립트: def x = falsectx 입니다. _ source.distr _ pan.each ({if (it.get ('k') = = target) {x = true}}); If(x){ctx. _source.distr_pan +=v} ",
"params":{
"v":{"k":nlp," v":35},
[목표]: 15
}
}
$ curl-xput' localhost: 9200/xiaorui.cc/blog/9123/_ update'-d'
{
스크립트: def x = falsectx 입니다. _ source.distr _ pan.each ({if (it.get ('k') = = target) {x = true}}); If(x){ctx. _source.distr_pan +=v} ",
"params":{
"v":{"k":nlp," v":35},
[목표]: 15
}
}
Elasticsearch 스크립트는 여기서 끝납니다. 많은 예들이 간단합니다.
스크립트가 안전하지 않은 것 같습니다. 적어도 원격 코드 실행의 허점은 이미 여러 번 노출되었다. 다음에 파이썬 버전의 스크립트를 시도해 보세요.
우리에게 groovy python 은 별로 크지 않지만 문법은 똑같아 보입니다.