2016-05-17 2 views
7

Создать индексMongoDB полнотекстового поиска

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

Поиск матча

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

Результат 1. для которого подано значение "MyWord находится здесь"

Если я регулярный поиск выбранных полей, как показано ниже, я получаю две записи, одна запись имеет имя = "myWord здесь", а вторая запись имеет " MyWord «в детали, поданной как» то здесь и MyWord здесь "

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

Как я могу воссоздать индекс, так что поиск во всех областях, как SQL, где любое поле, как% SearchText%

И, наконец, как я могу написать этот поисковый запрос в C# Driver

Update:


Я еще посмотрел на него. он находит все результаты, имеющие ключ поиска с префиксными и суффиксными пространствами, но не часть строки в слове.

Пример она возвращается запись для значения «Здравствуйте MyWord здесь», но не возвращает «HellomyWord»

Но в соответствии с этим документом, он должен поддерживать поиск по шаблону. https://docs.mongodb.com/v3.0/reference/operator/query/text/

+0

Полностью текстовый поиск MongoDB не поддерживает подстановочные знаки. Если вы хотите использовать подстановочные знаки, используйте регулярное выражение. – Saleem

+0

Регулярное выражение для каждого столбца коллекции? Все документы в моей коллекции не имеют такой же схемы. Каждый документ имел от 30 до 90 полей – HaBo

ответ

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++; 
} 

Я прочитал список пользовательских полей для каждой группы документов, а затем создать каскадное Монго поле, а затем использовать Regex запрос на этом поле.

Затем, чтобы улучшить производительность запроса добавлено следующее индексировать

_mongoConnect.Database?.GetCollection<BsonDocument>("MyCollectionName") 
       .Indexes.CreateOneAsync(new BsonDocument("CustomFieldsConcatenated", "hashed"), new CreateIndexOptions { Name = "CollectionName_FieldName_Index" }); 
2

Обратите внимание, что шаблонные символы могут быть включены в Regex Поисков, но не в полнотекстового поиска.

Для этого SERVER-10227 уже есть билет с запросом на функцию. Если это важная функция для вас, пожалуйста, пропустите билет.

Далее добавить на свой комментарий:

Далее я посмотрел на него. он находит все результаты, имеющие ключ поиска с префиксными и суффиксными пространствами, но не часть строки в слове.

Пример она возвращается запись для значения «Hello MyWord находится здесь», но не возвращает «HellomyWord»

в $ Текст оператора совпадает по полной стеблях word.There в настоящее время не является объектом для обработки указательных позиций в строках, которые возвращают значимое значение для проекции. В вашем случае использования поиск по термину "myWord" не будет соответствовать "HellomyWord". Тем не менее, это соответствует документ, содержащий, например, «привет MyWord находится здесь» или «MyWord приходит» и т.д.

Для получения дополнительной информации, пожалуйста, см Match Operation страницу.

+0

Благодарим вас за то, что поделились этой информацией. Хотя это не является решением для моего требования, оно, по крайней мере, дает мне ясность в отношении того, что поддерживается в MongoDB сегодня, и когда я могу ожидать эту функцию. – HaBo

Смежные вопросы