Skip to content

{ Category Archives } LUCENE

音乐搜索系统部署说明

工作日志,转载请保留出处:唐福林 博客雨 音乐搜索系统部署说明 http://blog.fulin.org/2009/11/pcsearch_deploy.html PC 客户端搜索系统部署说明 唐福林 <tangfulin AT gmail.com> PC 客户端搜索系统主要由 负责建索引的 IndexServer 和负责提供搜索服务的 SearchServer 两部分组成。 IndexServer (目前是 98)负责接收资源库发过来的xml原始文件,解析原始文件,更新索引,并将更新后的索引推送到 SearchServer 上的指定目录供搜索使用。当前架构中,IndexServer 不支持分布式和负载均衡,只能部署在一台机器上。因为索引更新并不频繁,所以这里并不会带来性能瓶颈。如果是为了消除单点故障,可以在另外一台机器上起一个备份进程,当主 IndexServer 故障的时候接收资源库发过来的xml原始文件,但为了保持索引一致,建议不做实际的索引更新操作。这样 IndexServer 故障带来的唯一影响是索引更新延迟。只要做了必要的监控措施,延迟的时间是可以控制在可接受范围内的。IndexServer 主要消耗磁盘IO,也会有一些 cpu 和内存消耗。 SearchServer (目前是 221)负责对外提供搜索服务。SearchServer 当前使用 Resin 提供的 Servlet 环境,以 HTTP 协议提供 Rest 风格的服务。SearchServer 会定期查看工作目录下是否有新的索引到达,如果有,则打开新索引,关闭旧索引。已关闭的旧索引随后会被脚本删除。SearchServer 主要消耗内存和网络IO。 一。部署之前的服务器检查: 1. 确认操作系统发行版本: cat /etc/redhat-release Red Hat Enterprise Linux Server release [...]

音乐搜索的极致(续)

12530 PC客户端音乐搜索项目一期的总结和思考。 SlideShare 上的 pdf: 音乐搜索的极致 View more documents from fulin tang. PPT 的文字内容: 音乐搜索的极致 唐福林 tangfulin@gmail.com http://blog.fulin.org 目录  项目简介  需求描述  搜索实现  查询示例  持续改进 项目简介 (1/3)  中国移动  12530  咪咕  Miniportal  搜索  Out source : edadao 项目简介 (2/3)  时间: 2009 年 9 月 12 日到 10 月 [...]

关于音乐搜索

