MongoDB全文搜索

时间:2016-05-17 18:19:27

标签: c# mongodb

创建索引

db.MyCollection.createIndex({'$**': 'text'}, {name: 'FullTextIndex'})

搜索匹配

db.MyCollection.find({$text: {$search: 'myWord'}}).count()

结果为1.对于具有值“ myWord在这里”的字段

如果我定期搜索选定的字段如下,我会得到两条记录,一条记录有Name =“ myWord就在这里”,第二条记录有“ myWord ”在详细信息中提交“此处的内容,myWord就在这里

db.getCollection('MyCollection').find({  
     "$or":[{"Name":/myWord/i}, {"Details":/myWord/i}]
    }).sort({"Name": 1})

如何重新创建索引,以便在所有字段中搜索SQL,其中任何字段如%searchText%

最后,我如何在C#Driver

中编写此搜索查询

更新

我进一步调查了它。它发现所有搜索键都带有前缀和后缀空格的结果,但不是单词中字符串的一部分。

示例是返回值“ Hello myWord在这里”的记录,但不返回“ HellomyWord

但根据这份文件,它必须支持通配符搜索。 https://docs.mongodb.com/v3.0/reference/operator/query/text/

2 个答案:

答案 0 :(得分:3)

由于我找不到使用Mongo的通配符搜索/全文搜索方面的帮助,我已根据我的要求提出了解决方法。

foreach (var doc in batch)
  {
     if (custDictionary.ContainsKey(projectId))
        {
           string concatenatedCustomFields = custFieldsList.Aggregate(string.Empty,
                            (current, custField) =>
                                current +
                                (ds.Tables[0].Columns.Contains(custField)
                                    ? (ds.Tables[0].Rows[i][custField].GetType().Name == typeof(DBNull).Name
                                        ? string.Empty
                                        : ((string) ds.Tables[0].Rows[i][custField]).StripHtml())
                                    : string.Empty));

                        doc.Add("CustomFieldsConcatenated", concatenatedCustomFields);
        }
    i++;
 }

我读取了每组文档的自定义字段列表,然后创建了连接的Mongo字段,然后在该字段上使用正则表达式查询。

然后改进索引

后添加的查询的性能
  _mongoConnect.Database?.GetCollection<BsonDocument>("MyCollectionName")
                .Indexes.CreateOneAsync(new BsonDocument("CustomFieldsConcatenated", "hashed"), new CreateIndexOptions { Name = "CollectionName_FieldName_Index" });

答案 1 :(得分:2)

请注意,通配符可以包含在Regex搜索中,但不能包含在全文搜索中。

SERVER-10227已有功能请求票证。如果这对您来说是一项重要功能,请上票。

进一步添加评论:

  

我进一步调查了它。它发现所有搜索键都带有前缀和后缀空格的结果,但不是单词中字符串的一部分。

     

示例它返回值“Hello myWord is here”的记录,但不返回“HellomyWord”

$ text运算符匹配完整的词干。目前没有工具来处理字符串中的索引位置,这些位置为投影返回有意义的值。在您的使用案例中,对术语“myWord”的搜索将与“HellomyWord”不匹配。但是,它匹配的文档包含例如“hi myWord is here”“myWord come”等。

有关详细信息,请参阅Match Operation页。