본문 바로가기

엘라스틱 서치

뉴스 데이터를 위한 엘라스틱 서치 쿼리 모음

뉴스 데이터를 저장하고, 쿼리로 조회한다.

1. 인덱스 생성

// PUT http://{ip}:{port}/hani-news-topic-index
{
    "settings": {
        "analysis": {
            "analyzer": {
                "keyword_extract_analyzer": {
                    "type": "custom",
                    "tokenizer": "keyword_extract_tokenizer",
                    "filter": [
                        "keyword_extract_stop_filter",
                        "keyword_extract_stop_tags_filter"
                    ]
                },
                "keyword_stopword_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [
                        "keyword_extract_stop_filter",
                        "keyword_extract_stop_tags_filter"
                    ]
                }
            },
            "tokenizer": {
                "keyword_extract_tokenizer": {
                    "type": "nori_tokenizer",
                    "decompound_mode": "discard"
                }
            },
            "filter": {
                "keyword_extract_stop_filter": {
                    "type": "stop",
                    "stopwords_path": "./settings/stop/korean.txt"
                },
                "keyword_extract_stop_tags_filter": {
                    "type": "nori_part_of_speech",
                    "stoptags": [
                        "E","IC","J","MAG","MAJ","MM","SP",
                        "SSC","SSO","SC","SE","XPN","XSA",
                        "XSN","XSV","UNA","NA","VSV",
                        "SF","VA","VCN","VCP","VX",
                        "VV","NR","XR","NP","SN"
                    ]
                },
                "keyword_extract_synonym_filter": {
                    "type": "synonym",
                    "synonyms_path": "./settings/synonym/korean.txt",
                    "updateable": true
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "id": {
                "type": "keyword"
            },
            "대분류": {
                "type": "keyword"
            },
            "중분류": {
                "type": "keyword"
            },
            "제목": {
                "type": "text"
            },
            "작성시간": {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm"
            },
            "썸네일 이미지": {
                "type": "keyword"
            },
            "썸네일 캡션": {
                "type": "keyword"
            },
            "본문": {
                "type": "text"
            },
            "기사주소": {
                "type": "keyword"
            },
            "키워드": {
                "type": "text",
                "analyzer": "keyword_stopword_analyzer",
                "fielddata": true
            },
            "요약": {
                "type": "text"
            }
        }
    }
}

2. 인덱스 삭제

// DELETE http://{ip}:{port}:9200/hani-news-topic-index

3. 인덱스 내 다큐먼트 조회

// GET http://{ip}:{port}:9200/hani-news-topic-index/_search

4. 인덱스 매핑 조회

// GET http://{ip}:{port}:9200/hani-news-topic-index/_mapping

5. Analyze 테스트

// POST http://{ip}:{port}/hani-news-topic-index/_analyze
{
    "text": [
        "것",
        "사과"
    ],
    "analyzer": "keyword_stopword_analyzer"
}

6. 리인덱싱

// POST http://{ip}:{port}/_reindex
{
    "source":{
        "index": "hani-news-topic-index"
    },
    "dest": {
        "index": "hani-news-topic-index-tmp"
    }
}

7. 대분류 다큐먼트 개수 조회

// POST http://{ip}:{port}/hani-news-topic-index/_search
{
    "track_total_hits": true,
    "query": {
        "match": {
            "대분류": "국제"
        }
    }
}

8. 연도별 개수 조회

// POST http://{ip}:{port}/hani-news-topic-index/_search
{
    "track_total_hits": true,
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "작성시간": {
                            "gte": "2013-01-01 00:00",
                            "lt": "2024-12-31 00:00"
                        }
                    }
                }
            ]
        }
    }
}

9. 연도, 대분류, 키워드, 요약에 해당하는 랜덤 기사 하나 조회

// POST http://{ip}:{port}/hani-news-topic-index/_search
{
    "size": 1,
    "query": {
        "function_score": {
            "query": {
                "bool": {
                    "must": [
                        {
                            "range": {
                                "작성시간": {
                                    "gte": "2023-01-01 00:00",
                                    "lt": "2024-01-01 00:00"
                                }
                            }
                        },
                        {
                            "match": {
                                "대분류": "스포츠"
                            }
                        },
                        {
                            "match": {
                                "키워드": "손흥민"
                            }
                        },
                        {
                            "match": {
                                "요약": "손흥민"
                            }
                        }
                    ]
                }
            },
            "functions": [
                {
                    "random_score": {}
                }
            ],
            "score_mode": "sum"
        }
    }
}

