Выполнение нечувствительных к регистру запросов с помощью Pymongo - PullRequest
0 голосов
/ 11 декабря 2018

Я работаю в Python, используя базу данных Монго.Я использую pymongo 3.6 для создания текстового индекса по нескольким полям и выполнения поиска без учета регистра, но у меня возникли проблемы.

Я создаю текстовый индекс, используя

text_index_name = db_collection.create_index([("name", TEXT),
                                              ("summary", TEXT)],
                                              name = 'text_search_index')

Затем я пытаюсь выполнить поиск без учета регистра, используя:

name = "SomeTerm"
db_collection.find({"$text":{"$search":{
                     "$regex":re.compile(name, re.IGNORECASE)}},
                   })

Это возвращает следующую ошибку:

"$ search" имел неправильный тип.Ожидаемая строка, найденный объект

Я пытался использовать параметры сортировки, сначала создав текстовый индекс без учета регистра

text_index_name = db.collection.create_index(
                           [("name", TEXT),("summary", TEXT)],
                           collation=Collation(
                                   locale="en",
                                   caseLevel=False,
                                   caseFirst="off",
                                   strength=2,
                                   numericOrdering=True,
                                   alternate="non-ignorable",
                                   maxVariable="space",
                                   backwards=True), 
                            name = 'text_search_index')

, но получаю следующее:

Тип индекса 'text' не поддерживает параметры сортировки:

{locale: "en", caseLevel: true, caseFirst: "off", сила: 5, numericOrdering: true, альтернатива: "не игнорируется", maxVariable:" пробел ", нормализация: ложь, назад: true, версия:" 57.1 "}

Я видел другие посты, где регулярное выражение используется успешно, но те искали строку водно поле, подобное приведенному ниже:

db_collection.find_one({"summary":re.compile("some_term", re.IGNORECASE)})

Это также работает для меня, но я не могу использовать это с $ search

1 Ответ

0 голосов
/ 11 декабря 2018

Вы не можете использовать оператор $ regex с текстовым поиском.Тем не менее, текстовый поиск по умолчанию не чувствителен к регистру , поэтому вы можете просто сделать:

db_collection.find({"$text": {"$search": name}})
...