0

我有一个类 WebItem :

class WebItem
{
   public string Name { get; set; }
   public string Description { get; set; }
   public string Keywords { get; set; }
}

用户输入一些搜索短语,程序应该找到所有项目,其中所有来自搜索短语的术语都存在。前用户输入短语:“一些文本”。该程序应该找到项目,其中

  • (名称包含“一些”,描述包含“文本”)或
  • (名称包含“文本”,描述包含“一些”)或
  • (名称包含“一些”,关键字包含“文本”)或
  • (名称包含“文本”,关键字包含“一些”)或
  • (描述包含“一些”,关键字包含“文本”)或
  • (描述包含“文本”,关键字包含“一些”)或
  • (名称包含“文本”,名称包含“一些”)或
  • (描述包含“文本”,描述包含“一些”)或
  • (关键字包含“文本”,关键字包含“一些”)

用户可以输入不同长度的短语。怎么做?

4

3 回答 3

3

好吧,我不会给你一个完整的解决方案,但听起来你需要:

  • 将用户的输入分解为单词
  • 检查所有单词是否以某种形式包含在项目中。LINQAll方法将在这里为您提供帮助。您只需要弄清楚如何检查单个单词在项目中出现的位置,然后将All其应用于给定查询中的所有搜索词。

你可能很想改变你的结构WebItem。如果这些属性中的每一个都可以包含多个单词,那么您可能希望将它们分开......否则在匹配方面会很棘手。例如,如果用户键入“am”作为搜索词,大概您不希望它匹配带有“name”描述的内容,但您确实希望它匹配带有“I am here”描述的内容. 然后你遇到了词干问题等......

(顺便说一句,如果您要拆分可以匹配的术语,则可HashSet<string>以为 each创建一个WebItem,只是为了匹配。)

请注意,Marc 关于使用专为此类事情设计的第三方 API 的观点很好。

于 2013-01-17T07:49:26.513 回答
0

谢谢,马克。

解决方案非常简单。

 //term - search phrase
 var terms = term.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);

 //searching list.
 var searchList = some_data_list_from_somethere_where_we_are_searching.AsEnumerable();

 foreach (var item in terms)
 {
     searchList = searchList.Where(q => q.Name.Contains(item) || 
                                        q.Keywords.Contains(item) || 
                                        q.Description.Contains(item));
 }
于 2013-01-17T15:02:39.240 回答
0

尝试这个。

 var lst = new List<WebItem>();
        string searchString = "your text";
        string[] searchArr = searchString.Split(" ".ToCharArray());
        lst.Where((l) => searchArr.Count((s) => l.Name.Contains(s)) > 0
                         || searchArr.Count((s) => l.Keywords.Contains(s)) > 0
                         || searchArr.Count((s) => l.Description.Contains(s)) > 0);
于 2013-01-17T08:00:12.223 回答