2014-05-10 4 views
1

난 그냥 플라스크-WhooshAlchemy (http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search) 전체 텍스트 검색을 구현하는 플라스크 메가 튜토리얼의 섹션을 통해 있고 난 아래의 게시물이 있습니다플라스크-WhooshAlchemy : 검색 '하지'

>>> Post.query.whoosh_search('fourth').all() 
[Post u'not my fourth', Post u'my fourth and last post'] 

내가 시도 그 결과로 [Post u'not my fourth']을 되 찾을 것으로 예상하는 Post.query.whoosh_search('fourth AND not').all()을 사용하지만 원래의 게시물을 모두 얻게됩니다.

not을 교환 원이 아닌 문자열로 처리하려면 어떻게해야합니까?

답변

0

이 페이지의 마지막 단락 Flask-WhooshAlchemy docs에 따르면 쿼리 용어는 기본적으로 AND처럼 처리됩니다. 그래서 당신은 여전히 ​​문제가있는 경우

Post.query.whoosh_search("fourth not").all() 

로 검색을 변경, 아마 당신은 Whoosh's docs on making a term from literal text에 따라

Post.query.whoosh_search("fourth AND 'not'").all() 

을해야한다.

+0

모두'Post.query.whoosh_search ("네번째 없습니다") 모든()'와 'Post.query.whoosh_search ("네 번째 AND 'not'"). all()'두 개의 게시물을 모두 반환합니다. 다른 아이디어? – mvwi

+0

'.all()'일 수 있습니까? 이를 생략하면 쿼리 또는 whoosh 객체를 다시 얻거나 결과가 필요합니까? –

0

설정을 다시 만들었습니다. 당신이 요청해야

>>> Post.query.whoosh_search('fourth not').all() 
>>> [<Post u'not my fourth'>, <Post u'my fourth and last post'>] 

질문 : 왜 찾을 whoosh_search 수없는 이유는 무엇입니까? 이 시도.

>>> Post.query.whoosh_search('not').all() 
>>> [] 

이 게시물은 '제 4 번째가 아닌'게시물을 반환했을 것입니다. 맞습니까?

this document의 "Stop Words"섹션에 따르면 "Stop"단어는 흔히 사용되는 단어로 색인을 생성하는 데 종종 비생산적인 단어입니다. This question에는 기본적으로 'not'이 중지 단어이고 whoosh_search가 색인을 생성하지 않음을 보여주는 링크가 있습니다.

그래서 '치즈'에 대해 '제 4'와 덜 일반적인 단어가있는 다른 게시물을 추가 할 수 있습니다.

>>> p = Post(body='cheese is the fourth food group', timestamp=datetime.datetime.utcnow(), author=u) 
>>> db.session.add(p) 
>>> db.session.commit() 

이제 몸에 '4 번째'및 '치즈'가 포함 된 모든 게시물을 검색 할 수 있습니다.

>>> Post.query.whoosh_search('fourth cheese').all() 
>>> [<Post u'cheese is the fourth food group'>] 

완벽합니다.

보너스 : 당신은 '네 번째'OR '치즈', 이렇게 모든 게시물을 얻으려면 :.

>>> Post.query.whoosh_search('cheese fourth', or_=True).all() 
>>> [<Post u'cheese is the fourth food group'>, <Post u'not my fourth'>, <Post u'my fourth and last post'>]