이전 포스팅 에서 간단하게 모델을 만들고, CRUD 를 테스트했다.
이번 포스팅에서는 조금 더 복잡한 CRUD를 해보기로 한다.
Nested 필드에 대한 자세한 설명은 [이곳을 클릭]하여 확인해보자.
이전 포스팅에서는 Person 의 age로 검색을 했다.
그렇다면, nested 필드인 address에서 검색을 해보자.
SELECT *
FROM Person p, Address a
WHERE p.personId = a.personId
AND a.country = 'KR'
==
SELECT *
FROM Person p
INNER JOIN Address a ON p.personId = a.personId
WHERE a.country = 'KR'
ES에서는 아래와 같이 하면 될거같지만..
GET person/_search
{
"query": {
"bool": {
"filter": [
{
"term": {"address.country": "KR"}
}
]
}
}
}
아무것도 안나온다. nested 안에 있는 데이터를 조회하기 위해서는 nested
키워드를 사용해야한다. 아래 쿼리로 다시 검색해보자.
GET person/_search
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "address",
"query": {
"bool": {
"filter": [
{
"term": {"address.country": "KR"}
}
]
}
}
}
}
]
}
}
}
이번엔 데이터가 제대로 나온다.
이전 포스팅에서는 doc_id 를 입력해야만 document를 삭제할 수 있었다.
그러나 조건에 따라 삭제하고싶은 경우가 있다. (MySQL 에서 where문)
이러한 경우는 스크립트로 해결이 가능하다.
DELETE
FROM Person
WHERE age = 27
POST /person/_delete_by_query
{
"query": {
"match": {
"age": 27
}
}
}
조금 응용해서 nested 안에 있는 데이터로 검색해서 삭제하려면
POST /person/_delete_by_query
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "address",
"query": {
"bool": {
"filter": [
{"term": {"address.country": "KR"}}
]
}
}
}
}
]
}
}
}
와 같이 작성할 수도 있다.
POST /person/_delete_by_query
{
"query":{
"bool":{
"filter":{
"script":{
"script": "doc['age'].value == 27"
}
}
}
}
}