뉴스 데이터를 저장하고, 쿼리로 조회한다.
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
'엘라스틱 서치' 카테고리의 다른 글
Spring Boot Jpa 네이티브 쿼리로 엘라스틱서치 쿼리 구현하기 (0) | 2024.05.26 |
---|---|
스프링부트로 엘라스틱서치 쿼리 날리기 (0) | 2023.06.09 |
ELK, Mysql, Kafka 구축 및 연동 (0) | 2023.06.02 |
스프링부트 테스트와 엘라스틱서치 테스트 컨테이너 (0) | 2023.05.27 |
엘라스틱서치 검색 Query DSL (0) | 2023.05.18 |