Проверка, содержит ли поле строку (с пунктуацией) - PullRequest
0 голосов
/ 31 января 2020

Согласно этому сообщению Проверка, содержит ли поле строку и ответ от okoboko.

Я создал индекс для одного из моих полей в моей коллекции. Если я использую что-то вроде:

db.users.find( { $text: { $search: "son" } } )

Запрос быстрый, и это здорово, однако я хочу запросить мой индекс с помощью пунктуации (так как мое текстовое поле содержит URL-адреса). Если я хотел получить все документы, связанные со стековым потоком, я попытался использовать:

for page in myCollection.find( { "$text": { "$search": "\"stackoverflow\.com\"" } } ):
    print (page['_id'])

Но это не работает. Какой самый быстрый способ поиска в коллекции полей, которые содержат строку с пунктуацией?

Я не получаю сообщение об ошибке, но мой код застревает и ничего не возвращает, так как я изучаю диспетчер задач и вижу, что python загружает мою память и сервер MongoDB тоже усердно работает.

Когда я использую этот бит кода, результат получается очень быстрым, но я также хочу включить .com.

for page in myCollection.find( { "$text": { "$search": "\".stackoverflow\"" } } ):
    print (page['_id'])

Когда я использую этот бит кода, я получаю возврат, но его время примерно такое же, как при использовании $regex:

for page in ScrapedPagesCollection.find( { "$text": { "$search": "\"stackoverflow.com\"" } } ):
    print (page['_id'])

1 Ответ

0 голосов
/ 01 февраля 2020

Это работает для меня:

import pymongo

db = pymongo.MongoClient()['mydatabase']
db.mycollection.insert_one( { 'site': 'https://www.stackoverflow.com' } )
db.mycollection.create_index([('site', pymongo.TEXT)])

print(list(db.mycollection.find( { '$text': { '$search': 'stackoverflow.com' } } )))

дает:

[{'_id': ObjectId('5e3584b1534c1043defcd5bb'), 'site': 'https://www.stackoverflow.com'}]
...