Mongodb文本搜索精确短语

时间:2018-04-17 15:44:38

标签: mongodb mongodb-query full-text-search text-search

我有一个包含以下文档的集合:

{
    "_id" : ObjectId("5ad609a2ac1a8b644180936a"),
    "content" : "Coffee and cakes..."
},
{
    "_id" : ObjectId("5ad609baac1a8b644180936b"),
    "content" : "coffee shop..."
}

文本搜索查询的结果:

find({ $text: { $search: "\"coffee shop\" cakes" } })

只返回第二个文档,但我期待两个文档。问题是什么?

2 个答案:

答案 0 :(得分:2)

这......

detach()

...将搜索具有find({ $text: { $search: "coffee shop cakes" } }) 属性的任何文档,其中包含" coffee"或" shop"或"蛋糕"

但是这......

content

...将搜索具有find({ $text: { $search: "\"coffee shop\" cakes" } }) 属性的任何文档,其中包含短语"咖啡店"。

我认为当您提交短语("咖啡店")一个额外的搜索值时,您会期待上述两种行为(" cake" )。但是,这不是MongoDB如何处理短语和附加术语的组合。

来自the docs

  

如果content字符串包含短语和单个字词,则文本搜索仅匹配包含该短语的文档。

根据these docs,查询$search将被评估为:

"\"coffee shop\" cakes"

这只与第二个文档正确匹配。

注意:text index docs与此相矛盾,根据这些文档,查询"coffee shop" AND ("cakes" or "coffee" or "shop") 将被评估为:"\"coffee shop\" cakes",但您观察到的行为与"coffee shop" OR "cakes"一致上面引用的运营商文档。

感谢raising this issue with MongoDB的@RahulRaj,他们的回复确认文档不正确:

  

正如您所正确指出的那样,这两个页面之间的文档存在不一致。我们正在跟踪DOCS-10382中的文档。

     

https://docs.mongodb.com/manual/reference/operator/query/text/#phrases正确描述了此功能的当前实现。

答案 1 :(得分:0)

尝试使用正则表达式

db.collectionName.find({content:{$ regex:/ ^ coffee / i}});

/我将忽略案例

帮助链接:https://docs.mongodb.com/manual/reference/operator/query/regex/#examples