[ES] Search API
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": "아주 조오은 회사"
}
}
}
GET sampleindex/_search
GET sampleindex/_search/?q=gender:F
GET sampleindex/_search/?q=F
GET sampleindex/_search/?q=gender:M AND country:korea
>> 검색 관련 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": "아주 조오은 회사"
}
}
}
오늘은 여기까지..🔥
Author And Source
이 문제에 관하여([ES] Search API), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@geesuee/ES-Search-API저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)