* Elastic search의 검색은 크게 쿼리 컨텍스트와 필터 컨텍스트로 나누어진다. 이 둘의 차이점은 쿼리 컨텍스트는 정확하게 일치하는 목록을 검색하는 것이고 필터 컨텍스트는 검색조건에 맞는지 아닌지에 대해서만 표현하는 검색 방법이다. 또한 쿼리 컨텍스트는 유사도를 기준으로 더 정확한 결과를 먼저 알려준다.
GET tmdb_5000_movie3/_search # 쿼리 컨텍스트 예시
{
"query": {
"match": {
"category": "movie"
}
}
}
GET tmdb_5000_movie3/_search #필터 컨텍스트 예시
{
"query": {
"bool": {
"filter":
{"term": {
"category": "movie"
}
}
}
}
}
위의 예시를 보면 필드 컨텍스트 같은 경우에는 bool 안에 filter가 들어가게 되어 적합한 데이터인지만 확인하고 있다. 옛날 같은 경우에는 이 쿼리 컨텍스트와 필터 컨텍스트를 명확하게 구분했지만 논리 쿼리가 나오게 되며 이 두 개를 적절하게 조합하면서 사용한다고 한다.
*쿼리 스트링과 쿼리 DSL
Elastic Search 에는 쿼리문을 사용하는 방법이 2가지 있는데 스트링 방식과 DSL 방식이다 DSL 방식은 1번에서 예시로 사용한 방식이며 스트링 방식은 다음과 같다
GET tmdb_5000_movie3/_search?q=name:Starwars
이런 식으로 표현하기 떄문에 url 주소에도 사용 가능하고 사용하기는 편하지만 단점으로 가독성이 많이 떨어질 수도 있다는 것이다. 따라서 나는 많이 사용하지 않을 것 같다.
3. 쿼리
*전문 쿼리
- 전문 쿼리는 이름 그대로 전문을 검색하기 위해 사용하는 쿼리이며 인덱스 매핑 시 텍스트 타입이 권장된다
- 일반적으로 블로그, 기사처럼 글자가 많은 텍스트에서 특정 용어를 검색하기 위해 사용된다.
- 주로 match 쿼리를 사용하여 검색한다
- 전문 쿼리의 종류로는 매치, 매치 프레이즈, 멀티 매치, 쿼리 스트링 등이 있다.
*용어 수준 쿼리
- 용어 수준 쿼리는 전문 쿼리와 다르게 정확하게 일치하는 용어를 검색할 때 사용된다.
- 필드는 기본적으로 키워드 타입으로 매핑한다
- 일반적으로 숫자, 날짜, 범주형 데이터를 검색할 때 사용한다. SQL의 WHERE과 유사하다
- 용어 수준 쿼리에는 용어 쿼리 , 퍼지 쿼리 등이 있다.
*매치 쿼리
매치 쿼리에서의 간단한 예시는 다음 코드와 같다
GET tmdb_5000_movie3/_search
{
"_source": ["original_title"],
"query": {
"match": {
"original_title": {
"query": "star life",
"operator": "and"
}
}
}
}
위의 코드에 대해서 설명하자면 _source 부분은 현재 보려는 original_title 필드만 보이기 위해 설정하는 것이며 _source를 생략하면 모든 파라미터를 보여 준다. 이전과 다른 부분을 하나 더 보면 operator이라는 부분이 생긴 거를 볼 수 있다. 이것은 star와 life가 모두 포함된 도큐먼트를 찾아 달라는 것이며 operator를 생략하면 or 즉 둘 중 하나라도 포함되는 것들을 찾아 달라는 의미이다.
*용어 쿼리
용어 쿼리에서의 간단한 예시는 다음과 같다.
GET tmdb_5000_movie3/_search
{
"_source": ["original_title"],
"query": {
"term": {
"original_title": "star"
}
}
}
위으 코드에 대해서 설명해보자면 original_title이 star인 것들을 모두 검색해 달라는 의미이다. 완벽하게 같은 것들을 찾아주기 때문에 대소문자를 구분해서 찾아야 한다.
*용어들 쿼리, 멀티 매치 쿼리
우선 간단한 예시를 먼저 보자면 다음과 같다.
GET tmdb_5000_movie3/_search
{
"_source": ["original_title"],
"query": {
"terms": {
"original_title": ["star","wars"]
}
}
}
위의 코드 블럭을 보면 terms 즉 용어들 쿼리로 검색하겠다는 것이며 original_title이 star 또는 wars인 것들을 모두 찾아달라는 의미이다.
GET tmdb_5000_movie3/_search
{
"_source": ["original_title","tags"],
"query": {
"multi_match": {
"query": "star",
"fields": [
"tags",
"original_title"
]
}
}
}
위의 코드 블럭은 multi_match를 사용하여 멀티 매치 쿼리를 하는 것인데 fileds를 tag와 origianl_title로 설정함으로써 star가 존재하는 필드 중 개별 스코어가 가장 큰 값부터 볼 수 있게 된다 여기서 *과 같은 와일드카드를 사용하게 되면 유사한 필드들을 모두 검색해 볼 수 있다. 또한 필드 뒤에 ^2, ^3 등 가중치를 둬서 가장 먼저 보고 싶은 필드를 명시하는 방법도 있다.
우선 기본적인 검색 쿼리에 대해서 정리해 봤는데 아직 더 많은 쿼리들이 있기 때문에 아마 다음 포스팅에서 정리할 예정이다. Elastic search를 하면서 점점 재밌어지고 있는 것 같다. 최대한 빨리 ELK에 대해서 이해하고 실제로 프로젝트를 진행해 봐야겠다.
'프로그래밍 > ELK' 카테고리의 다른 글
Elastic Search 기본정리 (0) | 2022.09.07 |
---|---|
[DOCKER] ELK Stack 환경 구축하기 (0) | 2022.09.06 |