[elasticsearch] 원하는 문서에서만 score 계산하기

yoonene·2023년 2월 13일
0

Elasticsearch

목록 보기
9/14

저장된 모든 문서와 score를 계산하면 메모리가 터지는 문제가 발생할 수 있다.
따라서 query를 줄 때 조건을 함께 입력하여 먼저 조건에 부합하는 문서를 filtering 후 거기서만 score를 계산한다.
filter를 사용하면 score 계산에 영향을 미치지 않는다. 따라서 analyze하고 score를 매기는 연산을 낭비하지 않을 수 있다.

예시

원하는드라마, 회차, 캐릭터에 부합하는 문서에서 text를 검색하고 싶다면? -> filter로 처리
문서 중 회차 정보가 없는 경우가 있다면? -> 일단 else로 처리

질의문

def search_nori(query, title, charactor, episode=None):
    s_t = time.time()
    if episode:
        body = {
            'query': {
                'bool': {
                    'filter': [
                        {
                            'term': {
                                "title": title
                                }
                        },
                        {
                            'term': {
                                "charactor": charactor
                                }
                        },
                        {
                            'term': {
                                "episode": episode
                                }
                        }
                    ],
                    'should': {
                        'match': {
                            'text': query
                        }
                    }
                }
            }
        }
    else:
        body = {
            'query': {
                'bool': {
                    'filter': [
                        {
                            'term': {
                                "title": title
                                }
                        },
                        {
                            'term': {
                                "charactor": charactor
                                }
                        }
                    ],
                    'should': {
                        'match': {
                            'text': query
                        }
                    }
                }
            }
        }
        
    res = es.search(index=INDEX, body=body)
    print("time: ", time.time()-s_t)
    print("<query>")
    print(query)
    print("<results>")
    for i in range(len(res['hits']['hits'])):
        print(f"Top-{i+1}",'-'*100)
        print('score: ', res['hits']['hits'][i]['_score'])
        print('text: ', res['hits']['hits'][i]['_source']['text'])
        # return res
profile
NLP Researcher / Information Retrieval / Search

0개의 댓글