利用 lucene.net 实现高效率的 WildcardQuery ,记一次类似百度搜索下拉关键字联想功能的实现。
打开百度输入 
站内搜索也要实现类似功能。最基础的做法,写个方法查数据库搜索历史综合表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 ,记一次类似百度搜索下拉关键字联想功能的实现。的更多相关文章
- 利用Lucene与Nutch构建简单的全文搜索引擎
文章地址 1.简介 本次实现分为两个部分,第一个部分是利用Lucene构建一个全文的搜索引擎,另外一部分则是利用Nutch实现同样的功能.由于Lucene并不是一个可以直接运行的程序,且不具备爬虫和文 ...
- 利用Lucene将被索引文件目录中的所有文件建立索引
1.新建两个文件夹htm和index,其中htm中存放被索引的文件,index文件中存放建立的索引文件. 2.新建解析目录中所有文件的类,用来解析指定目录下的所有文件. import java.io. ...
- 利用Lucene.net搜索引擎进行多条件搜索的做法
利用Lucene.net搜索引擎进行多条件搜索的做法 2018年01月09日 ⁄ 搜索技术 ⁄ 共 613字 ⁄ 字号 小 中 大 ⁄ 评论关闭 利用Lucene.net搜索引擎进行多条件搜索的做法 ...
- 利用js取到下拉框中选择的值
现在的需求是:下拉框中要是选择加盟商让其继续选择学校,要是选择平台管理员则不需要选择学校.隐藏选择下拉列表. 选择枚举值: /// <summary> /// 平台角色 /// </ ...
- 利用Scrollow写一个下拉刷新
利用scrollView滑动的2个监听方法实现 //滑动结束时候 出发的方法 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView ...
- 利用python爬取海量疾病名称百度搜索词条目数的爬虫实现
实验原因: 目前有一个医疗百科检索项目,该项目中对关键词进行检索后,返回的结果很多,可惜结果的排序很不好,影响用户体验.简单来说,搜索出来的所有符合疾病中,有可能是最不常见的疾病是排在第一个的,而最有 ...
- 利用FlashPaper实现类似百度文库功能
最近需要实现一个类似百度文库的功能,在Google上淘了一段时间,发现FlashPaper还算能够不错的实现此需求. 首先讲下思路: 1>安装FlashPaper: 2>利用java代码将 ...
- 利用css新属性appearance优化select下拉框
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 利用overflow实现导航栏中常 出现的倒三角下拉小图标
常用网页界面中,导航栏中的倒三角下拉小图标实现,可用overflow: 效果如右图: .Triangle{position:relative;width:280px;height:15px;} ;ov ...
随机推荐
- “不要抄代码!自己的代码也不要抄!”
在 Adventure 位于深圳的电子设备组装厂(SZE)里,小朱狠狠的对自己说. 他刚刚在调试 STM32F407VG 的 SPI 功能.就在昨天,他刚刚调试好了 STM32F407VG 的 USA ...
- Jdk 环境搭建
在安装完jdk后,还需要对jdk的环境变量进行配置才能正常使用,下面教大家如何配置jdk环境变量: 1.右键选择 计算机→属性→高级系统设置→高级→环境变量
- iOS之weak和strong、懒加载及循环引用
一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成 ...
- iOS开发之功能模块--高仿Boss直聘的常用语的开发
首先上Boss直聘的功能界面截图,至于交互请读者现在Boss直聘去交互体验: 本人的公司项目要高仿Boss直聘的IM常用语的交互功能,居然花费了我前后17个小时完成,这回自己测试了很多遍,代码 ...
- jxl导入导出实例
1 package com.tgb.test; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.util.Ar ...
- ajax参数设置略解
通过ajax可以直接由页面访问到服务器.做到不刷新页面,就能刷新数据,为开发带来很大的便利. 1.ajax方式的参数及其功能: $.ajax({ type : "POST", // ...
- 下一代Asp.net开发规范OWIN(2)—— Katana介绍以及使用
接上篇OWIN产生的背景以及简单介绍,在了解了OWIN规范的来龙去脉后,接下来看一下Katana这个OWIN规范的实现,并看看如何使用在我们的Web开发中. 阅读目录: 一. Katana项目的结构和 ...
- SQL Server 监控统计阻塞脚本信息
数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的 ...
- 如何让Log4net日志文件按每月归成一个文件夹,StaticLogFileName参数的用法
想要让Log4net日志(以下称日志)按每月自动归类为一个文件夹,为此,学习和修改了log4net.config文件.查了资料,重点是以下这些参数: <param name=" ...
- mysqldump 备份命令使用中的一些经验总结
mysqldump的一个小坑(自测) 正文:经常使用接触mysql复制功能的朋友应该对mysqldump命令不陌生吧,鄙人最近也在研究学习这一块的内容,经过几天的测试,发现mysqldump使用中容易 ...