音乐搜索属于垂直搜索的一种,但它又有着自己独特的一些需求。 首先,几乎所有的音乐搜索都实现了用户输入时的关键词提示功能。但在网上搜索相关的技术文章,大多是讲如何用 Js 实现前台表现层的功能,少有的几篇关于后台技术实现的文章,也都太过简单。标准的办法是使用 Trie 树,但太过晦涩,不够直观。我们打算直接使用 Lucene 的前缀查询来实现,并且计划在项目上线后写一个比较详细的说明。 其次,很多的音乐搜索都提供了拼音查询的功能。比如说用户输入 “liudehua”,关键词提示里会给出 “刘德华”,但即使用户不理会提示,直接点击提交,在服务器端,还是可以查询到关于 “刘德华” 的条目。甚至,用户输入拼音首字母 “ldh”,都可以匹配到 “刘德华”。这主要是考虑到使用音乐搜索的用户群的特点(低龄?懒惰?互联网初级用户?),以及某些艺人的名字确实比较难拼写吧。技术上其实很简单,建索 引的时候,将歌曲名,歌手名等都转成拼音一并进行索引就可以了。唯一一点需要注意的地方在于,多音字的处理。 再次,有些搜索引擎,像 qq music,提供了同音字纠错的功能,可以在用户输入“周洁论”的时候,命中关于“周杰伦”的结果。有了上一步的拼音索引,这一步也很容易实现了。再多做 一步,考虑到南北方的口音差别,很多人 en 与 eng,zh 与 z,n 与 l 不分,在搜索过程中进行一些简单的替换,拼音模糊纠错功能也就水到渠成了。 最后,汉字的模糊搜索。我们常用的一个例子就是,用户输入“刘大华”,能否命中“刘德华”?技术上肯定是可以的,lucene 本身就提供这样的查询,只是在产品设计上,是否有代替用户思考的嫌疑呢?这就需要产品人员去仔细思量了。 前面说的是功能,后面说说排序。 最基础的排序当然是按文档匹配度,也就是 lucene 的 score 来排了。但是有时候编辑推荐的歌曲是一定要排前面的,这个比较好实现。可是点击率比较高的歌曲也要靠前排,这个就有点麻烦了,因为牵涉到频繁的字段更新,以及 boost 值的微调。 最麻烦的是上面说的那一堆的特殊处理。比如用户输入了一个词,精确匹配肯定应该排最前面了,没有精确匹配中文的,拼音全量匹配也可以,分词匹配,或 者部分匹配的结果次之,再接下来应该是前缀搜索,同音字纠错,模糊搜索的匹配条目。最开始的想法一直是多次搜索,可是在多次搜索里,一是无法控制所谓的精 确匹配;二是多次搜索打包的结果用于排序的时候,很麻烦;三则,多次搜索,本身的逻辑就非常复杂。不过今天学会一招,如果不考虑性能损耗,可以说是屠龙刀 级别的必杀技:打包多个 Query 对象,一次搜索!排序的问题,当然使用 Query.setBoost 解决了。至于精确匹配,冗余一个字段,不分词就行。 搭建好了 Hudson,写了一个看起来蛮复杂的 build.xml ,然后每天看着它自动的编译,测试,发布,还是有点成就感的。 开始写测试用例。一边写也一边在思考,搜索引擎项目该如何进行功能正确性的测试,又如何进行搜索结果好坏的评价呢?

当前几个主要的Lucene中文分词器的比较

1. 基本介绍: paoding :Lucene中文分词“庖丁解牛” Paoding Analysis imdict :imdict智能词典所采用的智能中文分词程序 mmseg4j : 用 Chih-Hao Tsai 的 MMSeg 算法 实现的中文分词器 ik :采用了特有的“正向迭代最细粒度切分算法“,多子处理器分析模式 2. 开发者及开发活跃度: paoding :qieqie.wang, google code 上最后一次代码提交:2008-06-12,svn 版本号 132 imdict :XiaoPingGao, 进入了 lucene contribute,lucene trunk 中 contrib/analyzers/smartcn/ 最后一次提交:2009-07-24, mmseg4j :chenlb2008,google code 中 2009-08-03 (昨天),版本号 57,log为:mmseg4j-1.7 创建分支 ik :linliangyi2005,google code 中 2009-07-31,版本号 41 3. 用户自定义词库: paoding :支持不限制个数的用户自定义词库,纯文本格式,一行一词,使用后台线程检测词库的更新,自动编译更新过的词库到二进制版本,并加载 [...]

beta技术沙龙 邀请

http://club.blogbeta.com/82.html beta技术沙龙·大型网站的lucene搜索实战 时间:7月26日14点30分开始 地点:奇遇花园咖啡馆 http://storygarden.me/cafe/map 主题:大型网站的lucene搜索实战 演讲简介:本次活动介绍基于Lucene的站内搜索的实践,后台技术层面的一些想法与实践,包括缩短更新周期,简化重建索引流程,支持大数据量频繁更新的索引,以及在性能和可用性方面作的努力。 主讲人:唐福林 (http://blog.fulin.org https://twitter.com/tangfl) 主讲人简介:从高中的 NOIP 到大学的ACM,是编程竞赛的参与者,也是算法的爱好者,以追求程序或系统的性能的极致为乐。 目前就职于手机之家,负责基于lucene的站内搜索的开发及持续改进。 参与人员:最大的前提是技术出身,第二个要求是写blog。积极参加现场沙龙聊天;如有可能对话题通过blog保持跟进关注。http://club.blogbeta.com/ 网上报名或直接现身沙龙,参与免费,点单另付。 关于沙龙:blogbeta技术沙龙由一群技术人员发起并参与,旨在以技术的视角看待社会、互联网和未来,以务实精神深化交流,促进创新。 update: 讲稿的最终版本下载: http://files.getdropbox.com/u/648709/%E5%9F%BA%E4%BA%8Elucene%E7%9A%84%E7%AB%99%E5%86%85%E6%90%9C%E7%B4%A2-beta.pdf https://docs.google.com/fileview?id=0By5e0-mxw7O0NWM5MzhhZTctZGEwOS00NzkzLTliMGYtY2U0ZjBlMDJhZjcy&hl=zh_CN

