728x90
코드
#키워드를 먼저 공백 제거
keywords = [q.replace(' ', '') for q in search_keyword.split(' ') if q]
for keyword in keywords.copy(): #반복 시 반복 객체를 보호하기 위해
keywords += mecab.morphs(keyword) #형태소를 분해해서 keywords에 담아줍니다
keyword_search_query = reduce(
operator.or_,
[
Q(content__icontains=keyword)
for keyword in keywords
]
)
reduce로 누적 만들기
이 예시에서는 content__icontains를 사용하여 keywords 리스트에 있는 각 키워드로 검색하는 Q 객체들을 생성하고, reduce 함수를 이용하여 이를 OR 조건으로 결합한 쿼리를 생성합니다.
최종적으로 keyword_search_query에는 OR 조건이 적용된 쿼리 객체가 저장됩니다.(Q(content__icontains='apple') | Q(content__icontains='orange') | Q(content__icontains='banana'))
sorted(list(set(keywords)), key=lambda k: (query.startswith(k), -len(k)), reverse=True)
sort를 통해서 키워드로 시작하는 것들을 앞으로 땡겨 올 수 있습니다.
배운 점
- 키워드를 전처리하는 작업과 형태소 분석을 통해 좀 더 좋은 데이터들을 얻는 방법을 배웠습니다.
- reduce와 operater을 통해서 or조건문을 반복문 돌리는 법을 배웠습니다.
'Django > view' 카테고리의 다른 글
[Python] 개월 수로 필터링 (0) | 2024.03.06 |
---|---|
[Python] Excel 다운로드 (0) | 2024.02.15 |