본문 바로가기

Elastic Search

mapping, aggregation, 추가적인 검색

mapping

 매핑 설정
    > curl -XPUT localhost:9200/index명칭/_mapping/tyep명칭 -H "Content-Type: application/json" -d"{
          \"properties\" : {
              \"Field명칭\" : {
                   \"type\" : \"타입\"
              }
           }
       }"
 매핑 확인
    > curl -XGET localhost:9200/index명칭/_mapping

RDBMS의 스키마와 비슷한 개념
키바나와 효과적으로 연동하기 위해 효율적인 매핑이 요구됨
* 한개의 index에 여러개의 type을 만들지 않는 것을 권장함

* 이미 생성된 매핑을 수정할 수 없다. - 데이터의 유무에 상관없이 매핑수정은 불가능

* 매핑시에 type을 text로 지정하고도 집계를 사용하고 싶은경우에 fields를 추가하여 추가적으로 타입을 지정한다.
  ex) employer:
              type: "text"
              ,fields:
                   keyword:
                        type:"keyword"

외부접속
 * Elasticsearch는 기본적으로 로컬에서만 접속하도록 설정 되어있다
    > elasticsearch\config\elasticsearch.yml 파일에 들어가서
       55번째 줄 #network.host: 192.168.0.1 을 network.host: 0.0.0.0 으로 바꿔준다.

Aggregation

 : document안의 값들을 조합해서 나타내고자 할때 쓰이는 기법

    1. Metric Aggregation
          : document 값을을 산술값들을 구할때 사용한다.
              ex) 최대값, 최소값, 평균값등
          > curl localhost:9200/index명/_search "{\"aggs\":{\"임의의 명칭\":{\"stats\":{\"field\":\"field명칭\"}}}}"
             - 지정한 필드명칭을 기준으로 count, min, max, avg 등을 보여준다.
    2. Bucket Aggregation
          : 검색하고자하는 데이터를 그룹화 해서 보여주고자 할때 사용
              ex) group by
          > curl localhost:9200/index명/_search -d "{\"aggs\":{\"임의의 명칭\":{\"terms\":{\"field\":\"field명칭\"}}}}"
              - 지정한 필드명칭으로 그룹화 된 데이터를 보여준다.

         ** mapping type이 text의 경우 "fielddata":true 를 mpaaing에 추가해 줘야 한다.
         ** mapping type이 integer인경우는 확인했으나 keyword에는 오류발생, fieliddata추가도 안됨

URL 검색
    1. AND 검색    
     : localhost/index명칭/_search?q=field명칭:[조건A + TO + 조건B] AND fiedl명칭:내용
    
    2. OR 검색
     : localhost/index명칭/_search?q=field명칭:[조건A + TO + 조건B] + fiedl명칭:내용

    3. 범위 검색
     : localhost/index명칭/_search?q=field명칭:[조건A + TO + 조건B] 

    4. like검색
     - wildcard를 사용해서 like검색을할 수 있으나 검색어의 맨 앞에 사용할 경우 성능이 저하된다.
     : localhost/index명칭/_search?q=field명칭:*내용* 

    
    5. NOT equal 
     : localhost/index명칭/_search?q=NOT (field명칭:내용)

    6. 정렬
     : localhost/index명칭/_search?q=field명칭:[조건A + TO + 조건B]&sort=field명칭:asc/desc

    7. 원하는 컬럼만 리턴
     : localhost/index명칭/_search?q=field명칭:[조건A + TO + 조건B]&_source/fields=field1,field2,field3...

    8. 부등식 검색
     : localhost/index명칭/_search?q=field명칭:</>/<=/>=조건


request 검색 (filter)
 * filter 방식이 match 방식보다 속도면에서 우수하다.
{
   "bool" : {
      "must" :     [],      -----------> "AND"
      "should" :   [],      -----------> "OR"
      "must_not" : [],      -----------> "NOT"
"filter": [] } }
형태로 사용

1. equals search
ex) KIBANA 사용시
GET bank/_search
{
    "query" : {
        "constant_score" : { 
            "filter" : {
                "bool" : {
                    "must" : [
                        { "term" : {"age" : 39}}, 
                        { "term" : {"city.keyword":"Nicholson"}} 
                    ]
                }
            }
        }
    }
}

2. like search
ex) KIBANA 사용시
GET bank/_search
{
    "query" : {
        "constant_score" : { 
            "filter" : {
                "bool" : {
                   "filter" : [
                        { "wildcard" : {"state.keyword":{"value" : "*D*"}}}
                    ]
                }
            }
        }
    }
}

3. range search
ex) KIBANA 사용시
{
    "query" : {
        "constant_score" : { 
            "filter" : {
                "bool" : {
                    "should" : [{
                        "range" : {
                            "age" : {
                                "gte" : 10,
                                "lte" : 20
                            }
                        }
                    }]
                }     
            }
        }
    }
}

4. 원하는 field만 가져오기
"_source":["age", "state"],
ex) KIBANA 사용시
GET bank/_search
{
    "_source":["age", "state"],
    "query" : {
        "constant_score" : { 
            "filter" : {
                "bool" : {
                   "filter" : [
                        { "wildcard" : {"state.keyword":{"value" : "*D*"}}}
                    ]
                }
            }
        }
    }
}



참고 사이트


'Elastic Search' 카테고리의 다른 글

Elastic Search 개요 및 간단한 CRUD  (0) 2019.09.05