10. 키워드 Top 100 조회

// POST http://{ip}:{port}/hani-news-topic-index/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "대분류": "사회"
                    }
                },
                {
                    "range":{
                        "작성시간":{
                            "gte": "2022-01-01 00:00",
                            "lte": "2022-12-31 23:59"
                        }
                    }
                }
            ]
        }
    },
    "size": 0,
    "aggs": {
        "keyword_terms": {
            "terms": {
                "field": "키워드",
                "size": 100
            }
        }
    }
}

11. 연도별 키워드 조회

// POST http://{ip}:{port}/hani-news-topic-index/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "작성시간": {
                            "gte": "2015-01-01 00:00",
                            "lt": "2016-01-01 00:00"
                        }
                    }
                },
                {
                    "match":{
                        "대분류": "경제"
                    }
                }
            ]
        }
    },
    "size": 0,
    "aggs": {
        "keyword_terms": {
            "terms": {
                "field": "키워드",
                "size": 1000
            }
        }
    }
}

12. most_like_test 테스트

// POST http://{ip}:{port}/hani-news-topic-index/_search
{
    "from": 0,
    "size": 10000,
    "query": {
        "more_like_this": {
            "like": [
                {
                    "_index": "hani-news-topic-index",
                    "_id": "c33049bb-e879-470e-8e77-7654bf4d3a53"
                }
            ],
            "max_query_terms": 12,
            "min_term_freq": 1,
            "min_doc_freq": 5,
            "max_doc_freq": 2147483647,
            "min_word_length": 0,
            "max_word_length": 0,
            "minimum_should_match": "30%",
            "boost_terms": 0.0,
            "include": false,
            "fail_on_unsupported_field": true,
            "boost": 1.0
        }
    },
    "version": true,
    "explain": false
}

13. 특정 기사와 연관있는 연도별 대표 기사 조회

// POST http://{ip}:{port}/hani-news-topic-index/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "more_like_this": {
                        "like": [
                            {
                                "_index": "hani-news-topic-index",
                                "_id": "871b5fa9-daed-44d2-a89e-acb1442bcfc0"
                            }
                        ],
                        "max_query_terms": 12,
                        "min_term_freq": 3,
                        "min_doc_freq": 5,
                        "max_doc_freq": 2147483647,
                        "min_word_length": 0,
                        "max_word_length": 0,
                        "minimum_should_match": "50%",
                        "boost_terms": 0.0,
                        "include": true,
                        "fail_on_unsupported_field": true,
                        "boost": 1.0
                    }
                },
                {
                    "range":{
                        "작성시간":{
                            "gte": "2021-01-01 00:00",
                            "lt": "2025-01-01 00:00"
                        }
                    }
                }
            ]
        }
    },
    "size": 0,
    "aggs": {
        "most_relate_per_year": {
            "date_histogram": {
                "field": "작성시간",
                "calendar_interval": "year",
                "format": "yyyy"
            },
            "aggs": {
                "related_top_per_year": {
                    "top_hits": {
                        "size": 1,
                        "sort": [
                            {
                                "_score": {
                                    "order": "desc"
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
}

14. 오답 키워드를 위한 조회

// POST http://{ip}:{port}/hani-news-topic-index/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "작성시간": {
                            "gte": "2023-01-01 00:00",
                            "lt": "2024-01-01 00:00"
                        }
                    }
                },
                {
                    "match": {
                        "대분류": "경제"
                    }
                }
            ],
            "must_not": [
                {
                    "match": {
                        "키워드": "인공지능"
                    }
                }
            ]
        }
    },
    "size": 0,
    "aggs": {
        "keyword_terms": {
            "terms": {
                "field": "키워드",
                "size": 5
            }
        }
    }
}

15. 데이터 백업을 위한 레포지토리 생성

// PUT http://{host}:{port}/_snapshot/backup/backup_20240408?wait_for_completion=true
{
  "indices": "hani-news-topic-index",
  "ignore_unavailable": false,
  "include_global_state": true
}

16. 데이터 백업

// PUT http://{host}:{port}/_snapshot/backup/backup_20240408?wait_for_completion=true
{
  "indices": "hani-news-topic-index",
  "ignore_unavailable": false,
  "include_global_state": true
}

17. 데이터 복원

// POST http://{host}:{port}/_snapshot/backup/backup_20240408/_restore