2012-04-24 40 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