2017-04-10 204 views
1

任何人都可以在我們的應用程序的「搜索」功能中幫助我解決問題,其中他們喜歡對這兩個示例單詞具有相同的結果,即玩具玩具在搜索引擎中搜索單數和複數的單詞

因此,舉例來說,如果他們搜索「玩具」,那麼應用程序應返回,在具有「玩具」或「玩具」「玩具」,反之亦然所有數據。

我已經使用。載有()在LINQ,因爲這是實現這一結果的最佳方式,但是當我檢查「玩具」它搜索「玩具」和「玩具」和然後當我搜索「玩具」只搜索「玩具」,並沒有「玩具

這裏是我的示例代碼:

context.CapabilityHasMethodHasSubstances 
    .Where(c => c.Substance.SubstanceLocale.Where(x => x.LocaleId == 2057).FirstOrDefault() 
    .Description.Contains(filter) && !c.IsDeleted) 
    .Select(c => c.CapabilityId).ToList() 

在此先感謝有人可以幫我解決我的問題。 :)

+0

進出口猜測改變tofrom .Contains(過濾器)。(包含(過濾器)|| .contains(過濾器「+ s」)),是的,這將使羊羊,但你應該沒有羊 – BugFinder

+0

ahmm,但你認爲這裏有一個問題,當你的搜索關鍵字實際上有「S」在最後,像例如「新聞」,那麼這將在代碼中增加另一個「s」基礎?或者我們最後要刪除「s」,但現在的問題將是「新聞」與「新」不同的結果。再次感謝。 – g0y

+0

您可以使用像[Humanizer](https://github.com/Humanizr/Humanizer)這樣的庫複數化/單化 –

回答

0

一個想法是爲您的filter(搜索詞)引入一些alias的集合。

你現在的任務是解決複數形式,這可以通過這個來實現。此外,如果您以後必須將同義詞分配給指定的單詞,則可以輕鬆擴展此功能。

Dictionary<string, string> AliasDict = new Dictionary<string, string>() 
    { 
     { "Toys" , "Toy"},  // plural form 
     { "Game" , "Toy"},  // synonym 
     { "Games" , "Toy"}, // plural synonym 
     { "Sheeps" , "Sheep" } 
    }; 

    public string ResolveAlias(string alias) 
    { 
     if (AliasDict.ContainsKey(alias)) 
     { 
      return AliasDict[alias]; 
     } 
     return alias; 
    } 

在你的代碼只是在這樣的方法:

context.CapabilityHasMethodHasSubstances 
    .Where(c => c.Substance.SubstanceLocale.Where(x => x.LocaleId == 2057).FirstOrDefault() 
    .Description.Contains(ResolveAlias(filter)) && !c.IsDeleted) 
    .Select(c => c.CapabilityId).ToList() 
+0

Hi @Smartis。我會嘗試這個,我認爲這是解決我的問題的好方法。感謝大家的幫助。 – g0y