_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_match
나 range
가 하나씩 들어있을 때에는 둘 다 에러 없이 잘 실행됨
그런데 두개를 같이 넣으면 에러 발생
두 개 이상의 쿼리를 한 번에 쓰려면 bool
사용
GET t2_blogs_fixed2/_search
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "meetups",
"fields": ["title", "content"]
}
}
],
"filter": [
{
"range": {
"publish_date": {
"gte": "now-3y"
}
}
}
]
}
}
}
위 코드에서 range
가 must
내부에 작성되거나 multi-match
가 filter
내부에 작성되어도 hits 수는 동일
다만, 검색어와 연관관계를 높이기 위해서 multi-match
는 must
에 작성하였고, 작성일자에 따라 그 연관성이 영향을 받는다고는 판단하지 않지만 기간이 명시되어 있었으므로 filter
에 range
를 작성함
content
에 ingestion
이 포함되고content
에 logstash
가 포함되면 안 되며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
이나 remove
에 ignore_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개
이게 뭘까?