Mongodb 使用Mongo DB和全文索引自动完成实现

Mongodb 使用Mongo DB和全文索引自动完成实现,mongodb,text,indexing,autocomplete,full-text-search,Mongodb,Text,Indexing,Autocomplete,Full Text Search,我们目前有一个问题,涉及使用mongo数据库的结果填充特定的自动完成下拉列表 mongo实体的类型如下所示: db.testscore.insert({ name: "demolition", alias: ["explosion", "detonation"], frontPartialName: ["demolitio", "demoliti", "demolit", "demoli", "demol", "demo", "dem"], frontPartia

我们目前有一个问题,涉及使用mongo数据库的结果填充特定的自动完成下拉列表

mongo实体的类型如下所示:

db.testscore.insert({
    name: "demolition",
    alias: ["explosion", "detonation"],
    frontPartialName: ["demolitio", "demoliti", "demolit", "demoli", "demol", "demo", "dem"],
    frontPartialAlias: [ "explosio", "explosi", "explos", "explo", "expl", "exp", "detonatio", "detonati", "detonat", "detona",...<insert more data here>...det],
    partialName: ["emo", "mol", "oli"....<insert more data here>..."emolition", "molition"],
    partialAlias: ["xpl", "plos"...<insert more data here>...,"eton", "toni"]
});
2.)使用用户输入执行文本搜索,并按分数排序

db.testscore.find({
    $text: {
        $search: "<insert input here>"
    }
}, {
    score: { $meta: "textScore"},
    originalName: 1,
    originalAlias: 1
}).sort({
    score: { $meta: "textScore"}
});
db.testscore.find({
$text:{
$search:“
}
}, {
分数:{$meta:“textScore”},
原名:1,,
原鼻甲:1
}).分类({
分数:{$meta:“文本分数”}
});
有没有更好的办法来解决这类问题?我们的数据库目前包含500万条记录,并有望增长, 索引占用了太多的空间,很难容纳内存。我读到mongo依靠它来更快地搜索(否则会出现一些分页)


如果我们不能用mongo实现这一点,我们可能会使用适当的全文数据库。

为什么要分解所有这些标记,然后使用文本搜索?我几乎可以说在一个
$或
字段中有两个
$regex
,两个字段就足够了。但是您将无法获得匹配位置的排名,因为聚合框架(下一个逻辑选择)无法对正则表达式进行“逻辑”匹配。我敢肯定,你的大部分“代币”首先会被
$text
忽略。这可能有点超出MongoDB中基本文本搜索功能的范围排序是最重要的。而且正则表达式的速度慢得可笑。如果它被锚定的话就不会了。不管怎样,因为得分,我排除了这个可能性。正如我所说的,数组中的大部分内容很有可能在索引中被忽略,因为它们实际上是“部分单词”。我想我可能会愚蠢地认为这些是实际单词。例如,插入一个{name:“x”}会将其索引为“x”。我一定是看错了文件。谢谢你的邀请info@BlakesSeven您认为代币被忽略是错误的。即使它们不是真实的单词,mongo仍然会在查询中返回它们。我刚试着插入了直布罗陀的东西,mongo就考虑过了。
db.testscore.find({
    $text: {
        $search: "<insert input here>"
    }
}, {
    score: { $meta: "textScore"},
    originalName: 1,
    originalAlias: 1
}).sort({
    score: { $meta: "textScore"}
});