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

时间:2016-03-10 08:05:13

标签: 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"],
    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"]
});

非常重要:后端应按以下顺序返回以下结果(如果存在)

  1. 与&#34;名称&#34;完全匹配的实体字段
  2. 与&#34;别名匹配的实体&#34;字段
  3. 部分匹配&#34;名称&#34;的前几个字母的实体字段
  4. 部分匹配任何&#34;别名&#34;的前几个字母的实体字段
  5. 部分匹配&#34; name&#34;的部分子字符串的实体字段
  6. 部分匹配任何&#34;别名&#34;的部分子字符串的实体字段

    我们做了什么:

    1。)创建了一个文本索引:

    db.testscore.ensureIndex({
        name: "text",
        alias: "text",
        frontPartialName: "text",
        frontPartialAlias: "text",
        partialName: "text",
        partialAlias: "text"
    }, {
        weights: {
            name: 243,
            alias: 81,
            frontPartialName: 27,
            frontPartialAlias: 9,
            partialName: 3,
            partialAlias: 1
        },
        name: "searchIndex"
    });
    

    2。)使用用户输入执行文本搜索并按分数

    对其进行排序
    db.testscore.find({
        $text: {
            $search: "<insert input here>"
        }
    }, {
        score: { $meta: "textScore"},
        originalName: 1,
        originalAlias: 1
    }).sort({
        score: { $meta: "textScore"}
    });
    

    有没有更好的方法来解决这类问题?我们的数据库目前包含500万条记录,预计会增长, 索引占用太多空间,几乎不适合内存。我已经读过mongo依赖它来更快地搜索(否则会发生一些分页)。

    如果我们无法使用mongo执行此操作,我们最终可能会使用正确的全文数据库。

0 个答案:

没有答案