Python 웹어플리케이션에서 MongoDB를 사용하여 검색어를 찾을때 검색어가 하나가 아닌 여러 개인 경우 이를 해결하는 방법입니다.


! 검색어의 빈공백을 사용하여 함께 포함된 and 조건 찾기

하나가 아닌 여러 개의 검색어를 사용하기 위한 방법으로 스페이스(공백)을 많이 사용합니다. 즉 제목에서 찾을 때 '웹 이즈'로 검색어를 입력한 경우에는 아래처럼 검색이 되야합니다.
'웹 이즈' => '웹' and '이즈' 모두 들어있는 제목을 찾기
이 경우 공백을 사용한 정규표현식을 방법이 많이 사용됩니다. 즉 빈 여백(space)인 경우 각각 다른 문자열로 보고 이를 각각 and 조건으로 포함하는 쿼리문을 만들면 되겠죠. 이때 키워드의 공백은 아래와같이 replace()를 사용하여 변경합니다.


------------------------------
(업데이트 2020-11-06)

아래의 내용은 참고용도로 남겨둡니다. 기존 정규표현식 방법에 대한 내용으로 현재는 pymongo를 사용하는 경우 위의 $text 연산자를 사용하는 방법이 가장 추천됩니다.

$text 연산자 사용 링크 바로가기 >
https://webisfree.com/2020-11-06/mongodb-text-operator를-사용-방법-및-예제
------------------------------



# 다수의 검색어(Multiple Keyword) 검색하는 방법
아래와 같이 먼저 구분자인 공백을 기준으로 replace()를 적용한 경우입니다. 먼저 쿼리스트링으로 다음의 주소가 전달된 경우 ...


@ /search?keyword=웹%20이즈

파이썬에서 쿼리스트링을 request.args로 전달 받을 수 있죠. 이제 정규식을 사용하여 아래와 같이 공백을 변환합니다.

- 변경 전 ' '
- 변경 후 ')(?=.*'
keyword = request.args.get('keyword').replace(' ', ')(?=.*')

이제 keyword가 있는 경우 쿼리는 아래와 같이 적용합니다.
if keyword:
  keywordQuery = {'text': {'$regex': '(?=.*'+keyword+')'}}

정규표현식을 사용하여 text라는 필드에 포함된 중복된 키워드를 검색합니다. 이를 다시 나타내면 아래와 같습니다.
keyword = request.args.get('keyword', '').replace(' ', ')(?=.*')

if keyword:
  keywordQuery = {'text': {'$regex': '(?=.*'+keyword+')' }}

이제 중복된 검색을 수행할 수 있을 것입니다. 참고로 webisfree.com 역시 검색이 space를 구분으로 중복 검색이
가능합니다. 즉 web is와 같이 검색할 수 있습니다.