_search
def get(self, reqeust):
query = {
"query": {
"match": {
"mall_id": "wendy"
}
}
}
response = search_doc_in_OpenSearch('test', query)
return Response({
"response": response.json(),
}, status=response.status_code)
def search_doc_in_OpenSearch(index, query):
url = f'{AWS_OPEN_SEARCH_DOMAIN}/{index}/_search'
username = {AWS_OPEN_SEARCH_USERNAME}
password = {AWS_OPEN_SEARCH_PASSWORD}
response = requests.get(url, auth=(username, password), json=query)
print(response.status_code)
print(response.json())
return response
{
"took": 25,
"timed_out": false,
"_shards": {
"total": 10,
"successful": 10,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 85,
"relation": "eq",
},
"max_score": 6.6137657,
"hits": [
{
"_index": "movies",
"_type": "movie",
"_id": "tt0077975",
"_score": 6.6137657,
"_source": {
"directors": [
"John Landis"
],
"release_date": "1978-07-27T00:00:00Z",
"rating": 7.5,
"genres": [
"Comedy",
"Romance"
],
"image_url": "http://ia.media-imdb.com/images/M/MV5BMTY2OTQxNTc1OF5BMl5BanBnXkFtZTYwNjA3NjI5._V1_SX400_.jpg",
"plot": "At a 1962 College, Dean Vernon Wormer is determined to expel the entire Delta Tau Chi Fraternity, but those troublemakers have other plans for him.",
"title": "Animal House",
"rank": 527,
"running_time_secs": 6540,
"actors": [
"John Belushi",
"Karen Allen",
"Tom Hulce"
],
"year": 1978,
"id": "tt0077975"
}
},
...
]
}
}
took
: 검색 요청을 처리하는 데 걸린 시간 (밀리초)입니다.timed_out
: 검색 요청이 시간 초과되었는지 여부를 나타냅니다. false
는 요청이 시간 초과되지 않았음을 나타냅니다._shards
: 샤드 관련 정보입니다. _shards
객체는 검색 요청이 수행된 샤드의 성공, 실패 및 건너뛴 샤드 수를 나타냅니다.total
: 전체 샤드 수입니다.successful
: 성공한 샤드 수입니다.skipped
: 건너뛴 샤드 수입니다.failed
: 실패한 샤드 수입니다.hits
: 검색 결과에 대한 정보를 담고 있는 객체입니다.total
: 검색된 전체 문서의 수를 나타냅니다.value
: 검색된 전체 문서의 수입니다.relation
: 전체 문서 수에 대한 관계를 나타냅니다. "eq"는 정확히 일치하는 것을 의미합니다.max_score
: 검색 결과 중 가장 높은 스코어 값을 나타냅니다.hits
: 실제 검색된 문서들의 배열입니다._index
: 문서가 저장된 인덱스 이름입니다._type
: 문서 유형입니다._id
: 문서의 고유 식별자입니다._score
: 해당 문서의 검색 스코어 값입니다._source
: 문서의 원본 데이터입니다. 실제 문서의 필드와 값을 포함합니다._bulk
def put(self, request):
data_list = [
{
"device": "M",
"mall_id": "aim005",
"shop_no": "6",
"member_id": "esdx",
"date": "2024-10-29",
"time": "11:22:33",
"event": "TEST2",
},
{
"device": "M",
"mall_id": "aim005",
"shop_no": "6",
"member_id": "esdx",
"date": "2024-10-29",
"time": "11:22:33",
"event": "TEST3",
},
{
"device": "M",
"mall_id": "aim005",
"shop_no": "6",
"member_id": "esdx",
"date": "2024-10-29",
"time": "11:22:33",
"event": "TEST4",
},
{
"device": "M",
"mall_id": "aim005",
"shop_no": "6",
"member_id": "esdx",
"date": "2024-10-29",
"time": "11:22:33",
"event": "TEST5",
},
]
doc_list = []
for data in data_list:
index = {"index": {"_index": f"{index}"}}
doc_list.append(index)
doc_list.append(data)
response = create_doc_list_in_OpenSearch(doc_list)
return Response({
"result": response.json()
}, status=response.status_code)
def create_doc_list_in_OpenSearch(doc_list):
username = {AWS_OPEN_SEARCH_USERNAME}
password = {AWS_OPEN_SEARCH_PASSWORD}
url = f'{OPENSEARCH_DOMAIN}/{index}/_bulk'
headers = {'Content-Type': 'application/json'}
bulk_data = ''
for doc in doc_list:
bulk_data += json.dumps(doc) + '\n'
response = requests.post(
url,
auth=(username, password),
headers=headers,
data=bulk_data,
)
print(response.status_code)
print(response.json())
return response
{
"took": 25,
"timed_out": false,
"_shards": {
"total": 10,
"successful": 10,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 85,
"relation": "eq",
},
"max_score": 6.6137657,
"hits": [
{
"_index": "movies",
"_type": "movie",
"_id": "tt0077975",
"_score": 6.6137657,
"_source": {
"directors": [
"John Landis"
],
"release_date": "1978-07-27T00:00:00Z",
"rating": 7.5,
"genres": [
"Comedy",
"Romance"
],
"image_url": "http://ia.media-imdb.com/images/M/MV5BMTY2OTQxNTc1OF5BMl5BanBnXkFtZTYwNjA3NjI5._V1_SX400_.jpg",
"plot": "At a 1962 College, Dean Vernon Wormer is determined to expel the entire Delta Tau Chi Fraternity, but those troublemakers have other plans for him.",
"title": "Animal House",
"rank": 527,
"running_time_secs": 6540,
"actors": [
"John Belushi",
"Karen Allen",
"Tom Hulce"
],
"year": 1978,
"id": "tt0077975"
}
},
...
]
}
}
took
: 검색 요청을 처리하는 데 걸린 시간 (밀리초)입니다.timed_out
: 검색 요청이 시간 초과되었는지 여부를 나타냅니다. false
는 요청이 시간 초과되지 않았음을 나타냅니다._shards
: 샤드 관련 정보입니다. _shards
객체는 검색 요청이 수행된 샤드의 성공, 실패 및 건너뛴 샤드 수를 나타냅니다.total
: 전체 샤드 수입니다.successful
: 성공한 샤드 수입니다.skipped
: 건너뛴 샤드 수입니다.failed
: 실패한 샤드 수입니다.hits
: 검색 결과에 대한 정보를 담고 있는 객체입니다.total
: 검색된 전체 문서의 수를 나타냅니다.value
: 검색된 전체 문서의 수입니다.relation
: 전체 문서 수에 대한 관계를 나타냅니다. "eq"는 정확히 일치하는 것을 의미합니다.max_score
: 검색 결과 중 가장 높은 스코어 값을 나타냅니다.hits
: 실제 검색된 문서들의 배열입니다._index
: 문서가 저장된 인덱스 이름입니다._type
: 문서 유형입니다._id
: 문서의 고유 식별자입니다._score
: 해당 문서의 검색 스코어 값입니다._source
: 문서의 원본 데이터입니다. 실제 문서의 필드와 값을 포함합니다.{'error': {'root_cause': [{'type': 'illegal_argument_exception', 'reason': 'The bulk request must be terminated by a newline [\\n]'}], 'type': 'illegal_argument_exception', 'reason': 'The bulk request must be terminated by a newline [\\n]'}, 'status': 400}
bulk_data
를 json 형식으로 json=bulk_data
으로 전달해서 발생bulk_data
를 데이터별 json.dumps() 로직을 거친후 string 형식으로 data=bulk_data
파라미터로 전달{'error': {'root_cause': [{'type': 'illegal_argument_exception', 'reason': 'Malformed action/metadata line [1], expected one of [create, delete, index, update] but found [device]'}], 'type': 'illegal_argument_exception', 'reason': 'Malformed action/metadata line [1], expected one of [create, delete, index, update] but found [device]'}, 'status': 400}
_bulk
요청시 document들 단순히 json.dumps() 뿐만 아니라 줄바꿈과 함께 metadata정보를 넣어줘야함POST _bulk
{ "index": { "_index": "my-index", "_id": "1" } }
{ "my_vector1": [1.5, 2.5], "price": 12.2 }
{ "index": { "_index": "my-index", "_id": "2" } }
{ "my_vector1": [2.5, 3.5], "price": 7.1 }
{ "index": { "_index": "my-index", "_id": "3" } }
{ "my_vector1": [3.5, 4.5], "price": 12.9 }
...
위와 같은 방식이 되도록 코드 추가 doc_list = []
for data in data_list:
index = {"index": {"_index": f"{index}"}}
doc_list.append(index)
doc_list.append(data)
Amazon OpenSearch Service의 데이터 검색 - 아마존 OpenSearch 서비스