在Mongodb文档中找到n个单词

时间:2015-01-27 16:08:08

标签: mongodb

我试图创建一个查询,找到符合条件的文档集合,一个简单的搜索系统。问题是集合中的资产是这样的:

{ 
 fristName: "foo",
 lastName: "bar",
 description: "mega foo",
},
{ 
 fristName: "Lorem",
 lastName: "Ipsum",
 description: "mega Lorem bla bla",
},

如果用户想要包含单词 bar 的所有资产,我应该显示示例的资产1,这不是问题,但如果他输入了 foo mega < / em>?,在这种情况下我还需要显示资产1,因为 foo mega 存在于资产1(两者都是)中,如果他只搜索< em> mega ,输出是资产1和2,如果他搜索mega ipsum,结果是资产2.我不知道如何在mongoDb中编写此查询。

2 个答案:

答案 0 :(得分:3)

Mongodb 2.6+内置支持使用$text运算符进行文本搜索。以下是如何使用它。

  1. 在所需的可搜索字段上构建文本索引。注意:对于MongoDB 2.6,集合上只能有1个文本索引。

    在一个字段上创建文本索引

    db.test.ensureIndex({ 
        "field1" : "text"
     }, { name : "Field1TextIndex"});
    

    在两个字段上创建文本索引

    db.test.ensureIndex({ 
        "field1" : "text",
        "field2" : "text"
     }, { name : "Field12TextIndex"});
    

    为任何字符串字段创建文本索引

    db.test.ensureIndex({ 
        "$**" : "text" 
    }, { name : "AllTextIndex"});
    
  2. 使用$ text运算符查询集合。

    以下是$text

    的格式
    { $text: { $search: <string of keywords>, $language: <string> } }
    
  3. 示例代码

    设置

    use test;
    var createPerson = function(f,l,d){
        return { firstName : f, lastName: l, description : d};
    };
    db.test.remove({});
    db.test.insert(createPerson("Ben", "Dover", "Real Estate Agent"));
    db.test.insert(createPerson("James", "Bond", "secret agent, ben's friend"));
    

    在文档中的所有字符串字段上创建文本索引。

    db.test.ensureIndex({ "$**" : "text" }, { name : "AllTextIndex"});
    

    查询关键字的所有字段

    正在搜索ben

    db.test.find({  
        $text : {
            $search : "ben"
        }
    });
    

    输出

    { "_id" : "...", "firstName" : "James", "lastName" : "Bond", "description" : "secret agent, ben's friend" }
    { "_id" : "...", "firstName" : "Ben", "lastName" : "Dover", "description" : "Real Estate Agent" }
    

    对“ben”的搜索返回了两个文档,因为BenfirstName,另一个ben's字段为description

    查询real friend会产生相同的结果。

    db.test.find({  
        $text : {
            $search : "real friend"
        }
    });
    

    更多信息:

答案 1 :(得分:2)

可能的解决方案是通过关键字进行搜索。我的意思是你必须为每个对象添加keywords字段,例如:

{ 
 fristName: "foo",
 lastName: "bar",
 description: "mega foo",
 keywords: ["foo", "bar", "mega"]
},
{ 
 fristName: "Lorem",
 lastName: "Ipsum",
 description: "mega Lorem bla bla",
 keywords: ["mega", "Lorem", "Ipsum", "bla"]
},

您必须将请求字符串拆分为关键字,例如

"foo mega"

将转换为

["foo", "mega"]

然后您可以按keywords字段搜索对象。