OpenSearch에 생성, 조회 요청보내기

Dongwoo Kim·2024년 10월 29일
0

TIL / WIL

목록 보기
120/126

조회

_search

요청 sample 코드

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

요청 sample code

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: 문서의 원본 데이터입니다. 실제 문서의 필드와 값을 포함합니다.

트러블슈팅

1. _bulk error response 1

  • error response
    {'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}
    
  • 원인 requests.post() 함수에서 bulk_data를 json 형식으로 json=bulk_data으로 전달해서 발생
  • 해결방법 bulk_data 를 데이터별 json.dumps() 로직을 거친후 string 형식으로 data=bulk_data 파라미터로 전달

2. _bulk error response 2

  • error response
    {'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)

Reference.

조회 쿼리 가이드

Amazon OpenSearch Service의 데이터 검색 - 아마존 OpenSearch 서비스

OpenSearch Docs

https://opensearch.org/docs/latest/query-dsl/

profile
kimphysicsman

0개의 댓글