MongoDB 全文搜索

7

创建索引

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

查找匹配项

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

针对一个值为 "myWord is here" 的字段,结果为1。

如果按照以下方式对所选字段进行常规搜索,则会返回两条记录。一条记录的名称为 "myWord is here",而第二条记录的详细信息中的 "Details" 字段中有 "myWord",其内容为 "something here and myWord is here"。

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

我该如何重新创建索引,以便在所有字段中搜索,类似于 SQL 中的任何字段都像 %searchText% 一样?
最后,我应该如何使用 C# 驱动程序编写此搜索查询?
更新:
我进一步研究了它。它会找到所有具有前缀和后缀空格的搜索键的结果,但不会返回单词中字符串的一部分。
例如,它会为值“Hello myWord is here”返回记录,但不会返回“HellomyWord”。
但是根据这份文档,它必须支持通配符搜索。 https://docs.mongodb.com/v3.0/reference/operator/query/text/

MongoDB全文搜索不支持通配符。如果您想使用通配符,请使用正则表达式。 - Saleem
集合中每个列上的正则表达式?我的集合中的所有文档都没有相同的模式。每个文档有30到90个字段。 - HaBo
2个回答

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" });

2
请注意,通配符可以包含在正则表达式搜索中,但不能包含在全文搜索中。
已经有一个功能请求票据 SERVER-10227。如果这对您来说是一个重要的功能,请投票支持该票据。
进一步补充您的评论:
引用:

我进一步研究了一下。它会找到所有具有前缀和后缀空格的搜索键的结果,但不会成为单词字符串的一部分。

例如,它返回值"Hello myWord is here"的记录,但不返回"HellomyWord"

$text运算符匹配完整的词干化单词。目前没有处理返回投影有意义值的字符串索引位置的设施。在您的用例中,搜索术语"myWord"不会匹配"HellomyWord"。但是,它匹配包含,例如,"hi myWord is here""myWord comes"等文档。
有关详细信息,请参阅Match Operation页面。

谢谢您分享这些信息。虽然这不是我需求的解决方案,但它至少让我清楚地了解了MongoDB今天支持哪些功能和什么时候可以期望得到这个功能。 - HaBo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接