2012-04-24 67 views
0

至於是什麼,我試圖完成一個例子匹配的字符串,這裏是一些代碼,構建出的書籍稱爲Sentence的字符串屬性的列表。在搜索上的報價短語等關鍵詞

public class Book { 
    public string Sentence { get; set; } 
} 

Book book1 = new Book() { Sentence = "The quick brown fox jumps over the lazy dog" }; 
Book book2 = new Book() { Sentence = "The quick brown frog jumps over the lazy sloth" }; 

List<Book> books = new List<Book>(); 

books.Add(book1); 
books.Add(book2); 

我想通過基於某些用戶輸入的書籍列表進行搜索(搜索要求不應該比此示例更復雜)。

如果用戶提供的quick fox "lazy dog"搜索短語,然後我就回到它有BOOK1作爲集合的成員列表。如果用戶提供搜索短語quick fox sloth,則不應返回任何內容,因爲這三個單詞不會全部出現在任何屬性中。

摘要

  1. quick fox "lazy dog" - 1結果(在引號詞語一起出現,且剩餘的詞單獨地出現)

  2. quick fox sloth - 無結果

  3. "lazy sloth" - 1結果(兩個單詞一起出現在字符串中)

  4. lazy sloth - 1個結果(這兩個詞出現在字符串中的個人)

,我目前擁有的代碼:

//Turn the search word into an array of words (includes support for quotes phrases). E.g: quick fox "lazy dog" becomes a list of these values: `quick`, `fox`, `lazy dog`. 
var searchWords = Regex.Matches(searchWord, @"(?<match>\w+)|\""(?<match>[\w\s]*)""") 
         .Cast<Match>() 
         .Select(m => m.Groups["match"].Value) 
         .ToList(); 

var query = from b in books 
      where (!string.IsNullOrEmpty(b.Sentence) && searchWords.Any(b.Sentence.Contains)) 
      select b; 

這並不適用於情況2.我的代碼工作現在只是尋找1場比賽,如果它獲得1場比賽,那麼它會考慮找到物品。

回答

1

我想你可能希望All() LINQ方法,試試這個:

var query = from b in books 
      where (!string.IsNullOrEmpty(b.Sentence) && searchWords.All(word => b.Sentence.Contains(word))) 
      select b; 
+0

感謝您的答覆。你完全正確,這是我需要解決我的例子。我可能會考慮Lucene.NET,但是這回答了我的問題。 – 2012-04-24 16:37:29

1

而是重塑我會用Lucene.Net車輪。你甚至不需要磁盤上的索引。所有指數+搜索可以在內存中完成(使用Lucene的RamDirectory)

+0

感謝您的回覆。我檢查了他們的頁面,但我找不到有關如何使用它的任何文檔。入門頁面沒有任何用處。 – 2012-04-24 16:36:43

+1

@ Ek0nomik [Lucene.net:您的第一個應用程序(http://codeclimber.net.nz/archive/2009/09/02/lucene.net-your-first-application.aspx)+所有Lucene.Java文件 – 2012-04-24 16:43:04