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
索引上同时对author
和title
字段进行不区分大小写和停用词的查找:
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 - 创建索引并在两个字段中进行不区分大小写的搜索的主要内容,如果未能解决你的问题,请参考以下文章
使用 python 和 pymongo 的 MongoDB 位置运算符索引问题
使用 pyMongo 和 MongoEngine 从 MongoDb 列表中删除对象及其索引?