2010-07-20 2 views
3

Если у меня есть текстовое поле, содержащее название, и у меня есть список ключевых слов, как я могу найти заголовок, проверяющий (n) количество ключевых слов в заголовке?Ключевые слова поиска с использованием LINQ

Так что, если мой заголовок «Выпечка курицы, бекона и лука-порея», и пользователь ищет «курица-бекон-репа», я бы хотел вернуть вышеупомянутый рецепт.

По существу, я хотел бы сказать, что если в заголовке указано 2 или более условий поиска, то оно считается действительным и должно быть возвращено. но если он содержит только 1, то не обращайте на него внимания.

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

редактировать

я должен упомянуть этот момент, что я хотел бы, чтобы это было родным .net и C#.

+0

Является ли это LINQ для SQL, LINQ для объектов или LINQ для объектов? – StriplingWarrior

+0

Это LINQ to SQL – griegs

ответ

4

Хорошо, я знаю, что вы сказали «сделайте это в Линке». ASSuming, вы говорите о том, что используете родную строку .Net и выполняете ее с использованием Linq для объектов, тогда, я думаю, наиболее очевидным решением будет разбиение текста на регулярное выражение, работающее на границах слов; а затем перебирать каждый результат, соответствующий входным фразам.

Однако ...

Судя по вашей идее для «v2» Я думаю, что вы, вероятно, следует искать в чем-то более мощное и редукторные вокруг поиска текста - так как об использовании Lucene.Net текста индексом?

Он предлагает очень мощный и очень быстрый полнотекстовый поиск - и имеет возможность обрабатывать логические правила; псевдонимы, истоки, все такое.

Это действительно рок.

UPDATE - Поскольку вы упомянули Linq к Sql в комментариях

Вы также можете использовать индексы SQL полнотекстового на вашем столе, однако, есть одна загвоздка: нет родной Linq To Sql перевод на CONTAINSTABLE и другие.

Так что вы можете использовать динамическое создание запросов через строку, а затем подать это в член DataContext.ExecuteQuery<TResult>. Если выбор возвращает столбцы, необходимые для построения типа объекта, который вам нужен, он будет работать как шарм.

Или, конечно, вы можете просто обернуть хранимую процедуру, которая делает это вместо;)

+0

Я как бы надеялся найти собственное решение .net и избежать java. Я знаю, что я не оговаривал это в вопросе. извинения за это – griegs

+0

@griegs: Lucene.Net - это полноценный .Net родной порт Lucene. Никакой Java не требуется. Также обновили свой ответ в свете вашего упоминания Linq to Sql –

+0

Ах да, я вижу это сейчас. я думаю, что увидел перо, а слово java и мой мозг проигнорировали остальную часть текста. – griegs

0

, если бы это было, я бы просто сделать что-то вроде этого ....

Создать вспомогательный класс делает 2 вещи, разбивает заголовок и возвращает оценку на основе ключевых слов матча ....

public static class Helper 
{ 

    public static int GetScore(string Title, params string[] keywords) 
    { 
    // your routine that calcs a score based on the matchs against the Title. 
    } 
} 

then you can use a linq statement like.... 

var matches = from t in GetYourTitles 
       let score = Helper.GetScore(t, keywordlist) 
       where score >= 2 
       orderby score 
       select t; 
+0

Поскольку он использует LINQ to SQL, это не сработает. – StriplingWarrior

1

Ведение текстового индекса, как Андраш предполагает, вероятно, ваш лучший выбор. Но чтобы ответить на вопрос: вы можете написать метод для сборки дерева выражений для представления селектора, который добавляет 1 к свойству для каждого ключевого слова поиска, которое соответствует.См. Ниже:

var entries = new[] { new Entry{ ID = 1, Title = "Baking a chicken, bacon and leek pie"} }.AsQueryable(); 
var search = "chicken bacon turnip"; 
var q = entries.Select(GetSelector(search)); 
var matches = q.Where(e => e.MatchCount > 1); 

public Expression<Func<Entry, EntryMatchCount>> GetSelector(string search) 
{ 
    var searchWords = search.Split(new[] {' '}); 
    // Rather than creating the selector explicitly as below, you'll want to 
    // write code to generate this expression tree. 
    Expression<Func<Entry, EntryMatchCount>> selector = e => 
      new EntryMatchCount 
      { 
       ID = e.ID, 
       MatchCount = (e.Title.Contains(searchWords[0]) ? 1 : 0) + 
          (e.Title.Contains(searchWords[1]) ? 1 : 0) + 
          (e.Title.Contains(searchWords[2]) ? 1 : 0) 
      }; 
    return selector; 
} 
0

AODBDataContext db = new AODBDataContext();

 var fItems = from item in db.Items 
        where SqlMethods.Like(item.Name, l) 
        where cats.Contains(item.ItemType) 
        where item.QL >= minQL 
        where item.QL <= maxQL 
        select item; 
Смежные вопросы