我刚刚完成了Flask大型教程的部分关于使用Flask-WhooshAlchemy(http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search)实现全文搜索的内容,我的帖子如下:
>>> Post.query.whoosh_search('fourth').all()
[Post u'not my fourth', Post u'my fourth and last post']
我尝试使用Post.query.whoosh_search('fourth AND not').all()
期望返回[Post u'not my fourth']
,但我得到了两个原始帖子。
如何让WhooshAlchemy将not
视为字符串而非操作符?
答案 0 :(得分:0)
根据Flask-WhooshAlchemy docs中此页面的最后一段,默认情况下,查询字词被视为AND。因此,将您的搜索更改为
Post.query.whoosh_search("fourth not").all()
如果你仍然遇到问题,也许你必须这样做
Post.query.whoosh_search("fourth AND 'not'").all()
答案 1 :(得分: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()
>>> []
这本应该归还'不是我的第四个',对吗?
根据this document中的“停用单词”部分,“停止”单词是如此常见的单词,它们通常会适得其反。 This question有一个链接,显示默认情况下“not”是停用词,而whoosh_search不会将其编入索引。
所以让我们添加另一篇文章“第四”和一个不太常见的词 - “奶酪”怎么样。
>>> p = Post(body='cheese is the fourth food group', timestamp=datetime.datetime.utcnow(), author=u)
>>> db.session.add(p)
>>> db.session.commit()
现在让我们搜索身体中带有'第四'AND'奶酪'的所有帖子。
>>> 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'>]