[ES] Search API

29324 단어 TILTIL

Elasticsearch의 꽃, 데이터 검색 search API


1. URI 검색

0) 단순 전체 조회 : _search

  • index 내 모든 값 검색
GET sampleindex/_search

1) 특정 field 값 검색 : ?q=필드명:검색값

  • index 내 특정 field 값 검색
  • sampleindex 내 gender field 값이 'F'인 데이터 검색
GET sampleindex/_search/?q=gender:F

2) 모든 field 값 검색 : ?q=검색값

  • index 내 모든 field 값 검색
  • sampleindex 내 모든 field에서 'F'라는 값이 있는 데이터 검색
GET sampleindex/_search/?q=F

3) 다중 조건 검색 : ?q=필드명1:검색값1 AND 필드명2:검색값2

  • 하나 이상의 검색값으로 데이터 검색
  • sampleindex 내 gender field 값은 'M'이고, country field 값은 'korea'인 데이터 검색
GET sampleindex/_search/?q=gender:M AND country:korea




2. RequestBody 검색 (QueryDSL)

>> 검색 관련 API

1) 특정 field 값 검색 : match / term

● match - 검색값 포함 데이터 검색, text 타입을 term으로 분해 후 검색

  • index 내 특정 field 값 검색
  • sampleindex 내 company field 값이 '아주 조오은 회사'인 데이터 검색
  • company field가 text type이라면(분해되어 역색인 되기 때문에) '조오은 회사', '아주 아주 조오은 회사', '조오은 우리 회사' 등 하나의 term이라도 겹치는 모든 데이터 출력
  • 해당 field 데이터 값에서 검색값의 비중이 클수록 max_score(검색 점수) 높음
    (max_score 높은 순으로 검색 결과 출력)
GET sampleindex/_search
{
   "query": {
      "match": {
         "company": "아주 조오은 회사"
      }
   }
}

● term - 이미 분석 완료되어 더이상 분해되지 않는 형태로 검색, keyword 타입 검색 시 사용

  • index 내 특정 field 값 검색
  • sampleindex 내 company field 값이 '아주 조오은 회사'인 데이터 검색
  • term으로 검색했기 때문에 값이 '아주 조오은 회사'인 데이터만 출력
GET sampleindex/_search
{
   "query": {
      "term": {
         "company": "아주 조오은 회사"
      }
   }
}

잠깐🖐, keyword 타입과 text 타입
text 타입 : 데이터가 저장되기 전에 분석되어 역색인 구조로 저장됨
keyword 타입 : 데이터가 더이상 분해되지 않고 그대로 저장됨

예) '엘라스틱서치 완전 정복' 저장 시
text 타입 : 엘라스틱서치 / 완전 / 정복 → '엘라스틱서치', '완전', '정복' 만 검색해도 검색됨
keyword 타입 : 엘라스틱서치 완전 정복 → '엘라스틱서치 완전 정복' 검색시에만 검색됨




2) 특정 field 구문 검색 : match_phrase

● match_phrase - 일치되는 데이터 구문 검색

  • index 내 특정 field 구문 검색(구문 그대로 검색)
  • 해당 구문을 그대로 가지고 있는 데이터만 검색
  • company 값이 '조오은 회사', '아주 조오은 회사', '아주아주 조오은 회사'인 경우 검색되지만
    '조오은 우리 회사'는 검색되지 않음
GET sampleindex/_search
{
   "query": {
      "match_phrase": {
         "company": "조오은 회사"
      }
   }
}



3) 여러 field 대상 검색 : multi_match

● multi_match - 다중 match 검색

  • index 내 한 개 이상 field 대상 match 검색
  • match와 동일한 방식으로 작동, 다중 match 검색
  • companyAddress field와 personalAddress field에 '서울' 값이 포함되는 데이터 검색
GET sampleindex/_search
{
   "query": {
      "multi_match": {
         "query": "서울",
         "fields": ["companyAddress", "personalAddress"]
      }
   }
}



4) 모든 데이터 값 검색 : match_all

● match_all - 단순 전체 조회

  • index 내 모든 값 검색
  • URI 검색의 GET sampleindex/_search 와 동일한 기능
  • sampleindex 내 모든 데이터 검색
GET sampleindex/_search
{
   "query": {
      "match_all": {}
   }
}



5) 다중 조건 검색 (bool 복합 쿼리) : bool-must / bool-must_not

● bool-must - 검색 조건에 ⭕해당하는 것만⭕ 검색

  • query - bool - must - match / match_phrase / term / ... 의 구조
  • must 안의 조건을 만족하는 데이터만 검색
  • must 조건이 하나만 있을 때에는 bool 복합 쿼리와 단순 쿼리 결과 동일
  • sampleindex 내에서 nickName field 값에 'gee'를 포함하고, company field 값에 '조오은 회사'를 구문 그대로 포함하는 데이터 검색
GET sampleindex/_search
{
   "query": {
      "bool": {
         "must": [
            {
               "match": {
                  "nickName": "gee"
               }
            },
            {
               "match_phrase: {
                  "company": "조오은 회사"
               }
            }
         ]
      }
   }
}

● bool-must_not - 검색 조건에 ❌해당하지 않는 것만❌ 검색

  • query - bool - must_noy - match / match_phrase / term / ... 의 구조
  • must 안의 조건을 만족하지 않는 데이터만 검색
  • sampleindex 내에서 nickName field 값에 'gee'를 포함하지않고, company field 값에 '조오은 회사'를 구문 그대로 포함하지않는 데이터 검색
GET sampleindex/_search
{
   "query": {
      "bool": {
         "must_not": [
            {
               "match": {
                  "nickName": "gee"
               }
            },
            {
               "match_phrase: {
                  "company": "조오은 회사"
               }
            }
         ]
      }
   }
}

