본문 바로가기

Elastic Stack

Elasticsearch 쿼리



https://victorydntmd.tistory.com/313

[Elasticsearch] 입문하기(3) - 다양한 검색 방법 ( Search API )

ES는 검색 엔진인 만큼 다양한 검색 API를 제공하며, 이를 잘 알아야 ES를 효과적으로 사용할 수 있을 것이라 생각합니다. 이번 글에서는 Search API에 대해 알아보겠습니다. 다음 글 Query DSL을 다루기

victorydntmd.tistory.com

Query DSL( Domain Specific Language )
https://victorydntmd.tistory.com/314

[Elasticsearch] 입문하기(4) - 다양한 검색 방법 ( Query DSL )

이번 글에서는 쿼리를 통해 검색을 하는 Query DSL( Domain Specific Language )에 대해 알아보겠습니다. 실습을 위한 테스트 데이터 셋팅과 Search API 개념과 관련하여 이전 글을 먼저 읽으시길 권장합니

victorydntmd.tistory.com

https://bakyeono.net/post/2016-08-20-elasticsearch-querydsl-basic.html

엘라스틱서치 쿼리 DSL 기초 | 박연오

bakyeono.net

성능을 위해선 필터 후 쿼리해야함
쿼리:캐시 불가, 느림, 연관성 점수 매김
필터:캐시 가능, 빠름,연관성 상관x

1. 쿼리
(1) match : 지정된 인덱스에서 color가 yellow 인 모든 문서를 검색
{
"query":{
"match":{
"color" : "yellow"
}
}
}
(2) match_all : 지정된 인덱스에서 모든 문서 검색
{
"query":{
"match_all":{}
}
}


2. 필터
(1) term : 지정한 필드에 지정한 텀이 들어있는 문서만 검색
{
"query" :{
"filtered" :{
"filter" : {
"term" : {"color":"yellow"}
}
}
}
}
(2) terms : 지정한 필드에 지정한 텀들이 들어있는 문서를 검색
{
"query" :{
"filtered" :{
"filter" : {
"terms" : {"color":["yellow" , "green"]}
}
}
}
}
(3) range : 지정한 범위에 포함되는 문서 검색 (수 와 날짜 필드에 최적화)
- gte : 크거나 같다
- gt : 크다
- lte : 작거나 같다
- lt : 작다
- boost
{
"query" :{
"filtered" :{
"filter" : {
"range" : {
"load_avg" : {
gte : "3" ,
lt : "6"
}
}
}
}
}
}
(4) exists : 필드에 어떤 값이든 존재하면 매치
{
"query" :{
"filtered" :{
"filter" : {
"exists" : {"field":"url"}
}
}
}
}

(5) regexp : 정규표현식
{
"query" : {
"regexp" : {
"phone_num": ".*1234"
}
}
}
1234로 끝나는 모든 문서 출력
https://www.elastic.co/guide/en/elasticsearch/reference/6.7/query-dsl-regexp-query.html#regexp-syntax

Regexp Query | Elasticsearch Guide [6.7] | Elastic

We will not attempt to explain regular expressions, but just explain the supported operators.

www.elastic.co

(6) bool : 필터를 and, or, not 논리연산 할 때 쓰임
must: 문서가 모든 필터에 매치되어야 매치된다. (AND)
should: 문서가 하나의 필터라도 매치되면 매치된다. (OR)
must_not: 문서가 필터에 매치되지 않아야 매치된다. (NOT)
filter : must와 같이 filter 절에 지정된 모든 쿼리가 일치하는 document를 조회하지만, Filter context에서 실행되기 때문에 score를 무시합니다.
bool 쿼리 내에 위의 각 절들을 조합해서 사용할 수도 있고,
또한 bool 절 내에 bool 쿼리를 작성할 수도 있다.

쿼리
나이가  20 이지만 직업이 학생이 아닌
{
"query": {
"bool": {
"must": [
{ "match": { "age": "20" } }
],
"must_not": [
{ "match": { "job": "student" } }
]
}
}
}

필터
예) 장르가 편지, 키워드가 비정규직이고, 키워드에 현대자동차 또는 파업이 포함돼 있으며, 키워드에 현대중공업이 없는 문서
GET /_search
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{"term": {"genre": "편지"}},
{"term": {"keyword": "비정규직"}}
],
"should": [
{"term": {"keyword": "현대자동차"}},
{"term": {"keyword": "파업"}}
],
"must_not": [
{"term": {"keyword": "현대중공업"}}
]
}
}
}
}
}
bool 필터 안에 아무 필터나 담을 수 있다. bool 필터를 중첩하는 것도 가능하다.

예) (장르=편지 AND 키워드=비정규직) OR (장르=리뷰 AND 키워드=비정규직)

GET /_search
{
"query": {
"filtered": {
"filter": {
"bool": {
"should": [
{
"bool": {
"must": [
{"term": {"genre": "편지"}},
{"term": {"keyword": "비정규직"}}
]
}
},
{
"bool": {
"must": [
{"term": {"genre": "리뷰"}},
{"term": {"keyword": "비정규직"}}
]
}
}
]
}
}
}
}
}
bool 필터 전체는 캐시가 되지 않지만, 각각의 하위 필터는 캐시가 된다.





curl -k --user elastic:elastic123 -X GET "https://localhost?pretty"

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

elastalert rules 파일  (0) 2021.05.15
elastalert 설치하기  (0) 2021.05.15
ELK opendistro-alert Slack 연동  (0) 2021.05.07
elasticsearch 설치된 상태에서 opendistro alert 연동  (0) 2021.05.07
쿼리  (0) 2020.05.17