Database/Elaticsearch

Elastic Search Nested Query

BUST 2018. 5. 22. 16:21

Nested Query

- document에서 list의 object가 있는 구조
- 일반적인 DB에서의 1:N 구조를 하나의 document에 포함시키는 구조로 갈수가 있다.

Nested Mapping

PUT /my_index
{
    "mappings": {
        "type1" : {
            "properties" : {
                "obj1" : {
                    "type" : "nested"
                }
            }
        }
    }
}

- Type : nested


GET /_search

{

    "query": {

        "nested" : {

            "path" : "obj1",

            "score_mode" : "avg",

            "query" : {

                "bool" : {

                    "must" : [

                    { "match" : {"obj1.name" : "blue"} },

                    { "range" : {"obj1.count" : {"gt" : 5}} }

                    ]

                }

            }

        }

    }

}

- Nested Query

- Nested Type에 있는 데이터에 대해 쿼리를 날릴수가 있다.


참고사항 : bool query

- 포함이 안되어 있는 경우의 쿼리 (not): must_not

- 반드시 포함이 되어 있는 경우(and) : must

- 하나라도 포함이 되어 있는 경우 (or) : should


주의사항

- nested 쿼리안에 must_not 쿼리는 제대로 작동이 되지 않을수가 있다. 데이터가 아닌 경우에는 hit가 된다.
"b" : [{
"a": 1
},
{
"a" : 2
}]


Nest Query
"nested" : {
"path" : "b",
"query":{
"must_not" : {
  "match" : {
"a" : 1
  }
}
}
}
# 위와 같은 쿼리에서는 a:1 인경우가 있으니 결과값이 나오지 않아야 되지만. 실제를 b:1가 매칭이 되서 결과값이 hit가 된다.
- nested 쿼리를 긍정문으로 작성을 한뒤 bool 쿼리를 이용하여 must_not으로 하는 식으로 처리를 하면 된다.


참고자료

- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html


'Database > Elaticsearch' 카테고리의 다른 글

Elastic Search  (0) 2018.12.12
Lucene Segment  (0) 2018.08.26
로그성 데이터의 날짜 기반의 index 설계  (0) 2018.05.24
term aggregation 기능 사용하기  (0) 2018.05.24
_source를 이용하여 원하는 필드만 선택하기  (0) 2018.05.24