Elasticsearch 가 어떻게 사용되는지 말해 보세요.

오늘 elasticsearch 의 업데이트 기능과 스크립트 스크립트를 사용하여 데이터를 업데이트하는 방법에 대해 자세히 설명하겠습니다.

스크립트 함수를 사용하려면 구성 파일 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 은 별로 크지 않지만 문법은 똑같아 보입니다.