Получить релевантный упорядоченный результат из текстового запроса в коллекции MongoDB с помощью драйвера C#

Я пытаюсь отправить текстовый запрос коллекции и получить результаты в порядке текстового совпадения. документы довольно хорошо объясните, как это сделать в оболочке:

db.articles.find(
   { status: "A", $text: { $search: "coffee cake" } },
   { score: { $meta: "textScore" } }
).sort( { date: 1, score: { $meta: "textScore" } } )

но требует проекции дополнительного поля score из находки в сортировку.

В C# у меня есть функция, которая выглядит так:

public IEnumerable<T> TextSearch<T>(MongoCollection<T> coll, string text) {
    var cursor = coll.Find(Query.Text(text))
        .SetSortOrder(SortBy<T>.MetaTextScore(???));
    foreach(var t in cursor) {
        // strip projected score from value
        yield return t;
    }
}

но я не знаю, как проецировать значение textScore в свои результаты, чтобы я мог укажите столбец до MetaTextScore в SetSortOrder.


person Blake Mitchell    schedule 10.07.2014    source источник


Ответы (1)


Я смог заставить это работать методом проб и ошибок. Хитрость заключается в том, что ваш объект данных уже должен иметь поле, которое будет содержать значение MetaTextScore. Итак, учитывая интерфейс:

interface ITextSearchSortable {
    double? TextMatchScore { get; set; }
}

конечная функция выглядит так:

public IEnumerable<T> TextSearch<T>(MongoCollection<T> coll, string text) where T:ITextSearchSortable {
    var cursor = coll.Find(Query.Text(text))
        .SetFields(Fields<T>.MetaTextScore(t => t.TextMatchScore))
        .SetSortOrder(SortBy<T>MetaTextScore(t => t.TextMatchScore));
    foreach(var t in cursor) {
        // prevent saving the value back into the database
        t.TextMatchScore = null;
        yield return t;
    }
}

Стоит отметить, что TextMatchScore не может иметь украшение [BsonIgnore], иначе будет исключение. Однако он может иметь украшение [BsonIgnoreIfNull]. Таким образом, удаляя значение из объекта данных перед его получением, объект данных можно сохранить обратно в коллекцию, не добавляя в него мусорное значение.

person Blake Mitchell    schedule 25.07.2014