2015-07-21 108 views
0

使用使用Umbraco v6,檢查搜索(並非完整的Lucene查詢)。這是一個拉丁/南美網站。我問過我的大學他們是如何輸入search/URL的標題,並且他們都表示他們沒有,他們只是使用「常規」字符(A-Z,a-z)。忽略檢查搜索中的特殊字符(tittles)

我知道如何去掉特殊字符OUT的字符串傳遞給Examine時,但我需要另一種方式,例如檢查從屬性中刪除特殊字符以匹配查詢。我有很多名稱中含有標題的「節點」(這是我正在搜索的屬性之一)。

帖子,我已經研究:

我試着寫luence查詢(或因此我認爲),但我沒有得到任何命中。

// q is my query from QueryString 
var searcher = ExamineManager.Instance.SearchProviderCollection["CustomSearchSearcher"]; 

//var query = searcher.CreateSearchCriteria().Field("nodeName", q).Or().Field("description", q).Compile(); 
//var searchResults = searcher.Search(query).OrderByDescending(x => x.Score).TakeWhile(x => x.Score > 0.05f); 

var searchResults = searcher.Search(Global.RemoveSpecialCharacters(q), true).OrderByDescending(x => x.Score).TakeWhile(x => x.Score > 0.05f); 

全局類

public static string RemoveSpecialCharacters(string str) 
    { 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < str.Length; i++) 
     { 
      if ((str[i] >= '0' && str[i] <= '9') 
        || (str[i] >= 'A' && str[i] <= 'z' || (str[i] == '.' || str[i] == '_')) 
       || str[i] == 'á' || str[i] == 'é' || str[i] == 'í' || str[i] == 'ñ' || str[i] == 'ó' || str[i] == 'ú') 
      { 
       sb.Append(str[i]); 
      } 
     } 

     return sb.ToString(); 
    } 

如上所述,我需要從Lucene的去除特殊字符(地契),而不是查詢傳入

來自:https://our.umbraco.org/documentation/reference/searching/examine/overview-explanation

我我也讀過關於「分析器」的內容,但是我從來沒有和他們合作過,也不知道哪一個可以得到/安裝/添加到VS等等。是不是更好的方法來解決這個問題?

+0

有人嗎?我一直在研究語言分析器,但我不知道如何將其實施到我的項目 –

回答

1

定製分析儀就是答案。

這是回答的一把umbraco論壇在這裏:https://our.umbraco.org/forum/developers/extending-umbraco/16396-Examine-and-accents-for-portuguese-language

做一個分析儀,剝離所有的特殊字符:

public class CIAIAnalyser : Analyzer 
{ 
    public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader) 
    { 
     StandardTokenizer tokenizer = new StandardTokenizer(Lucene.Net.Util.Version.LUCENE_29, reader); 

     tokenizer.SetMaxTokenLength(255); 
     TokenStream stream = new StandardFilter(tokenizer); 
     stream = new LowerCaseFilter(stream); 
     return new ASCIIFoldingFilter(stream); 

    } 

} 

然後你做了搜索輸入相同。

public class CleanAccent 
{ 
    public static string RemoveDiacritics(string input) 
    { 
     // Indicates that a Unicode string is normalized using full canonical decomposition. 

     if (String.IsNullOrEmpty(input)) return input; 

     string inputInFormD = input.Normalize(NormalizationForm.FormD); 
     var sb = new StringBuilder(); 

     for (int idx = 0; idx < inputInFormD.Length; idx++) 
     { 
      UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(inputInFormD[idx]); 
      if (uc != UnicodeCategory.NonSpacingMark) 
      { 
       sb.Append(inputInFormD[idx]); 
      } 
     } 

     return (sb.ToString().Normalize(NormalizationForm.FormC)); 
    } 

} 

然後在ExamineSettings.config中引用分析器。

+0

出色的發現。非常感謝! –

+0

@PeterSmith你知道如何在Umbraco 7中做到這一點嗎?不能使它工作。解析器錯誤消息:提供者必須實現類「Examine.Providers.BaseSearchProvider」。 – Marco