LINQ查询全文搜索

时间:2010-06-28 18:29:04

标签: c# linq

如何查询集合中的“John Doe”这样的关键字,其中属性的值可能是“John M Doe”?做一个包含肯定是行不通的,但下面是对我所追求的一个想法。作为参考,people是包含具有Name和Description属性的Person对象的List。

string keyword = "John Doe";
var q = from person in people
        where person.Name.ToLower().Contains(keyword.ToLower()) || person.Description.ToLower().Contains(keyword.ToLower())
        select person;

3 个答案:

答案 0 :(得分:1)

这听起来像是Linq to Lucene

的情况

答案 1 :(得分:1)

bool MatchKeywords(string keyWord, string text) {
    var tokens = keyWord.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries).Select(s=>s.Trim().ToLower());
    return tokens.Any(t => text.ToLower().Contains(t));
}


//...

string keyword = "John Doe";

var q = from person in people
        where MatchKeywords(keyword, person.Name)
        select person;

答案 2 :(得分:0)

您可以尝试将搜索字词分成标记并单独搜索它们,但这只会到目前为止 - 它不会处理更复杂的变体。你或许可以制作一个正则表达式,但这也不一定能找到更复杂的案例。

如果您需要的不仅仅是简单的匹配支持,您可能需要查看Lucene.NET,它具有更丰富的比较和搜索功能。 Lucene包含对Linq的一些支持,因此可能允许您维护一些查询。