MongoDB全文搜索

创建索引

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

搜索匹配

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

对于具有“ myWord is here ”值的字段,结果为1.

如果我经常搜索所选字段如下,我得到两条记录,一条记录有Name =“ myWord就在这里 ”,第二条记录在详细信息中有“ myWord ”字样为“ 这里的东西,myWord就在这里

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

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

最后,我如何在C#Driver中编写此搜索查询

更新:


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

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

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

由于我没有找到很多有关使用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("MyCollectionName") .Indexes.CreateOneAsync(new BsonDocument("CustomFieldsConcatenated", "hashed"), new CreateIndexOptions { Name = "CollectionName_FieldName_Index" }); 

请注意,通配符可以包含在正则表达式搜索中,但不能包含在全文搜索中。

此SERVER-10227已有function请求票证。 如果这对您来说是一项重要function,请购买门票。

进一步添加到您的评论:

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

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

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

有关详细信息,请参阅“ 匹配操作”页面。