[230425] module 3~4 실습 기록

뜨개발자·2023년 4월 25일
0

TIL

목록 보기
65/75

_source는 따로 설정해주지 않으면 default로 원본 자료의 모든 필드가 이 안에 담겨서 출력
"_source": ["필드명", ...]으로 어떤 필드만 담을지 선택할 수도 있음
"_source": false로 설정하면 해당하는 document의 인덱스 명과 id만 출력

특정 필드만 필요한 경우에는 fields가 더 효율적


GET t2_blogs_fixed2/_search
{
  "query": {
    "match": {
      "content": {
        "query": "open source",
        "operator": "and"
      }
    }
  }
}

match는 기본적으로 or연산 수행
and연산을 위해서는 match내에 query를 한 번 더 작성해서 "operator": "and"로 연산자를 설정해야 함


구분자로 구분된 문자열 각각이 아니라 전체 문자열을 검색어로 사용하고 싶을 때에는 match 대신 match_phrase 사용


GET t2_blogs_fixed2/_search
{
  "query": {
    "multi_match": {
      "query": "meetups",
      "fields": ["title", "content"]
    }
  }
}

GET t2_blogs_fixed2/_search
{
  "query": {
    "range": {
      "publish_date": {
        "gte": "now-3y"
      }
    }
  }
}

GET t2_blogs_fixed2/_search # 에러 발생 코드
{
  "query": {
    "multi_match": {
      "query": "meetups",
      "fields": ["title", "content"]
    },
    "range": {
      "publish_date": {
        "gte": "now-3y"
      }
    }
  }
}

query 내에 multi_matchrange가 하나씩 들어있을 때에는 둘 다 에러 없이 잘 실행됨
그런데 두개를 같이 넣으면 에러 발생
두 개 이상의 쿼리를 한 번에 쓰려면 bool 사용

GET t2_blogs_fixed2/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "meetups",
            "fields": ["title", "content"]
          }
        }
      ],
      "filter": [
        {
          "range": {
            "publish_date": {
              "gte": "now-3y"
            }
          }
        }
      ]
    }
  }
}

위 코드에서 rangemust 내부에 작성되거나 multi-matchfilter 내부에 작성되어도 hits 수는 동일
다만, 검색어와 연관관계를 높이기 위해서 multi-matchmust에 작성하였고, 작성일자에 따라 그 연관성이 영향을 받는다고는 판단하지 않지만 기간이 명시되어 있었으므로 filterrange를 작성함


  1. contentingestion이 포함되고
  2. contentlogstash가 포함되면 안 되며
  3. 프랑스어로 작성된 내용(fr-fr)을 검색
GET t2_blogs_fixed2/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "content": "ingestion" # ingestion을 포함
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "content": "logstash" # logstash를 미포함
          }
        }
      ], 
      "filter": [
        {
          "match": {
            "locale": "fr-fr" # 프랑스어로 작성
          }
        }
      ]
    }
  }
}

PUT _scripts/weekly_blogs
{
  "script": {
    "lang": "mustache",
    "source": {
      "query": {
        "bool": {
          "filter": [
            {
              "range": {
                "publish_date": {
                  "gte": "{{start_date}}",
                  "lte": "{{start_date}}||+1w"
                }
              }
            }
          ]
        }
      }
    }
  }
}

3.3장 2번 문제
템플릿 작성할 때에는 자동완성이 도와주지 않기 때문에 실제로 쿼리를 작성하고 그 부분만 옮겨다 넣는 것이 편한 듯
삭제는 아래처럼 진행

DELETE _scripts/weekly_blogs

pipeline 작성할 때, rename이나 removeignore_missing 옵션의 역할을 잘 모르겠음 => 공부 필요
ignore_failure 옵션이 존재하던데, 실패했을 때 그 실패를 무시하려면 사용하는 옵션이라고 생각됨
=> on_failure를 설정하면 오류가 발생했을 때 어떻게 다룰지를 설정할 수 있음
ignore_failure를 따로 설정하지 않으면 dafault로 false인 것 같고, on_failure가 정의되어 있지 않아도 기본 처리방식이 있는 것으로 보임


GET t2_blogs_fixed2/_search
{
  "size": 0,
  "aggs": {
    "NAME": {
      "terms": {
        "field": "category"
      }
    }
  }
}

POST categories/_bulk
{"create":{}}
{"uid": "blt26ff0a1ade01f60d","title":"User Stories"}
{"create":{}}
{"uid": "bltfaae4466058cc7d6","title": "Releases"}
{"create":{}}
{"uid": "bltc253e0851420b088","title": "Culture"}
{"create":{}}
{"uid": "blt0c9f31df4f2a7a2b","title": "News"}
{"create":{}}
{"uid": "blt1d90b8e0edce3ea9","title": "Engineering"}

PUT _enrich/policy/t2_categories_policy
{
  "match": {
    "indices": "categories",
    "match_field": "uid",
    "enrich_fields": ["title"]
  }
}

POST _enrich/policy/t2_categories_policy/_execute

순서대로 실행했을 때, 마지막에 enrich policy 실행하는 부분에서 런타임 에러가 발생... 왜?
그런데 이 정책으로 enrich 실행하는 자체는 잘 돌아갔음 뭘까 왤까
=> 다음에 다시볼것


# Request
GET t2_blogs_fixed2/_search
{
  "size": 0,
  "runtime_mappings": {
    "authors.uid": {
      "type": "keyword"
    }
  },
  "aggs": {
    "top_uids": {
      "terms": {
        "field": "authors.uid"
      }
    }
  }
}

# Response
{
  "took" : 488,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4659,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "top_uids" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 4722,
      "buckets" : [
      ....
      ...
      ...
      
}

전체 자료 개수는 4659개
authors.uid라는 필드를 런타임 동안에 작성하였지만 내용이 아무것도 없을 것이기 때문에 aggregation이 진행되는 것은 하나도 없을 것으로 예상
=> 전체 조회와 동일하게 4659개의 bucket이 나오는 것이 맞다고 생각함
그런데 결과에서 보이는 sum_other_doc_count가 4722개
이게 뭘까?

profile
뜨개질하는 개발자

0개의 댓글