• 一步一步做搜索(一)


    感谢枫伶忆 

      http://www.cnblogs.com/fenglingyi/p/4708006.html

    自从了解到搜索优化,分词和权重之后,一直苦于没有结构化的培训数据来做搜索,现在总算可以体验一把了。枫伶忆大大发表博客后半天时间 我就开始在博客园上爬数据,结果爬了一晚上才爬了12w条数据存到数据库,还是比较担心博客园崩溃的,毕竟可以预想到,会有多少人同时开始在博客园爬数据了,嘿嘿 还好没啥事。

     

    刚把图表做出来时别提有多激动了,成就感啊。慢慢的发现然并卵啊。不过我的初衷不是这个,我还是要做搜索,现在数据有了,那就开工呗。

    一开始我就按普通查询来搜索数据库,发现模糊搜索并不能令我满意,再对比一下百度,完全就是渣啊。然后就有了分词的想法,想到就做

     char[] slist = keyword.ToCharArray();

    将输入关键字分解成一个个字符,然后去拼接sql,结果自然不满意  因为查到的数据太杂乱了  再对比下百度,还是渣啊。怎么办呢  为毛人家搜索出来的东西就是准确率那么高呢,我想到了权重 然后大量查资料,得到了如下的sql

    SELECT TOP 15 BlogTitle,BlogTime,BlogUrl FROM BlogActicle WHERE  (BlogId >(SELECT MAX(BlogId) FROM (SELECT TOP 20 BlogId FROM BlogActicle ORDER BY BlogId) AS T ) ) and  BlogTitle like '%" + keyword + "%'" + substr + " ORDER BY (case when BlogTitle like '%" + keyword + "%' then 3 when BlogTitle like '%" + (keyword.Length > 1 ? slist[0] + slist[1] : slist[0]) + "%' then 2 when BlogTitle like'%" + slist[0] + "%'" + substr + " then 1 end ) desc

    我将权重设为3级 完全匹配关键字的 设为3 匹配2个字的设为2 匹配一个就为1 然后将权重排序 便会将权重最高的排在前

    然后再对比百度,尼玛 人家关键字是高亮显示,费了一番功夫 从网上剽窃下来一段代码

      //切词替换成高亮
            public static string HighlightKeyword(string str, char[] keywordValues)
            {
                int index;
              
                string highlightBegin = "<>";
                string highlightEnd = "</>";
    
                for (int i = 0; i < keywordValues.Length; i++)
                {
                    int startIndex = 0; 
                    int length = highlightBegin.Length + keywordValues[i].ToString().Length;
                    int lengthHighlight = length + highlightEnd.Length;
                    var temp = str.ToLower();
                    var temp1 = keywordValues[i].ToString().ToLower();
                   
                    while((index = str.IndexOf(keywordValues[i].ToString(), startIndex, StringComparison.OrdinalIgnoreCase)) > -1)
                    {
                       
                        str = str.Insert(index, highlightBegin).Insert(index + length, highlightEnd);
                        startIndex = index + lengthHighlight;
                    }
    
                }
                //将<>字符串替换<em>
                str = str.Replace("<>", "<em>").Replace("</>", "</em>");
                return str;
            }

    最后得到效果图如下:

    看到logo和样式是不是很熟悉呀,没错,就是百度的样式被我扒下来了。

    接下来有做了用户输入历史记录匹配

    然后再去看本地的txt文件里面都是我的输入记录,不禁感觉有点后怕,尼玛 平常用搜索引擎查东西  百度和浏览器 手机UC 记录了我多少个人记录,太没安全感了 。

    接下来地球人已经阻挡不了我要做全文搜索了。但是数据库数量太多 单个字段 表查还好,全局那不得龟速啊 怎么办呢,经常逛博客园 当然知道 检索神器Lucene 了。还有盘古分词

  • 相关阅读:
    linux文件锁flock【转】
    无尽的悲伤
    go的临时对象池--sync.Pool
    golang 小知识-持续更新中
    【转】Go Channels
    Golang文件名命名规则
    Parquet存储格式
    预装的Office2016,文件图标表显示以及新建失败问题解决 方法
    Gamma编码及Delta编码概述
    java web开发环境配置系列(二)安装tomcat
  • 原文地址:https://www.cnblogs.com/jingch/p/4763692.html
Copyright © 2020-2023  润新知