2013-01-17 50 views
0

我有一個類WebItem中包含特定的搜索短語的項目:搜索和返回使用C#

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

用戶輸入一些搜索短語和程序應該找到的所有項目,從搜索中,所有條款短語存在。 E.x.用戶輸入詞組:「一些文本」。該計劃應該找到的物品,其中

  • (名稱中包含「一些」,並描述包含「文本」)或
  • (名稱中包含「文本」,並描述包含「一些」)或
  • (名稱中包含「一些」和關鍵字包含「文本」)或
  • (名稱中包含「文本」和關鍵字包含了「某些」)或
  • (描述中包含「一些」和關鍵字包含「文本」)或
  • (說明包含「文本」和關鍵字包含「一些」)或
  • (名稱中包含「文本」和名稱中包含「一些」)或
  • (描述中包含「文本」,並描述包含「一些」)或
  • (關鍵字含有「文本」和關鍵字包含了「一些」)

用戶可以輸入不同的長度短語。怎麼做?

+4

你試過了什麼?簡單的答案可能涉及「拆分空間,每個學期申請一個or'd'包含'每個屬性'檢查 - 但是,我想知道是否使用諸如Lucene或Elastic之類的專用搜索工具可能會長期支付分紅 –

回答

3

好了,我不會給你一個完整的解決方案,但它聽起來像你需要:

  • 打破了用戶的投入的話
  • 所有的話檢查是否是以某種形式或其他形式包含在該項目中。 LINQ All方法將幫助你在這裏。您只需制定如何檢查單詞在單詞中出現的位置,然後使用All將其應用於給定查詢中的所有搜索詞。

雖然您可能很想更改WebItem的結構。如果這些屬性中的每一個都可以包含多個單詞,那麼您可能希望將它們分開......否則在匹配方面會非常棘手。例如,如果用戶鍵入「am」作爲搜索詞,大概您不希望它與「name」的描述匹配,但您要它匹配某個描述「我是這裏」。然後你就會遇到干擾等問題......

(順便說一句,如果您要拆分無論如何可以匹配的條款,您可以爲每個WebItem創建一個單獨的HashSet<string>,僅用於此目的)

馬克關於使用第三方API的意見是設計這種事情是一個很好的,介意你。

+2

你有很多點和徽章,他們現在正在削減! –

+0

@RichardSchneider將您的瀏覽器的縮放比例更改爲100%(以90%剪輯) – Default

+0

是的,也許lucene.net或任何其他全文搜索引擎可能會有所幫助,但lucene.net由於配置不正確而不符合此要求也許。因此,如果有人可以描述爲所提及的搜索要求配置lucene,那麼它會非常出色。 – Viktoras

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); 
+0

如果我搜索''一些文本'''並且一個項目具有'Name =「某個」'和'Description =「其他」',我仍然會受到這個打擊。該項目不應根據問題退回。 –

0

謝謝Marc。

該解決方案非常簡單。

//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)); 
} 
+0

如果我搜索''一些文本'''並且一個項目具有'Name =「一些」'和'Description =「other」',我仍然會受到這個打擊。該項目不應根據問題退回。 –