我的食物数据库列表类似于:
{
Name: "burger",
ingredients: [
{Item:"bread"},
{Item:"cheese"},
{Item:"tomato"}
]
}
如何找到ingredients
中具有最相似项目的文档?
答案 0 :(得分:8)
首先,您的数据应按以下方式进行重新设计:
{
name: "Burger",
ingredients: [
"bread",
"cheese",
"tomato",
"beef"
]
}
额外"项目"不会添加任何其他信息,也不会以任何方式帮助访问数据。
接下来,您需要创建一个text index。文档说明了
text
索引可以包含任何字段,其值为字符串或字符串元素数组。
所以我们只是做一个
db.collection.ensureIndex({"ingredients":"text"})
现在我们可以进行$text
search:
db.collection.find(
{ $text: { $search: "bread beef" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
应该为您提供最相关的文件。
但是,你还可以做的是直接匹配的非文本搜索:
db.collection.find({ingredients:"beef"})
或多种成分
db.collections.find({ ingredients: { $all: ["beef","bread"] } })
因此,对于按用户输入搜索,您可以使用文本搜索和按所选成分搜索,您可以使用非文本搜索。
答案 1 :(得分:-2)
如果您将成分存储在文本字段中,那么最好的机会是: {ingredients:“bread cheese tomato”}然后你必须使用text index并查询相似性db.your_collection.find({$ text:{$search:{“tomato”}},{score :{$ meta:“textScore”}})。sort({score:{$ meta:“textScore”}})并获取最相关的文档