๐ผ์ ์ํ๐ผ | ๐ฑ์ก์ค์ฃผ๐ฑ | ๐ถํ์ ๊ฒฝ๐ถ | ๐ค์๋ค์ฐ๐ค |
Server / Data / BE | AI / Data / BE | Infra / BE / FE | BE / FE |
๋ณธ ๋ ํฌ์ ๋ชฉํ๋ ์ฌ์ฉ์๊ฐ ๋์ฑ ์ ํํ๊ณ ๋น ๋ฅด๊ฒ ์ํ๋ ์ฑ
์ ์ฐพ์ ์ ์๋๋ก ๊ฒ์ ๊ธฐ๋ฅ์ ๊ณ ๋ํํ๋ ๊ฒ์
๋๋ค. ํ๊ตญ์ด ๋ฐ ์์ด ์ ๋ชฉ ๊ฒ์๊ณผ ์ ์ ๊ฒ์์ ์ ํ๋์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ ์ฌ๋ฌ ์ ๋ต์ ๊ตฌํํ์ต๋๋ค.
- ํ๊ตญ์ด ๊ฒ์ ์ต์ ํ:
nori_tokenizer
์ ํํฐ(nori_readingform
,nori_part_of_speech
)๋ฅผ ์ ์ฉํ์ฌ ํ๊ตญ์ด ๋ณตํฉ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๊ฒ์ ์ ํ๋๋ฅผ ๋์์ต๋๋ค. - ์์ด ์ ๋ชฉ ๊ฒ์ ๊ฐํ: ๋ชจ๋ ์์ด ์ ๋ชฉ์ ๋ํ ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด ๊ฒ์ํ ์ ์๋๋ก
lowercase_filter
๋ฅผ ์ ์ฉํ์ต๋๋ค. - ์ปค์คํ ๋ถ์๊ธฐ ์ ์ฉ: ์ด๋ฌํ ์ค์ ์ ํฌํจํ ์ปค์คํ ๋ถ์๊ธฐ๋ฅผ ์ ๋ชฉ ํ๋์ ์ ์ฉํ์ฌ, ์ ๋ชฉ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ณ ๋ํํ์ต๋๋ค.
- ๋ถ๋ถ ์ผ์น ๊ฒ์ ๊ฐ๋ฅ:
edge_ngram_filter
๋ฅผ ์ ์ฉํ์ฌ ์ ์ ์ด๋ฆ์ ๋ถ๋ถ ์ผ์น ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค. ์ฌ์ฉ์๋ ์ฟผ๋ฆฌ์ ์ผ๋ถ๋ง์ผ๋ก๋ ์ ์๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค. - ๋์๋ฌธ์ ๊ตฌ๋ถ ์๋ ๊ฒ์: ์ ์ ๊ฒ์ ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋๋ก
lowercase_filter
๋ฅผ ์ ์ฉํ์ต๋๋ค.
- ๋ฐฑ์๋ ์ฑ๋ฅ ํฅ์: ๊ฒ์ ์์คํ ์ ๋ฐฑ์๋๋ฅผ Go ์ธ์ด๋ก ์์ฑํ์ฌ ํ๋ก ํธ์๋์์ ํต์ ์๊ฐ์ ๋ํญ ์ค์์ต๋๋ค. Go์ ๋น ๋ฅธ ์คํ ์๋ ๋๋ถ์ ๊ธฐ์กด ์์คํ ๋๋น ํต์ ์๊ฐ์ ์ต๋ 5๋ฐฐ๊น์ง ๋จ์ถํ์ต๋๋ค.
- ๋น ๋ฅธ ๋ฐ์ ์๊ฐ: ์ด๋ก ์ธํด ์ฌ์ฉ์๋ ๋ ๋น ๋ฅธ ๋ฐ์ ์๊ฐ์ผ๋ก ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์๋ณผ ์ ์์ต๋๋ค.
- ๋ณตํฉ ์ฟผ๋ฆฌ ๊ฒ์:
multi_match
์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๋ชฉ๊ณผ ์ ์๋ฅผ ๋์์ ๊ฒ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๋ฌํ ๊ณ ๋ํ ์์ ์ ํตํด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ํญ ํฅ์์ํค๊ณ , ์ํ๋ ์ฑ ์ ๋์ฑ ๋น ๋ฅด๊ณ ์ ํํ๊ฒ ์ฐพ์ ์ ์๋ ๊ฒ์ ์์คํ ์ ์ ๊ณตํฉ๋๋ค.
book-index mapping
// book-index mapping
{
"mappings": {
"properties": {
"Author": {
"type": "text",
"fields": {
"keyword": {
"type": "text",
"analyzer": "author_analyzer"
},
"partial": {
"type": "text",
"analyzer": "edge_ngram_analyzer"
}
}
},
"DetailCategory": {
"type": "keyword"
},
"ISBN": {
"type": "keyword"
},
"ImageURL": {
"type": "keyword"
},
"IndexContent": {
"type": "text"
},
"Introduction": {
"type": "text"
},
"MiddleCategory": {
"type": "keyword"
},
"Price": {
"type": "integer"
},
"PubDate": {
"type": "date",
"format": "yyyy-MM-dd"
},
"Publisher": {
"type": "keyword"
},
"PublisherReview": {
"type": "text"
},
"PurchaseURL": {
"type": "keyword"
},
"Search": {
"type": "text"
},
"Title": {
"type": "text",
"analyzer": "title_analyzer"
},
"Vector": {
"type": "dense_vector",
"dims": 768,
"index": true,
"similarity": "cosine"
},
"document": {
"type": "object"
},
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"index": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"pipeline": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
book-index settings
//book -index settings
{
"settings": {
"index": {
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_content"
}
}
},
"number_of_shards": "1",
"provided_name": "book-index",
"creation_date": "1708182319595",
"analysis": {
"filter": {
"lowercase_filter": {
"type": "lowercase"
},
"edge_ngram_filter": {
"type": "edge_ngram",
"min_gram": "1",
"max_gram": "10"
}
},
"analyzer": {
"edge_ngram_analyzer": {
"filter": [
"edge_ngram_filter",
"lowercase_filter"
],
"type": "custom",
"tokenizer": "nori_tokenizer_mine"
},
"author_analyzer": {
"filter": [
"lowercase_filter"
],
"type": "custom",
"tokenizer": "keyword"
},
"title_analyzer": {
"filter": [
"nori_readingform",
"lowercase_filter",
"nori_part_of_speech"
],
"type": "custom",
"tokenizer": "nori_tokenizer_mine"
}
},
"tokenizer": {
"nori_tokenizer_mine": {
"type": "nori_tokenizer",
"decompound_mode": "mixed"
}
}
},
"number_of_replicas": "2",
"uuid": "okUbOg_pTJKVG2WO7e3rYQ",
"version": {
"created": "8500003"
}
}
},
"defaults": {
"index": {
"flush_after_merge": "512mb",
"time_series": {
"end_time": "9999-12-31T23:59:59.999Z",
"start_time": "-9999-01-01T00:00:00Z",
"es87tsdb_codec": {
"enabled": "true"
}
},
"final_pipeline": "_none",
"max_inner_result_window": "100",
"unassigned": {
"node_left": {
"delayed_timeout": "1m"
}
},
"max_terms_count": "65536",
"rollup": {
"source": {
"name": "",
"uuid": ""
}
},
"lifecycle": {
"prefer_ilm": "true",
"rollover_alias": "",
"origination_date": "-1",
"name": "",
"parse_origination_date": "false",
"step": {
"wait_time_threshold": "12h"
},
"indexing_complete": "false"
},
"mode": "standard",
"routing_partition_size": "1",
"force_memory_term_dictionary": "false",
"max_docvalue_fields_search": "100",
"merge": {
"scheduler": {
"max_thread_count": "1",
"auto_throttle": "true",
"max_merge_count": "6"
},
"policy": {
"merge_factor": "32",
"floor_segment": "2mb",
"max_merge_at_once_explicit": "30",
"max_merge_at_once": "10",
"max_merged_segment": "0b",
"expunge_deletes_allowed": "10.0",
"segments_per_tier": "10.0",
"type": "UNSET",
"deletes_pct_allowed": "20.0"
}
},
"max_refresh_listeners": "1000",
"max_regex_length": "1000",
"load_fixed_bitset_filters_eagerly": "true",
"number_of_routing_shards": "1",
"write": {
"wait_for_active_shards": "1"
},
"verified_before_close": "false",
"mapping": {
"coerce": "false",
"nested_fields": {
"limit": "50"
},
"depth": {
"limit": "20"
},
"field_name_length": {
"limit": "9223372036854775807"
},
"total_fields": {
"limit": "1000"
},
"nested_objects": {
"limit": "10000"
},
"ignore_malformed": "false",
"dimension_fields": {
"limit": "21"
}
},
"source_only": "false",
"soft_deletes": {
"enabled": "true",
"retention": {
"operations": "0"
},
"retention_lease": {
"period": "12h"
}
},
"max_script_fields": "32",
"query": {
"default_field": [
"*"
],
"parse": {
"allow_unmapped_fields": "true"
}
},
"format": "0",
"frozen": "false",
"sort": {
"missing": [],
"mode": [],
"field": [],
"order": []
},
"priority": "1",
"routing_path": [],
"version": {
"compatibility": "8500003"
},
"codec": "default",
"max_rescore_window": "10000",
"bloom_filter_for_id_field": {
"enabled": "true"
},
"max_adjacency_matrix_filters": "100",
"analyze": {
"max_token_count": "10000"
},
"gc_deletes": "60s",
"top_metrics_max_size": "10",
"optimize_auto_generated_id": "true",
"max_ngram_diff": "1",
"hidden": "false",
"translog": {
"flush_threshold_age": "1m",
"generation_threshold_size": "64mb",
"flush_threshold_size": "10gb",
"sync_interval": "5s",
"retention": {
"size": "-1",
"age": "-1"
},
"durability": "REQUEST"
},
"auto_expand_replicas": "false",
"fast_refresh": "false",
"recovery": {
"type": ""
},
"requests": {
"cache": {
"enable": "true"
}
},
"data_path": "",
"highlight": {
"max_analyzed_offset": "1000000",
"weight_matches_mode": {
"enabled": "true"
}
},
"look_back_time": "2h",
"routing": {
"rebalance": {
"enable": "all"
},
"allocation": {
"disk": {
"watermark": {
"ignore": "false"
}
},
"enable": "all",
"total_shards_per_node": "-1"
}
},
"search": {
"slowlog": {
"level": "TRACE",
"threshold": {
"fetch": {
"warn": "-1",
"trace": "-1",
"debug": "-1",
"info": "-1"
},
"query": {
"warn": "-1",
"trace": "-1",
"debug": "-1",
"info": "-1"
}
}
},
"idle": {
"after": "30s"
},
"throttled": "false"
},
"fielddata": {
"cache": "node"
},
"look_ahead_time": "2h",
"default_pipeline": "_none",
"max_slices_per_scroll": "1024",
"shard": {
"check_on_startup": "false"
},
"xpack": {
"watcher": {
"template": {
"version": ""
}
},
"version": "",
"ccr": {
"following_index": "false"
}
},
"percolator": {
"map_unmapped_fields_as_text": "false"
},
"allocation": {
"max_retries": "5",
"existing_shards_allocator": "gateway_allocator"
},
"refresh_interval": "1s",
"indexing": {
"slowlog": {
"reformat": "true",
"threshold": {
"index": {
"warn": "-1",
"trace": "-1",
"debug": "-1",
"info": "-1"
}
},
"source": "1000",
"level": "TRACE"
}
},
"compound_format": "1gb",
"blocks": {
"metadata": "false",
"read": "false",
"read_only_allow_delete": "false",
"read_only": "false",
"write": "false"
},
"max_result_window": "10000",
"store": {
"stats_refresh_interval": "10s",
"type": "",
"fs": {
"fs_lock": "native"
},
"preload": [],
"snapshot": {
"snapshot_name": "",
"index_uuid": "",
"cache": {
"prewarm": {
"enabled": "true"
},
"enabled": "true",
"excluded_file_types": []
},
"repository_uuid": "",
"uncached_chunk_size": "-1b",
"delete_searchable_snapshot": "false",
"index_name": "",
"partial": "false",
"blob_cache": {
"metadata_files": {
"max_length": "64kb"
}
},
"repository_name": "",
"snapshot_uuid": ""
}
},
"queries": {
"cache": {
"enabled": "true"
}
},
"shard_limit": {
"group": "normal"
},
"warmer": {
"enabled": "true"
},
"downsample": {
"origin": {
"name": "",
"uuid": ""
},
"source": {
"name": "",
"uuid": ""
},
"status": "unknown"
},
"override_write_load_forecast": "0.0",
"max_shingle_diff": "3",
"query_string": {
"lenient": "false"
}
}
}
}
1๏ธโฃย [GET] BASE_URL/api/book/search?keyword={๊ฒ์์ด}
: ์ ์ ๊ฐ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ๋ฉด ์ค์ฝ์ด ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ฑ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ค.
2๏ธโฃย Request
-
โ๐ปRequest Header
Content-Type: application/json
-
โ๐ปRequest Query
Name Type Description Required keyword={๊ฒ์์ด} String ๊ฒ์ํ ์ฑ Required
3๏ธโฃย Response
-
โ๐ป์ฑ๊ณต
Name Type Description code Integer ์ํ ์ฝ๋ message String ์ํ ๋ฉ์์ง data List ์ํ ์ฝ๋ - recommendedBookList List ai๊ฐ ์ถ์ฒํ๋ ์ฑ , list๋ ์ถ์ฒ์์ผ๋ก ์ ๋ ฌ๋จ. -- isbn Long ์ฑ ์ 13์๋ฆฌ isbn -- title String ์ฑ ์ด๋ฆ -- author String ์ฑ ์ ์(๋ค) -- image String ์ฑ ํ์ง ์ด๋ฏธ์ง url -- price Long ์ฑ ์ ๊ฐ๊ฒฉ(์ฌ๊ณ ๊ฒ์์ ์ํด ํ์) { "code": 200, "message": "๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์ฑ๊ณตํ์ต๋๋ค.", "data": { "bookList" :[ { "isbn" : 9791140708116, "title" : "์๋ ๋งํผ ๋ณด์ด๋ ๋ฐฑ์๋ ๊ฐ๋ฐ (ํ ๊ถ์ผ๋ก ๋ณด๋ ๋ฐฑ์๋ ๋ก๋๋งต๊ณผ ์ปค๋ฆฌ์ด ๊ฐ์ด๋)", "author" : ["์ ์ฐํ", "์ด์ธ", "๊น๋ณด์ธ"], "image" : "https://shopping-phinf.pstatic.net/main_4519670/45196700648.20240114070834.jpg", "price" : 490000, }, { "isbn" : 9791140708116, "title" : "์๋ ๋งํผ ๋ณด์ด๋ ๋ฐฑ์๋ ๊ฐ๋ฐ (ํ ๊ถ์ผ๋ก ๋ณด๋ ๋ฐฑ์๋ ๋ก๋๋งต๊ณผ ์ปค๋ฆฌ์ด ๊ฐ์ด๋)", "author" : ["์ ์ฐํ", "์ด์ธ", "๊น๋ณด์ธ"], "image" : "https://shopping-phinf.pstatic.net/main_4519670/45196700648.20240114070834.jpg", "price" : 490000, }, { "isbn" : 9791140708116, "title" : "์๋ ๋งํผ ๋ณด์ด๋ ๋ฐฑ์๋ ๊ฐ๋ฐ (ํ ๊ถ์ผ๋ก ๋ณด๋ ๋ฐฑ์๋ ๋ก๋๋งต๊ณผ ์ปค๋ฆฌ์ด ๊ฐ์ด๋)", "author" : ["์ ์ฐํ", "์ด์ธ", "๊น๋ณด์ธ"], "image" : "https://shopping-phinf.pstatic.net/main_4519670/45196700648.20240114070834.jpg", "price" : 490000, }, ] } }
-
โ๐ป์คํจ
-
ํ์ํ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ
{ "code": 400, "message": "keyword๊ฐ ์์ต๋๋ค.", "data": null }
-
์๋ฒ์๋ฌ
{ "code": 500, "message": "์๋ฒ ์๋ฌ", "data": null }
-