검색 문구
엘라스틱서치 개념
엘라스틱서치 구문
엘라스틱서치 query
엘라스틱서치 쿼리
엘라스틱서치 쿼리 구문
엘라스틱서치 검색
엘라스틱서치 개념
score - 요청된 단어와 얼마나 유사한지 수치를 계산하여 높은 데이터를 반환한다
index ( 데이터의 집합 / 테이블 ) - 관련된 문서들의 집합
document ( 문서 / 데이터 ) - 실제로 저장된 데이터를 나타낸다. JSON 형식으로 표현되며 하나 이상의 필드를 가진다
Test 용 document ( 데이터 )
{
"contents" : "여러개의 물건들",
"kor_contents" : "여러개의 물건들",
"keyword_field": "여러개의 물건들"
}
데이터를 삽입하면 nori 분석기로 analyze 하면 위와 같이 tokenize( 파편화 되어 저장 ) 된다.
이렇게 데이터를 파편화하여 들어오는 요청에 따라 score 를 계산하여 관련성 높은 데이터를 반환한다.
구문
Match
전체 인덱스(테이블)에서 특정 필드와 부분적으로 일치한 데이터 (value)를 찾는다
텍스트가 파편화 되어있는 필드들을 비교한다.
기본적으로 전체 인덱스를 검색이 가능하다 / 밑의 예제처럼 인덱스를 지정해주면 특정 인덱스만 검색한다
Match_Phrase : 특정 구문이 존재 해야하고 구문 순서도 동일한 데이터를 찾는다.
옵션
Fuzziness - 맞춤법 오류 허용 정도 설정
Prefix length - 접두사 일치 길이 설정
Boost - 검색 결과 점수 조정
POST index_name/_search
{
"query": {
"match": {
"contents": "여러개의 물건들"
}
}
}
Term
특정 인덱스(테이블)에서 특정 필드의 특정 값을 가진 데이터를 찾는다.
텍스트 분석 과정 없는 원본 형태의 요청과 데이터를 비교한다. (밸류의 대소문자 / 순서 모두 일치 해야 함)
옵션
Case sensitivity: 대소문자 구분 여부 설정
POST index_name/_search
{
"query": {
"term": {
"contents": "여러개의 물건들"
}
}
}
Terms
특정 필드에서 특정 값들을 가진 데이터를 찾는다. (밸류의 대소문자 / 순서 모두 일치 해야 함)
POST index_name/_search
{
"query": {
"terms": {
"field_name": ["value1", "value2", "value3"]
}
}
}
Bool
복합적인 검색 기능을 구현하는데 사용한다.
여러가지의 조건으로 복합적인 검색기능을 구현한다.
옵션
must - 쿼리가 참인 도큐먼트들을 검색합니다.
- Exists : 검색결과가 존재 하는지 여부
must_not - 쿼리가 거짓인 도큐먼트들을 검색합니다.
should - 검색 결과 중 이 쿼리에 해당하는 도큐먼트의 점수를 높입니다.
filter - 쿼리가 참인 도큐먼트를 검색하지만 스코어를 계산하지 않습니다. must 보다 검색 속도가 빠르고 캐싱이 가능합니다.
Post index_name/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"message": "quick"
}
},
{
"match_phrase": {
"message": "lazy dog"
}
}
]
}
}
}
Range
숫자 또는 날짜와 같은 특정 범위 해당하는 값을 가진 데이터를 찾는다. (ISO8601 형식)
gte
(Greater-than or equal to) - 이상 (같거나 큼)
gt
(Greater-than) – 초과
lte
(Less-than or equal to) - 이하 (같거나 작음)
lt
(Less-than) - 미만 (작음)
Post index_name/_search
{
"query": {
"range": {
"price": {
"gte": 700,
"lt": 900
}
}
}
}
-----------------------
Post index_name/_search
{
"query": {
"range": {
"date": {
"gt": "2016-01-01"
--------------------
"gt": "31/12/2015",
"lt": "2018",
"format": "dd/MM/yyyy||yyyy"
}
}
}
}
Wildcard
와일드카드를 사용하여 패턴에 일치하는 값을 가진 문서를 찾는다.
검색 원리는 term 처럼 작동 하기 때문에 토크화가 된 단어를 기반으로 검색 한다.
RDBMS 의 like ‘%keyword% 가 아니다
문서를 색인할 때 토크나이징된 단어가 아니라면 inverted index에 들어 있지 않기 때문에,
비교 대상에 포함되지 않는다.
{
"query": {
"bool": {
"must": [
{
"wildcard": {
"title": "*여러개*"
}
}
]
}
},
"size": 100
}
#결과
{
"took": 243,
"timed_out": false,
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
--------------------------------------
{
"analyzer": "my_custom_analyzer",
"text": "여러개의 물건들"
}
{
"tokens" : [
{
"token" : "여러",
"start_offset" : 0,
"end_offset" : 2,
"type" : "MM",
"position" : 0
},
{
"token" : "개",
"start_offset" : 2,
"end_offset" : 3,
"type" : "NNB",
"position" : 1
},
{
"token" : "물건",
"start_offset" : 5,
"end_offset" : 7,
"type" : "NNG",
"position" : 2
},
{
"token" : "물건들",
"start_offset" : 5,
"end_offset" : 8,
"type" : "NNG",
"position" : 2
}
]
}
Query String
Term 과 같은 엄격한 연산을 한다
밑의 예제에 new york city 는 공백 연산자가 허용되지 않아 공백상태 그대로 전달 된다.
단어별로 검색하려면 (new AND york AND city) 로 입력 해야 한다.
{
"query": {
"query_string": {
"query": "(new york city) OR (big apple)",
"default_field": "content"
}
}
}
Aggregation
from과 to 속성을 지정하고, to에 지정한 값을 결과에서 제외된다.
{
"aggs":{
"bytes_range":{
"range":{
"field":"bytes",
"ranges":[{"from":1000,"to":2000}]
}
}
}
}
'개-발 > Infra' 카테고리의 다른 글
[EasticSearch ] BulkApi 사용법 ( action_request_validation_exception ) (0) | 2024.05.28 |
---|---|
[ElasticSearch] SpringBoot 3.x elasticsearch 8.x 연동 ( with.Kotlin ) (0) | 2024.05.06 |
[Redis] 선착순 이벤트 구현 레디스 분산락 (Redisson DistributeLock) (0) | 2024.03.03 |
[Kafka] MSA 서버간 비동기 통신 (요청 - 응답 모델) (0) | 2024.02.29 |
[Kafka + SSE] 실시간 알림 메세지 구현 (0) | 2024.01.10 |