2017-10-17 186 views
0

目前即时通讯试图让搜索功能查询工作。我搜索一个名为“追踪”我的输入表是一个搜索字段。 轨道表有:标题,艺术家和专辑。我能够搜索“迈克尔·杰克逊”的艺术家或者“打败它”将藏汉工作,但我不能让它的工作“迈克尔·杰克逊打败它”,所以我bassicly希望它在同一时间同时搜索标题和艺术家。 我当前的查询搜索功能查询LINQ

Db.From<Track>() 
    .Where(q => q.Title.Contains(request.Trackname) || 
       q.Artist.Contains(request.Trackname) || 
       q.Album.Contains(request.Trackname)) 
    .Limit(20); 

会并欣赏一些帮助

+0

您需要拆分输入要搜索这两个领域,或合并列,即'(q.Artist +“” + q.Title)。载有(request.TrackName);' – Ric

+0

你应该分裂您输入的字符串和单独搜索每个部分。您可以决定是否要申请AND或OR规则。这是常见的,以允许报价执行某些短语将被处理为一体,如'“Michael Jackson的”,“打败它”'这将查询为文本 – musefan

+0

的2块不应该'request.Trackname.Contains(Q。标题)...'? –

回答

1

你基本上需要分割由用户输入的搜索关键字的每一个字,然后搜索那些个人,

  1. 首先匹配的原话
  2. 然后部分匹配

还使用Distinct需要消除重复记录

var searchStrings = request.TrackName.Split(' ').ToList(); 

Db.From<Track>() 
    .Where(q => 
       request.TrackName.Equals(q.Album) || 
       request.TrackName.Equals(q.Artist) || 
       request.TrackName.Equals(q.Title) || 
       request.TrackName.IndexOf(q.Album) > 0 || 
       request.TrackName.IndexOf(q.Artist) > 0 || 
       request.TrackName.IndexOf(q.Title) > 0 || 
       searchStrings.Any(x => x.Equals(q.Title)) || 
       searchStrings.Any(x => x.Equals(q.Artist)) || 
       searchStrings.Any(x => x.Equals(q.Album))) 
    .Distinct() 
    .Limit(20); 
+1

'searchStrings.Contains(q.Artist)'和'searchStrings.Any(X => x.Equals(q.Artist))'(和所有其他对)是等价的,你不需要因为自己的成果同时添加是完全一样的。 – Flater

+0

这也会遇到与其他答案相同的问题:将查询分解为单词([“Michael”,“Jackson”,“Beat”,“It”])。这些话都永远不会满足艺术家的全名('“迈克尔·杰克逊”') – Flater

+0

现在@Flater检查。 –

1

的一种方式,你可以得到最期望的结果像这样,

拆分输入的搜索,然后用标题,艺术家,专辑相匹配。

 string search ="michael jackson beat it"; 

      var searchKeys = search.split(' '); 

      Db.From<Track>() 
      .Where(q => q.Title.Contains(request.Trackname) || 
       q.Artist.Contains(request.Trackname) || 
       q.Album.Contains(request.Trackname)) || 
       searchKeys.Contains(q.Album) || 
       searchKeys.Contains(q.Artist) || 
       searchKeys.Contains(q.Title) || 
       Array.Exists(searchKeys, z=> q.Title.Contains(z)) || 
       Array.Exists(searchKeys, z=> q.Artist.Contains(z)) || 
       Array.Exists(searchKeys, z=> q.Album.Contains(z)) 
    .Limit(20); 

它会给你造成任何一种方式,如果用户搜索,如:

  • 迈克尔·杰克逊击败它
  • 击败它迈克尔·杰克逊
+1

这不起作用。你用whitespace('[“michael”,“jackson”,“beat”,“it”]'分割查询,这些都不会匹配艺术家的全名,'searchKeys.Contains(q.Artist)'会返回即使'q.Artist =“Michael Jackson”'也是false,并且'q.Artist.Contains(request.Trackname)'将返回false,因为您的搜索字符串包含“击败它”,而艺术家的名字不包含 – Flater

+0

@ Flater:现在检查它应该工作。 –