JavaEye3.0开发手记之四 - ruby的全文检索

2023-10-09 18:33

本文主要是介绍JavaEye3.0开发手记之四 - ruby的全文检索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Java平台上面,lucene是众望所归的全文检索工具,lucene性能不俗,程序稳定,第三方扩展和分词算法众多,但是在RoR方面,就没有那么幸运了,JavaEye网站要做全文检索,怎么来解决全文检索的问题呢?

在ruby平台上面,全文检索有三个途径:

1、solr, acts_as_solr

solr是apache开源组织的一个项目,完全基于lucene的最新版本,在lucene的上层提供了一个基于HTTP/XML的Web Services。solr的发行包自己绑定了jetty6.0应用服务器,可以直接启动,成为一个独立的全文检索的web服务。

由于和solr的通讯方式是标准的基于HTTP的XML,所以你可以使用任何编程语言,Java,C++,Ruby,Python都不在话下。你通过向solr发送xml查询请求,让solr在后台运行lucene,返回结果也被封装为xml,当然你也可以让solr去做索引。基本上solr就是lucene的一个Web服务的封装。solr的优势在于为大规模的全文检索做了很多缓存优化,由于采用xml,也不限于客户端的种类。

RoR有一个叫做acts_as_solr的插件,封装了ruby对solr的访问,如果你喜欢用solr作为全文检索,acts_as_solr是一个不错的选择,他可以很方便的让你的RoR应用添加全文检索功能,考虑到lucene的稳定性,这个方案是一个相当不错的选择。

但是这个方案的缺点也是显而易见的,你的RoR应用所有的全文检索都要依赖后台再次向solr服务器发送web请求来获取结果,单个页面的执行速度肯定会受限于后台的跨http的web请求,这对于那些对全文检索功能依赖特别多的网站来说,恐怕很难接受。因此JavaEye3.0不采用solr方案。

2、sphinx

http://robbin.iteye.com/blog/122696

我已经在上一篇博客当中介绍了sphinx。我个人非常青睐sphinx这种独立的第三方全文检索服务器,而且能够和MySQL结合的很好,更不用说其优异的性能了。但是sphinx的缺点在于没有很好的分词扩展的接口,它是一个纯C开发的服务。这对于中文分词功能的支持来说,就很难实现了,因此不得不遗憾的放弃。

3、ferret

ferret是ruby平台模仿lucene的一个移植软件,但是ferret并非纯ruby实现,而是基本上用C编写而成,只有少量面向程序员的接口是ruby写的。ferret虽然和lucene很像,连API也基本一致,但是ferret的成熟度远远不及lucene,这表现在:

1) ferret不支持中文分词
2) ferret用C编写的,其索引格式和lucene不兼容
3) ferret的索引速度很慢,而且很不稳定
4) windows平台的ferret在search的时候会崩溃


尽管ferret有上面这些缺点,但是RoR平台可供选择的余地却不大,因此还是决定使用ferret。

------------------------------ ferret 分割线 ------------------------------

1、acts_as_ferret (AAF)

AAF是一个相当不错的RoR插件,封装对ferret的操作,但是经过我的考察,决定弃用AAF。这是因为AAF是直接绑定到model上面的,这会带来一些问题:

1) 每当model对象被insert/update/delete的时候,AAF会通过model的回调实时更新全文索引。在生产环境这是一个很可怕的事情,多个ruby进程同时更新索引,就会出问题。所以AAF索性提供一个DRB方式的ferret server让你在生产环境去用。

但即便如此,如果多个ruby进程同时更新索引呢? 考虑到ruby的green thread性能,drb server也很容易就被阻塞住。而且退一步来说,即便drb性能很好,每个全文检索请求都去发起一次ruby远程调用,恐怕也是很难接受的事实

2) AAF索引每条model记录,但我却不想索引隐藏贴,况且我的索引机制也不想绑定在model上面。

2、中文分词问题

如果只是简单的中文单字拆分,到不难支持,只需要利用RegexpAnalysis写个正则表达式去匹配UTF-8编码的中文就行了,目前JavaEye的全文检索就是这样处理的,貌似搜索结果还过得去。

但是如果要追求非常精确的搜索结果,则必然需要通过词典的最大匹配算法去进行中文分词。那就只能自己用ruby来写中文分词算法了,这个是留待我们今后要做的工作。

2、ferret的索引稳定性问题

JavaEye网站有8万topic,30万post,由于ruby本身性能不佳,ferret又不很稳定,在服务器上面直接做index,差点把服务器搞瘫了,所以此路不通。

由于全文检索并不需要很高的实时性,所以我们的解决办法就是每天晚上把数据库数据下载到本地的台式机上面,然后在本地台式机上面导入数据库,进行全量索引,然后在压缩打包上传到服务器上面去。这样每天的全文检索结果只会迟后一天的时间,基本上可以满足需求了。

这篇关于JavaEye3.0开发手记之四 - ruby的全文检索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/174760

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD