Flask-WhooshAlchemy:寻找'不'

时间:2014-05-10 17:24:54

标签: python flask full-text-search whoosh

我刚刚完成了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视为字符串而非操作符?

2 个答案:

答案 0 :(得分:0)

根据Flask-WhooshAlchemy docs中此页面的最后一段,默认情况下,查询字词被视为AND。因此,将您的搜索更改为

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

如果你仍然遇到问题,也许你必须这样做

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

根据Whoosh's docs on making a term from literal text

答案 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'>]