저장된 모든 문서와 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