LINQ Поиск по ключевому слову с релевантностью по порядку в зависимости от количества (LINQ to SQL) - PullRequest
4 голосов
/ 24 августа 2009

Это то, что я сейчас имею в качестве очень простого поиска:

var Results = from p in dx.Listings select p;
if (CategoryId > 0) Results = Results.Where(p => p.CategoryId == CategoryId);
if (SuburbId > 0) Results = Results.Where(p => p.SuburbId == SuburbId);
var OrderedResults = Results.OrderByDescending(p => p.ListingType);
OrderedResults = OrderedResults.ThenByDescending(p => p.Created);

Я понимаю, что могу добавить в .Contains () или аналогичном и вставить ключевые слова из поля ключевых слов (разделить на отдельные элементы), и это должно получить список результатов.

Однако мне нужно упорядочить результаты по основному значению. Это означает, что если запись A содержит 2 ключевых слова (в поле nvarchar (MAX) «Body»), она должна быть выше, чем запись B, которая соответствует только одному из ключевых слов. Мне не нужен полный счет каждого удара ... однако, если это будет проще, это будет хорошо.

Так есть ли способ, чтобы приятно подсчитать количество попаданий как часть заказа? Я могу управлять этим, получая результаты и анализируя, однако я действительно не хочу этого делать, так как анализ, возможно, может затормозить машину IIS, в то время как SQL Server является довольно мощным кластером:)

Если у кого-то есть идеи или советы, это может помочь.

Ответы [ 2 ]

2 голосов
/ 24 августа 2009

Если я вас правильно понимаю, вы хотите позвонить OrderyByDescending( p => p.Body ), но его следует заказывать, сколько раз определенное слово оценивается в p.Body?

Тогда вы сможете создать метод, который будет подсчитывать вхождения и возвращать число подсчетов, тогда вы можете просто сделать OrderyByDescending( p => CountOccurences(p.Body) )

В качестве альтернативы вы можете создать класс BodyComparer , который реализует IComparer , а затем передать его OrderByDescending

EDIT: посмотрите эту ссылку Включить полнотекстовый поиск

0 голосов
/ 24 августа 2009

Вот простой пример, если я правильно понимаю, что вы ищете:

var storedData = new[]{
    new int[] {1, 2, 3, 4},
    new int[] {1, 2, 3, 4, 5}
};
var itemsFromTextBox = new[] { 3, 4, 5 };

var query = storedData.Where(a => a.ContainsAny(itemsFromTextBox))
    .OrderByDescending(a => itemsFromTextBox.Sum(i => a.Contains(i)? 1:0));

Со следующим расширением ContainsAny:

public static bool ContainsAny<T>(this IEnumerable<T> e1, IEnumerable<T> e2)
{
    foreach (var item in e2)
    {
        if (e1.Contains(item)) return true;
    }
    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...