Flask-WhooshAlchemy: Поиск «не»

Я только что прошел раздел мегаучебника 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 как строку, а не как оператор?


person mvwi    schedule 10.05.2014    source источник


Ответы (2)


Согласно последнему абзацу на этой странице в документах Flask-WhooshAlchemy, условия запроса обрабатываются как И по умолчанию. Так что измените свой поиск, чтобы быть

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

Если у вас все еще есть проблемы с этим, возможно, вам нужно сделать

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

согласно документации Whoosh по созданию термина из обычного текста.

person Eric Workman    schedule 10.05.2014
comment
И Post.query.whoosh_search("fourth not").all(), и Post.query.whoosh_search("fourth AND 'not'").all() возвращают оба сообщения. Любые другие идеи? - person mvwi; 10.05.2014
comment
Может ли это быть .all()? Если вы опустите это, вы получите запрос или объект возгласа, или результаты, которые вам нужны? - person Eric Workman; 12.05.2014

Я воссоздал вашу установку.

>>> 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()
>>> []

Это должно было вернуть пост «не мой четвертый», верно?

Согласно разделу «Стоп-слова» в этого документа, «стоп-слова» — это слова, настолько распространены, что индексировать их часто бывает контрпродуктивно. Этот вопрос имеет ссылку, которая показывает, что по умолчанию "не" стоп-слово, и whoosh_search его не индексирует.

Итак, давайте добавим еще один пост с «четвертым» и менее распространенным словом — как насчет «сыр».

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

А теперь давайте найдем все сообщения со словами «четвертый» И «сыр» в теле.

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

Идеальный.

БОНУС: если вы хотите, чтобы все посты содержали слова «четвертый» ИЛИ «сыр», сделайте следующее:

>>> 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'>]
person amath    schedule 02.10.2015