[ 업데이트 중.... ]
🤿 Elasticsearch + node.js search 정리 및 실습
Query DSL : json 포맷으로 query를 만들어 검색하기
이를 실습하기 전 알아야할 개념
1) Query Context
"해당 document가 query 절과 얼마나 잘 일치하는가?" 라는 질문에 응답 => _score(관련성 점수) 로 표현
2) Filter Context
"해당 document가 query 절과 일치합니까?" 라는 질문에 응답 => true or flase로 반환, 점수는 계산하지 않음
index: 'test' 안에 있는 모든 도큐먼트를 가져오기
// search 실습 🍕
const searchResult = await client.search({
index: 'test'
})
console.log('search result = ', searchResult);
search result = {
took: 1,
timed_out: false,
_shards: { total: 1, successful: 1, skipped: 0, failed: 0 },
hits: {
total: { value: 810, relation: 'eq' }, // relation: 'eq' or 'gte'
max_score: 1,
hits: [
[Object], [Object],
[Object], [Object],
[Object], [Object],
[Object], [Object],
[Object], [Object]
]
}
}
search query의 parameter 중에는 "track_total_hits"가 있다.
track_total_hits는 true, false, integer로 설정 가능하다.
true일 경우 : hits가 받은 정확한 양을 반환한다. relation: 'eq'이 된다.
false일 경우 : hits된 총 수는 unknown이 된다.
an integer일 경우 : 상응하는 hits 수는 boundary 로써 수행한다.
hits.total = { value: 810, relation: 'eq' }
이 경우, hits의 정확한 수를 가지고 있다.
relation: 'gte'인 경우엔 Elasticsearch가 응답으로 준 것 보다 더 많은 hits가 있다는 뜻이다.
search result 분석
search returned result | |
took | Elasticsearch 가 검색 실행하는 데 걸린 시간 (milliseconds) |
timed_out | 검색 시간 초과 여부 |
_shards | 검색한 샤드 수 및 검색에 성공/실패한 샤드 수 |
hits | 검색 결과 |
hits.total | 검색 조건과 일치하는 도큐먼트의 총 개수 |
hits.hits | 검색 결과의 실제 배열 (search parameter - size로 크기 조정 가능, 기본 : 10개) |
hits.sort | 결과의 정렬 키 (점수 기준 정렬일 경우 표시되지 않음) |
Elasticsearch search parameters
Elasticsearch Parameters | |||
parameter 이름 | optional 여부 및 type |
Default Value |
설명 |
size | optional / integer |
10 | 리턴하는 hits 수를 정의한다. |
_source | options / string or boolean |
- | true : _source field를 리턴하겠다. false: _source field를 리턴하지 않겠다. 'field명' : 해당 'filed명'을 리턴하겠다. 여러개의 fields일 경우 -> ['field1', 'field2'] |
explain | optional / boolean |
false | true : score 계산이 어떻게 실행되었는지 자세한 정보를 hit의 부분으로 리턴 false: 안한다. |
실습
1. Bool Query 사용
const searchResult = await client.search({
index: 'test',
size: 10,
_source: ['idx'],
explain: true,
body: {
query: {
match: {
"idx":433
}
}
}
})
const searchResult = await client.search({
index: 'test',
size: 10,
_source: ['idx'],
explain: true,
body: {
query: {
bool: {
must: [
{"match": {
"idx": 433
}},
{"match": {
"address": "asdf"
}},
]
}
}
}
})
example
POST _search
{
"query": {
"bool" : {
"must" : {
"term" : { "user" : "kimchy" }
},
"filter": {
"term" : { "tag" : "tech" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tag" : "wow" } },
{ "term" : { "tag" : "elasticsearch" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}
Bool Query Occurrences
Occur | Description |
must | 반드시 matching documents에 있어야 한다. score에 영향을 준다. |
filter | 반드시 matching documents에 있어야 한다. 쿼리의 score는 무시된다. |
should | matching documents에 있어야 한다. 만약 bool query가 query context안에 있고 must나 filter문도 가지고 있는데 한 도큐먼트가 bool query에 매치되면 (비록 should queries가 아무것도 매칭되는 게 없을지라도) => 이 경우에는 should clauses는 오직 score에 영향을 주는 역할만 하게 된다. 즉, bool query 안 msut, filter가 should보다 강하다. 만약 bool query가 filter context이거나 must나 filter를 둘 다 가지고 있지 않는 경우엔 should 쿼리 중 최소 하나라도 매칭이되어야 bool query에 매칭된다. 이 행동은 "minimum_should_match" 인자값에 의해 조절될 수 있다. "minimum_should_match" : 3, -2, 75%, -25%, 3<90%, 여러개 : 2<-25% 9<-3도 가능 |
must_not | matching documents에 있어서는 안된다. Clauses는 filter context에 의해 실행되고 이는 scoring은 무시되고 clauses는 caching 캐싱으로 여겨진다는 것을 의미한다. scoring 은 무시된다. 때문에 0점 score를 가진 모든 documents 가 반환된다. |
2. filter - terms / range
{
"query" : {
"constant_score" : {
"filter": [
{ "term": { "status": [ "crime", "punishment" ] }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
terms
filter는 필터를 한다는 의미로 쉽게 이해가 가능하다. filter안의 terms는 오직 주어진 값과 매치되는 것을 필터링하고 이는 분석되지는 않는다. 위의 예제를 보면 'title' 필드에서 주어진 'crime' 또는 'punishment' 가 "정확히" 매치되는 것을 반환한다.
range
range는 범위를 말한다.
'Elasticsearch' 카테고리의 다른 글
[Elsticsearch] health check & version 버전 확인하기 (0) | 2022.05.24 |
---|---|
[Elasticsearch] 엘라스틱서치 관련도 score가 결정되는 방법 (0) | 2022.05.23 |
[Elasticsearch] Nori 설치 및 실습해보기 (0) | 2022.04.19 |
[Elasticsearch] scoring _score field 점수매기는 프로세스 (0) | 2022.04.19 |
docker compose ELK 설치하려다가 실패한 글 (0) | 2022.04.18 |