Как использовать LINQ to SQL для создания ранжированных результатов поиска? - PullRequest
2 голосов
/ 03 января 2011

Я ищу способ использования l2s для получения ранжированного результата по ключевым словам.

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

Так что, если бы у меня было что-то вроде:

string keyword = "SomeKeyword";

IQueryable<Article> searchResults = from a in GenesisRepository.Article
                                    where a.Body.Contains(keyword)
                                    select a;

Каков наилучший способ заказа searchResults на основе количества раз, когда keyword появляется в a.Body?

Спасибо за любую помощь.

Ответы [ 3 ]

1 голос
/ 03 января 2011

попробуйте вставить order by a.Body.Split(' ').Count(w=>w == keyword). Это должно позволить вам увидеть, что концепция работает. Однако я НАСТОЯТЕЛЬНО рекомендую включить в окончательную версию это как часть проекции выбора, возможно, используя пару ключ-значение, и упорядочить по имени свойства:

string keyword = "SomeKeyword";

//EDIT: restructured query to force the ordering to be done on the projection, 
//not the source.
IQueryable<Article> searchResults = (from a in GenesisRepository.Article
                                    where a.Body.Contains(keyword)
                                    select new KeyValuePair<int, Article>(
                                       a.Body.Split(' ').Count(w=>w == keyword), a))
                                    .OrderBy(kvp=>kvp.Key);

причина в производительности; цепочка методов Split (). Count () имеет линейную сложность и будет оцениваться при каждом сравнении двух значений, что делает общую сложность N ^ 2logN сортировки (медленной).

РЕДАКТИРОВАТЬ: Также следует понимать, что a.Body.Contains (ключевое слово) не будет выполнять поиск по целым словам и поэтому будет возвращать статьи, которые содержат «SomeKeywordLongerThanSearch» и «ThisIsSomeKeyword», а также «SomeKeyword». Этого можно избежать, сопоставив регулярное выражение с шаблоном "\ bSomeKeyword \ b", который будет сопоставлять только экземпляры SomeKeyword с границей слова непосредственно перед и после.

0 голосов
/ 03 января 2011

Может быть, это сработает ...

IQueryable<Article> searchResults = from a in GenesisRepository.Article
                                        where a.Body.Contains(keyword)
                                        select a;

searchResults.OrderByDescending(s => Regex.Matches(a.Body, keyword).Count);
0 голосов
/ 03 января 2011

Это небольшой взлом, который я придумал, довольно простой, но определенно не "лучший метод"

IQueryable<Article> searchResults = from a in GenesisRepository.Article
                       where a.Body.Contains(keyword)
                       orderby a.Body.Split(new string[] { keyword }, StringSplitOptions.RemoveEmptyEntries).Count() descending
                       select a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...