MongoDB PyMongo - 创建索引并在两个字段中进行不区分大小写的搜索

Posted

技术标签:

【中文标题】MongoDB PyMongo - 创建索引并在两个字段中进行不区分大小写的搜索【英文标题】:MongoDB PyMongo - create an index and make a case insensitive search in two fields 【发布时间】:2021-12-31 03:46:16 【问题描述】:

感觉就像碰壁一样,非常感谢您的帮助!

我在数据库中有两个字段,都可以包含各种文本。 从我到目前为止所阅读的内容来看,我需要先创建一个索引,但是因为我有两个字段而不是一个..我如何在其中搜索?另外,它必须不区分大小写。 使用 MongoDB 4.4 Pymongo 有自己的“文本”变量,以及自己的 create_index 调用,所以这是正确的吗?

collection.create_index([('author' , pymongo.TEXT), ('title' , pymongo.TEXT)])

如何从这里开始,对一个 search_string 进行不区分大小写的搜索?

【问题讨论】:

您能否帮助我们描述 1 或 2 个文档的外观并对查询进行伪编码以产生所需的结果? 文本索引使用基于语言的规则进行词干化和复数化,这是您对作者字段所需要的吗? 如果您使用 Atlas,您可能会看到更好的查询结果。有一个 Python github 项目,其中遗留的文本搜索功能被 Atlas Search 取代:github.com/MarcusSorealheis/Atlas-Search-Python 它就像一个图书馆数据库,数以百万计的条目和用户输入一个字符串进行搜索,其中可能包含作者和标题中的一些单词,或者只有一些单词,或者只有作者..你明白了。不过,不需要词干和复数。我也宁愿避免使用正则表达式。 【参考方案1】:

此解决方案的特点是在特殊的$text 索引上同时对authortitle 字段进行不区分大小写和停用词的查找:

   rc = db.foo.create_index([('author' , pymongo.TEXT), ('title' , pymongo.TEXT)])

    r = [
    "author":"Buzz","title":"Dangferous iewhf"
    ,"author":"Dave","title":"Corn"
    ,"author":"Dave","title":"The buzz about wheat"
    ,"author":"Chris","title":"Not in this film"
    ,"author":"Herbert","title":"Dune"
    ,"author":"Herbert","title":"Children of Dune"
    ]
    db.foo.insert_many(r)


    searchstring = "Dune"                                       
   
    for doc in db.foo.find("$text":  "$search": searchstring   ):
        print(doc)

有关确切短语、多个单词、单词排除等的更多详细信息,请参阅此处的文档: MongoDB $text index features

【讨论】:

谢谢!我实际上得到了相同的结果 :) 虽然看起来确实要找到具有公正搜索字符串的结果,除了使用正则表达式之外别无他法。所以我最终也不得不实施它。如果将来有人需要,请在此处找到 Python 中的良好参考:***.com/a/52018277/14641358

以上是关于MongoDB PyMongo - 创建索引并在两个字段中进行不区分大小写的搜索的主要内容,如果未能解决你的问题,请参考以下文章

一日一技:MongoDB如何正确中断正在创建的索引

如何使用 pymongo 创建索引 [重复]

使用 python 和 pymongo 的 MongoDB 位置运算符索引问题

使用 pyMongo 和 MongoEngine 从 MongoDb 列表中删除对象及其索引?

如何跳过重复索引上的错误并继续在 MongoDB 中进一步添加文档(pymongo)

使用 PyMongo 创建持久的 MongDB 连接