● bool - must + must_not - must와 must_not 함께 사용

  • sampleindex 내에서 nickName field 값에 'gee'를 포함하고,
    company field 값에 '조오은 회사'를 구문 그대로 포함하면서,
    gender field 값에 'F'를 포함하지 않는 데이터 검색
GET sampleindex/_search
{
   "query": {
      "bool": {
         "must": [
            {
               "match": {
                  "nickName": "gee"
               }
            },
            {
               "match_phrase: {
                  "company": "조오은 회사"
               }
            }
         ],
         "must_not": [
            {
               "match": {
                  "gender": "F"
               }
            }
         ]
      }
   }
}



6) 검색 값 사이 term 지정 검색 : slop

● slop - query에 제시된 term 사이 다른 term의 수를 0~n개로 제한

  • query에 제시된 검색 값 term 사이 다른 term 개수 제한
  • sampleindex 내 company field 값이 아주 _다른term_ 회사인 데이터 검색
  • '아주 조은 회사', '아주 아주 조오은 회사'는 검색되지만 '아주 조오은 우리 회사'는 검색되지 않음
GET sampleindex/_search
{
   "query": {
      "match_phrase": {
         "company": {
            "query": "아주 회사",
            "slop": 1
         }
      }
   }
}



7) 검색 우선 순위 부여 : should

● should - 특정 조건을 만족하는 검색 결과에 우선 순위 부여 (= 더 높은 max_score 부여)

  • should 조건을 만족하는 검색 결과에 더 높은 max_score를 부여하여 검색 우선 순위 부여
  • nickName field 값에 'gee'를 포함하는 검색 결과 중, company field에 '조오은 회사'를 구문으로 포함하는 데이터에 우선 순위 부여
GET sampleindex/_search
{
   "query": {
      "bool": {
         "must": [
            {
               "match": {
                  "nickName": "gee"
               }
            }
         ],
         "should": [
            {
               "match_phrase": {
                  "company": "조오은 회사"
               }
            }
         ]
      }
   }
}



8) 검색 결과 필터링 : filter

● filter - max_score에 영향을 주지 않고 검색 결과 필터링

  • max_score에 영향을 주지 않고 = 검색 우선 순위는 바꾸지 않은 채 검색 결과 필터링
  • bool 복합쿼리로 다중 조건을 주는 것과 동일한 결과 출력
  • nickName field 값에 'gee'를 포함하는 검색 결과 중, company field에 '나쁜 회사'를 구문으로 포함하지 않는 데이터 선별하여 출력
GET sampleindex/_search
{
   "query": {
      "bool": {
         "must": [
            {
               "match": {
                  "nickName": "gee"
               }
            }
         ],
         "filter": [
            {
               "bool": {
                  "must_not": [
                     {
                        "match": {
                           "company": "나쁜 회사"
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}



9) 특정 범위 검색 : range

● range - 검색 범위 지정

  • gt : greater than - 초과
  • gte : greater than or equal - 이상
  • lte : less than or equal - 이하
  • lt : less than - 미만
  • from : range 출발점
  • to : range 끝점
GET sampleindex/_search
{
   "query": {
      "range": {
         "age": {
            "gte": 20,
            "lte": 29
         }
      }
   }
}



10) 접두/접미 검색 : prefix / serfix

● prefix - 접두어로 검색

  • 특정 field 지정, 해당 field 값의 맨 앞 term을 접두어로 간주하여 검색
  • companyAddress field 값의 맨 앞 term이 '서울'인 데이터 검색
GET sampleindex/_search
{
   "query": {
      "prefix": {
         "companyAddress": {
            "서울"
         }
      }
   }
}

● serfix - 접미어로 검색

  • 특정 field 지정, 해당 field 값의 맨 뒤 term을 접미어로 간주하여 검색
  • companyAddress field 값의 맨 뒷 term이 '타워'인 데이터 검색
GET sampleindex/_search
{
   "query": {
      "serfix": {
         "companyAddress": {
            "타워"
         }
      }
   }
}



11) 부분 값으로 검색 : wildcard

● wildcard - 부분 값으로 검색 (≒ sql의 like)

  • * : 철자 개수와 무관하게 부분 검색 (≒ sql의 like %)
  • ? : 철자 개수만큼 입력하여 부분 검색 (≒ sql의 like _)
GET sampleindex/_search
{
   "query": {
      "wildcard": {
         "nickName": {
            "지*"
         }
      }
   }
}
GET sampleindex/_search
{
   "query": {
      "wildcard": {
         "nickName": {
            "지?"
         }
      }
   }
}



12) null 값 제외 검색 : exists

● exists - 특정 field 값에 null이 있는 document 제외 검색

  • null 값이 있는 데이터를 제외하고 검색하고 싶을 때 사용
  • salary field 값이 null이 아닌 데이터만 출력
GET sampleindex/_search
{
   "query": {
      "exists": {
         "field": "salary"
      }
   }
}



>> 그 외 결과 출력 관련 API

13) 검색 결과 출력 개수 지정 : size

  • size를 지정하면 해당 개수만큼 결과 출력
  • default는 10
GET sampleindex/_search
{
   "size": 20,
   "query": {
      "match": {
         "company": "아주 조오은 회사"
      }
   }
}



14) 검색 결과 중 특정 field만 출력 : _soure

  • 검색 결과 중 지정한 field 값만 출력 (≒ sql의 select ~ from 에서 ~에 해당하는 부분)
  • default는 모든 field 값 출력
GET sampleindex/_search
{
   "_source": ["name", "age", "company"],
   "query": {
      "match": {
         "company": "아주 조오은 회사"
      }
   }
}


오늘은 여기까지..🔥

좋은 웹페이지 즐겨찾기