怎么能 $text query operator用于查找不包含禁用词列表的文档?这些文件不需要包含任何具体内容;只是没有这些词。
这是一个非常常见的用例,例如用于过滤脏话,但是the MongoDB documentation声明,没有任何解释或解决方法,
When passed a search string that only contains negated words, text search will not match any documents.
最佳答案
如果 MongoDB 不支持这个功能,我想所有的解决方案都会被破解。
这是我的:
我会为我的集合创建一个具有相同静态值的虚拟字段,例如 "dummy":"x"
。并将该字段添加到文本索引中。最后将此虚拟值 x 添加到查询中以克服以下限制:
When passed a search string that only contains negated words, text search will not match any documents
db.articles.insert(
[
{ _id: 1, subject: "coffee", dummy: "x" },
{ _id: 2, subject: "Coffee Shopping", dummy: "x" },
{ _id: 3, subject: "Baking a cake", dummy: "x" },
{ _id: 4, subject: "baking", dummy: "x" },
{ _id: 5, subject: "Cafe Con Cake", dummy: "x" },
{ _id: 6, subject: "ice cream", dummy: "x" },
{ _id: 7, subject: "coffee and cream", dummy: "x" }
]
)
我们正在向文本索引添加虚拟字段。
db.articles.createIndex( { subject: "text", dummy:"text" } )
我们将 x
添加到查询中:
db.articles.find( { $text: { $search: "x -cream -cake" } } ).projection({"dummy":0})
如果没有禁用词cream
和cake
,结果将是这样的:
{
"_id" : 4,
"subject" : "baking"
},
{
"_id" : 2,
"subject" : "Coffee Shopping"
},
{
"_id" : 1,
"subject" : "coffee"
}
关于MongoDB $text 搜索仅包含否定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59574062/