打开百度输入 

站内搜索也要实现类似功能。最基础的做法,写个方法查数据库搜索历史综合表keywordSearch(先将被搜索过的关键字记录到一张表,记录好他们被搜索的次数、上次搜索的有多少结果)

大概一条sql语句:select keyword,searchCount,xxxx from table where keyword like '会计%'

当表 keywordSearch 记录很有几百上千万的时候,like显然不能及时响应了。但是这种关键字联想的一旦有延迟返回,那是很不好的体验。还没等你返回一次联想结果,用户早就自己输完了。。。。。那还联想个球。

然后这个时候,想到的是用lucene.net

二话不说开干。很快实现了demo,创建了索引2g,搜索核心代码如下:(渣渣代码,勿喷)

测试之,大概在1秒内能返回结果,但是还是不够快,有明显的延迟感。

尼玛。。。。。想不到好办法解决,然后试了试用RAMDirectory ,还是不行,毕竟 RAMDirectory 只是将索引一次性读到内存,避免了一个预热的过程,所以瓶颈感觉应该出在了这个WildcardQuery上(谁知道lucene.net要实现这种查询,还有其他办法效率高吗?看到的有知道的请评论告诉我谢谢。)。

当时想的是,看样子只能丢掉一些关键字,比如只汇总最近一年的关键字,把索引搞小一些。

but,周末休息了一下,让我想到了一个办法。

既然要减少单个索引体积,那我为什么不拆分索引?

首先,创建索引的时候,根据关键字的第一个汉字的首字母,来决定放在哪个索引。比如 “会计学” 放在 D:\LuceneIndex\Searchkeyword\k\ 目录下的索引,"管理学"放在 D:\LuceneIndex\Searchkeyword\k\ 目录。

然后检索的时候我也根据用户输入的关键字,检索不同的目录。这样应该就能解决这个问题。

说干就干,又开始改代码。

因为代码篇幅比较大,我就贴一点核心部分。(再次请求原谅我的渣渣代码。。。。)

那个 GetIndexWriter 方法,就是根据汉字首拼字母来获取的,

BLLIndexWriter类里面 用  Dictionary<string, string> 对象,来装所有字母和它对应的索引路径。

然后用了一个 Dictionary<string, IndexWriter> 对象,来装所有字母,和它所对应的 IndexWriter 对象。

当索引全部创建完毕以后,遍历了装所有 IndexWriter 的对象,然后一个个关闭并优化。

最后,索引就一一对应到不同目录了

见图,原来的索引和现在的索引。

平均分了这么多以后,搜索基本上是马上就出结果了。因为每一个都只有几十MB一百MB的。这点量,lucene的通配还是能搞的定的。

对于此类查询,数据库上分表,然后like也可以。只要你愿意用数据库搞的话。

不过谁还知道,有没有什么更好的办法解决这个问题?

记录到这里。渣渣代码不上传了,如果有谁刚好需要写这样的功能,又实在写不出来代码的内线我,我发一份给你。。。。。

