C# 使用LINQ搜索关键字

C# 使用LINQ搜索关键字,c#,linq,search,C#,Linq,Search,如果我有一个包含标题的文本字段,并且我有一个关键字列表,那么如何在标题中搜索n个关键字 因此,如果我的标题是烤鸡肉、培根和韭菜馅饼,用户搜索鸡肉培根萝卜,我想返回上面的食谱 基本上我想说,如果标题包含2个或更多的搜索词,那么它被认为是有效的,应该被返回。但如果它只包含1,则忽略它 理想情况下,我希望对它们进行加权,以便列表中出现的术语越多,则越高,但这可能是版本2: 编辑 在这一点上我应该提到,我希望这是原生的.net和c。好的,我知道你说过‘在Linq中做’。假设您正在谈论获取.Net本机字符

如果我有一个包含标题的文本字段,并且我有一个关键字列表,那么如何在标题中搜索n个关键字

因此,如果我的标题是烤鸡肉、培根和韭菜馅饼,用户搜索鸡肉培根萝卜,我想返回上面的食谱

基本上我想说,如果标题包含2个或更多的搜索词,那么它被认为是有效的,应该被返回。但如果它只包含1,则忽略它

理想情况下,我希望对它们进行加权,以便列表中出现的术语越多,则越高,但这可能是版本2:

编辑


在这一点上我应该提到,我希望这是原生的.net和c。

好的,我知道你说过‘在Linq中做’。假设您正在谈论获取.Net本机字符串并使用Linq to对象来实现它,那么我想最明显的解决方案是使用处理单词边界的正则表达式来分解文本;然后根据输入短语迭代每个结果匹配

然而

从你对“v2”的想法来看,我认为你可能应该考虑一些更强大、更适合文本搜索的东西——那么使用文本索引怎么样

它提供了非常强大和非常快速的全文搜索,并具有处理布尔规则的能力;别名,词干,诸如此类的东西

它真的很摇滚

更新-因为您在评论中提到了Linq to Sql

您也可以在表上使用SQL全文索引,但是,有一个缺点:没有到CONTAINSTABLE等子句的本机Linq到SQL转换

因此,您可以通过字符串使用动态查询生成,然后将其提供给DataContext.ExecuteQuery成员。如果select返回构造所需的实体类型所需的列,它将像一个符咒一样工作


当然,也可以只包装一个执行此操作的存储过程

如果是我,我只会做这样的事

创建一个助手类,该类完成两件事,拆分标题并根据关键字匹配返回分数

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;

像安德拉斯建议的那样做一个文本索引可能是你最好的选择。但要回答这个问题,您可以编写一个方法来自定义构建表达式树,以表示一个选择器,该选择器为匹配的每个搜索关键字的属性添加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;
}

AODBDataContext db=新的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;

这是LINQ到SQL、LINQ到实体还是LINQ到对象?我有点希望有一个本机的.net解决方案,避免使用java。我知道我在问题中没有规定这一点。道歉that@griegs:Lucene.Net是Lucene的完整.Net本机端口。不需要java。鉴于您向SqlAh提及Linq,我也更新了我的答案是的,我现在明白了。我想我看到了羽毛和java这个词,我的大脑忽略了剩下的文字。@griegs-是的,我也有这种心理障碍+哇,这真的很酷。我可以在引擎中存储1000条热门记录,以便更快地搜索它们。