본문 바로가기

Elasticsearch

[Elasticsearch] node.js search 검색 사용법 / parameters / options

반응형

 

[ 업데이트 중.... ]

 

 

🤿  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는 범위를 말한다. 

 

 

 

 

 

 

 

 

 

 

반응형