利用 lucene.net 实现高效率的 WildcardQuery ,记一次类似百度搜索下拉关键字联想功能的实现。的更多相关文章

  1. 利用Lucene与Nutch构建简单的全文搜索引擎

    文章地址 1.简介 本次实现分为两个部分,第一个部分是利用Lucene构建一个全文的搜索引擎,另外一部分则是利用Nutch实现同样的功能.由于Lucene并不是一个可以直接运行的程序,且不具备爬虫和文 ...

  2. 利用Lucene将被索引文件目录中的所有文件建立索引

    1.新建两个文件夹htm和index,其中htm中存放被索引的文件,index文件中存放建立的索引文件. 2.新建解析目录中所有文件的类,用来解析指定目录下的所有文件. import java.io. ...

  3. 利用Lucene.net搜索引擎进行多条件搜索的做法

    利用Lucene.net搜索引擎进行多条件搜索的做法 2018年01月09日 ⁄ 搜索技术 ⁄ 共 613字 ⁄ 字号 小 中 大 ⁄ 评论关闭 利用Lucene.net搜索引擎进行多条件搜索的做法 ...

  4. 利用js取到下拉框中选择的值

    现在的需求是:下拉框中要是选择加盟商让其继续选择学校,要是选择平台管理员则不需要选择学校.隐藏选择下拉列表. 选择枚举值: /// <summary> /// 平台角色 /// </ ...

  5. 利用Scrollow写一个下拉刷新

    利用scrollView滑动的2个监听方法实现 //滑动结束时候 出发的方法 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView ...

  6. 利用python爬取海量疾病名称百度搜索词条目数的爬虫实现

    实验原因: 目前有一个医疗百科检索项目,该项目中对关键词进行检索后,返回的结果很多,可惜结果的排序很不好,影响用户体验.简单来说,搜索出来的所有符合疾病中,有可能是最不常见的疾病是排在第一个的,而最有 ...

  7. 利用FlashPaper实现类似百度文库功能

    最近需要实现一个类似百度文库的功能,在Google上淘了一段时间,发现FlashPaper还算能够不错的实现此需求. 首先讲下思路: 1>安装FlashPaper: 2>利用java代码将 ...

  8. 利用css新属性appearance优化select下拉框

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  9. 利用overflow实现导航栏中常 出现的倒三角下拉小图标

    常用网页界面中,导航栏中的倒三角下拉小图标实现,可用overflow: 效果如右图: .Triangle{position:relative;width:280px;height:15px;} ;ov ...

随机推荐

  1. HTML5 Canvas眨眼睛动画

    效果请看: http://keleyi.com/a/bjad/p9exlcwi.htm 请使用支持HTML5的浏览器查看效果. 以下是代码: <html> <body> < ...

  2. js 之 continue break return 用法及注意事项

    1,continue continue有两种用法: 1,continue; 这种用法必须包含在循环里,否则报错,例子: for(var i=0;i<10;i++){ if(i%2===0){ c ...

  3. [python]数据整理,将取得的众多的沪深龙虎榜数据整一整

    将昨日取得的众多的沪深龙虎榜数据整一整 提取文件夹内所有抓取下来的沪深龙虎榜数据,整理出沪深两市(含中小创)涨幅榜股票及前5大买入卖出资金净值,保存到csv文件 再手动使用数据透视表进行统计 原始数据 ...

  4. C#读取ini文件的方法

    最近项目用到ini文件,读取ini文件,方法如下: using System; using System.Collections.Generic; using System.Linq; using S ...

  5. iOS检查App新版本并更新新版本

    检查新版本 更新  第一种方法 //检查新版本 更新 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ...

  6. 下一代Asp.net开发规范OWIN(2)—— Katana介绍以及使用

    接上篇OWIN产生的背景以及简单介绍,在了解了OWIN规范的来龙去脉后,接下来看一下Katana这个OWIN规范的实现,并看看如何使用在我们的Web开发中. 阅读目录: 一. Katana项目的结构和 ...

  7. Ignite用户配置管理介绍

    Ignite8这款数据库性能监控.性能分析软件,不光是DBA监控.管理数据库的利器之一,开发人员也可以查看系统性能数据,下面介绍一下如何在Ignite里面配置用户权限,本文纯水文一篇,介绍简单基本的配 ...

  8. SQL Server删除distribution数据库二

    以前总结过一遍博文SQL Server删除distribution数据库,里面介绍了如何删除distribution数据库.今天介绍一个删除distribution的特殊案例, 在这之前,我不知道这个 ...

  9. Ubuntu中root用户和user用户

    从user用户切换到root用户 在ununtu系统中缺省用户是user,出于安全考虑,默认时Ubuntu的root用户时没有固定密码的,它的密码是随机产生并且动态改变的. 但是有的时候我们的用户要执 ...

  10. Neutron 理解 (9): OpenStack 是如何实现 Neutron 网络 和 Nova虚机 防火墙的 [How Nova Implements Security Group and How Neutron Implements Virtual Firewall]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...