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;




        }
原文地址:https://www.cnblogs.com/wphl-27/p/8804463.html