2017-10-17 104 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:現在檢查它應該工作。 –