Umbraco Examine 实现Fuzzy search
在Umbraco examine search项目开发中,有一个需求, 就是intercom 和 intercoms需要返回同样的结果
也就是说 搜索intercom 时, 能返回包含intercom和intercoms的结果
搜索intercoms时,能返回包含intercom和intercoms的结果
在网上搜索了一下,发现需要使用Fuzzy Search
使用Fuzzy Search 又有两种方式:
一种是IExamineValue, 因为SearchTerm.Fuzzy(0.1f) 返回的就是IExamineValue, 其中SearchTerm是指你的搜索框中输入的搜索字段(比如你要搜索intercom, 那么SearchTerm就是intercom)
另外一种是QueryString的形式,它应该看上去是如下的形式
-hideFromSearch:1 +(seoMetaKeywords:patrner~0.6 pageName:patrner~0.6 bodyText:patrner~0.6 richText:patrner~0.6 FileTextContent:patrner~0.6 ) +(seoMetaKeywords:pharmacies~0.6 pageName:pharmacies~0.6 bodyText:pharmacies~0.6 richText:pharmacies~0.6 FileTextContent:pharmacies~0.6 )
在我们的项目中,使用Fuzzy search之前,我们使用QueryString,格式如下:
(body:intercoms*) OR (detail:intercoms*) OR (additionalDetail:intercoms*) OR (title:intercoms*)
为了达到我们的目的,我们需要更改成如下形式
(body:intercoms~0.1) OR (detail:intercoms~0.1) OR (additionalDetail:intercoms~0.1) OR (title:intercoms~0.1)
在代码处,进行了如下更改:
Before
private static string BuildQueryString(string filter, string field) { var singleTerms = filter.Split(' '); var sb = new StringBuilder(); foreach (var term in singleTerms) { sb.Append(field); sb.Append(":"); sb.Append(term); sb.Append("*"); sb.Append(" AND "); } var reStr = sb.ToString(); reStr = reStr.Remove(reStr.LastIndexOf("AND") -1); reStr = "(" + reStr + ")"; return reStr; }
After
private static string BuildQueryString(string filter, string field) { var singleTerms = filter.Split(' '); var sb = new StringBuilder(); foreach (var term in singleTerms) { sb.Append(field); sb.Append(":"); sb.Append(term); //sb.Append("*"); // Comment for update to use fuzzy search sb.Append("~0.1"); sb.Append(" AND "); } var reStr = sb.ToString(); reStr = reStr.Remove(reStr.LastIndexOf("AND") -1); reStr = "(" + reStr + ")"; return reStr; }