[ElasticSearch] ElasticSearch DSL 더보기

2021. 12. 22. 20:05개발일지

1. Two Types of Clauses

  • 두 가지 종류의 절(clauses)를 사용하여 query를 구성한다.
  1. leaf query clauses : 특정 필드에 특정 값이 있는지 확인하는 절 (예: match, term, range 등)
  2. compound query clauses: leaf query나 compound query를 감싸서 여러 쿼리를 논리적으로 연결하는 절(예: bool, dis_max)

 

2. Query and Filter Context

  • Elasticsearch의 검색 결과는 relevance scores에 따라 정렬된다. search API 응답 결과의 _score이 relevance를 의미한다. Elasticsearch 기본적으로 BM25(관련 링크)를 사용하여 relevance를 계산한다.
  • 쿼리절이 query context에서 쓰이는 경우 relavance 계산에 고려되고 filter context에서 쓰이는 경우 relevance가 계산되지 않는다.
  1. query context
    • query context에서 사용되는 경우 해당 쿼리를 얼마나 만족하는지에 비례하여 relevance에 반영된다.
  2. filter context
    • filter context에서 사용되는 경우 해당 쿼리를 만족하는지, 아닌지만 검색 결과에 반영된다. relevance에는 영향을 미치지 않는다.
# "query"에 해당하는 조건은 만족하는 정도에 따라 relevance 계산에 반영
# "filter"에 해당하는 조건은 만족하는지 여부만 검색 결과에 반영
GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }},
        { "match": { "content": "Elasticsearch" }}
      ],
      "filter": [ 
        { "term":  { "status": "published" }},
        { "range": { "publish_date": { "gte": "2015-01-01" }}}
      ]
    }
  }
}

 

3. 쿼리의 종류

  • Elasticsearch 공식 문서에 따르면 쿼리의 종류에는 Compound queries, Full text queries, Geo queries, Shape queries, Joining queries, Match all, Span queries, Specialized queries, Term-level queries가 있다.
  • 이 중에서 Compound queries, Full text queries를 살펴본다.

3.1 Compound queries(자세한 설명 및 쿼리 별 사용 예시)

3.2 Full text queries(자세한 설명 및 쿼리별 사용 예시)

  • Full text queries를 이해하기 위해서는 analyzer를 알아야 한다. Full text queries는 쿼리와 문서를 모두 analyze하여, 그 결과를 대상을 검색을 진행하기 때문이다.
  • analyzer는 자연어로 들어온 쿼리를 char_filter -> tokenizer -> token_filter의 과정을 거쳐 쪼개고 정제하는 과정이다.(참고)
# analyzer 각 단계별 예시
"char_filter": "html_strip",     // html 태그 제거
"tokenizer": "whitespace"        // whitespace 기준 토큰 생성
"filter": "lowercase             // 모두 소문자로 변경
  • 인덱스 생성시에, char_filter, tokenizer, token_filter를 조합하여 analyzer를 설정하며(설정 방법), 정의된 analyzer를 원하는 필드에 매핑한다(매핑 방법).
  • 인덱스 생성시 매핑된 결과에 따라 데이터가 저장되기 때문에, 인덱스 생성 후에 필드별 analzyer를 변경할 수 없으며, 변경하려면 인덱스를 새로 생성해야 한다.

반응형

'개발일지' 카테고리의 다른 글

vscode tab 간격 설정  (0) 2021.12.31
cgi (common gateway interface)  (0) 2021.12.29
[linux] tmux 단축키 안 먹음  (0) 2021.12.23
[ElasticSearch] ElasticSearch 개요  (0) 2021.12.22
[git] submodule  (0) 2021.12.22