据我所知,自3.8.9版以来,mongoose支持全文搜索。但是我找不到一份好文件了! 我想做点什么:
db.collection.ensureIndex(
// Fields to index
{
animal: "text",
color: "text",
pattern: "text",
size: "text"
},
// Options
{
name: "best_match_index",
// Adjust field weights (default is 1)
weights: {
animal: 5, // Most relevant search field
size: 4 // Also relevant
}
}
)
我可以用纯猫鼬做吗?或者我必须使用像mongoose-text-search这样的插件?没有重量怎么样?
我应该怎么做?
答案 0 :(得分:105)
是的,您可以在Mongoose> = 3.8.9中使用全文搜索。首先,集合最多可以有一个文本索引(参见docs)。因此,要为several fields定义文本索引,您需要复合索引:
schema.index({ animal: 'text', color: 'text', pattern: 'text', size: 'text' });
现在您可以像这样使用$text query operator:
Model
.find(
{ $text : { $search : "text to look for" } },
{ score : { $meta: "textScore" } }
)
.sort({ score : { $meta : 'textScore' } })
.exec(function(err, results) {
// callback
});
这也将按相关性分数对结果进行排序。
对于weights,您可以尝试将权重选项对象传递给index()
方法(您定义复合索引)(至少使用mongoose的v4.0.1):
schema.index({ animal: 'text', color: 'text', pattern: 'text', size: 'text' }, {name: 'My text index', weights: {animal: 10, color: 4, pattern: 2, size: 1}});
答案 1 :(得分:2)
从MongoDB 2.6开始,一个集合最多可以有一个文本索引(记录为here)。因此,您将无法使用当前版本的MongoDB执行所需操作。实际上,对于复杂的文本搜索问题,根据匹配的位置需要不同的权重,您应该考虑像Solr或ElasticSearch这样的完整文本搜索解决方案。
作为MongoDB中的一种解决方法,您可以手动对字段进行标记,将它们存储为关键字数组并对其进行索引:
animal: ["The", "quick", "brown", "fox", "jump", ..., "dog"]
然后像
这样的查询db.test.find({animal:{$ in:[“brown”,“shoes”]})
模仿文字搜索。这种方法有一些限制,例如设置它所需的手动工作,事实上不会产生干扰,例如,将“梦想”与“梦想”相匹配,这样一个事实就是不会像正常文本索引,并且没有任何加权机制。
答案 2 :(得分:1)
我发现以下文章引导我进入http://code.tutsplus.com/tutorials/full-text-search-in-mongodb--cms-24835 我使用以下
删除了在顶部答案中创建的索引db.tablename.dropIndex({"indexname_text"})
我使用此命令获得了索引列表
db.tablename.getIndexes()
然后我使用以下内容创建索引
db.tablename.createIndex({"$**":"text"})
以下命令在Mongoose中起作用
model.find(
{$text: {$search: "text you are searching for"}},
{score: {$meta: "textScore"}})
.sort({score:{$meta:"textScore"}}
)
.exec(function(err, results) {
`enter code here`if(!err){
console.log('results ' + results);
}
else
{
console.log(err);
}
});
答案 3 :(得分:-1)
Dim bassRows = dtSample.Select("Fish = 'Bass'")
For Each dr As DataRow In bassRows
dr("Fish") = "Pike"
Next