加速 lucene 索引建立速度 ImproveIndexingSpeed

本文 只是简单的翻译,原文 在 http://wiki.apache.org/lucene-java/ImproveIndexingSpeed * Be sure you really need to speed things up. Many of the ideas here are simple to try, but others will necessarily add some complexity to your application. So be sure your indexing speed is indeed too slow and the slowness is indeed within Lucene. * 请确认你真的需要更快的索引速度 这里的很多想法都非常容易尝试,但也有一些会给你的程序带来额外的复杂度。所以请确认你的搜索速度真的慢到不能忍受,并且慢的原因的确是因为lucene。 *Make sure [...]

加速 lucene 的搜索速度 ImproveSearchingSpeed

本文 为简单翻译,原文在: http://wiki.apache.org/lucene-java/ImproveSearchingSpeed * Be sure you really need to speed things up. Many of the ideas here are simple to try, but others will necessarily add some complexity to your application. So be sure your searching speed is indeed too slow and the slowness is indeed within Lucene. * 请确认你真的需要更快的搜索速度 这里的很多想法都非常容易尝试,但也有一些会给你的程序带来额外的复杂度。所以请确认你的搜索速度真的慢到不能忍受,并且慢的原因的确是因为lucene。 *Make sure you [...]

基于 lucene 的站内搜索 - 阶段性成果介绍

imobile 站内搜索 —— 基于 lucene 的站内搜索,阶段性成果介绍 关键词:准实时搜索,及时更新,快速重建,可配置,可监控,高性能 实现:分离读写,分离索引和存储,拆分大小库,新索引 reopen,新索引预热 基于Lucene的站内搜索 View more Keynote presentations from Fulin Tang.

Lucene 索引删除测试

测试代码:http://code.google.com/p/fulin/source/browse/JAVA/lucene/imobile/search2/src/search/test/IndexTest.java 结论: 1。lucene 索引删除条目的时候(不 调用 optimize),会修改索引目录的以下文件:segments.gen, segments_N, ***.del 2。lucene 索引目录发生改变后,如果不 reopen index reader,则改变对于 searcher 来说是不可见的。(甚至可以将 idx 目录删除,searcher 仍然能返回结果。测试:idx 目录大小为 1.2G,删除目录后, searcher 搜索热门词仍然正常返回结果,返回结果条数超过4万条) 3。索引拆分大小库后,大库可以不用滚动,而是在同一个目录上进行 reopen ,以减少磁盘 IO 及搜索预热延迟

Lucene 索引滚动流程设计

Lucene 索引滚动流程设计 TangFulin <tangfulin@gmail.com> 一. Index Writer: 1. 这里的 Writer 包括 Index Updater 和 Index Rebuilder ,但 Rebuilder 产生的索引文件不直接传送给 Searcher 使用, 而是覆盖 Updater 的索引,由 Updater 统一处理后续的流程 2. IndexUpdaterScheduler 每隔一段时间会设置 copy out timer 标识。 3. Updater 每次处理完一批 xml 文件后会查看 copy out timer 标识是否已经被设置, 如果是,则将当前的索引拷贝一份到 src-snap 目录下 yyyyMMddHHmm 格式的子目录中 4. Updater 为单线程,每次处理完一批 xml 后都会调用 optimizeAndCloseIdx ,所以可以保证 idx [...]