申艳超-博客

搜索引擎、分布式、高性能、NLP、ElasticSearch、Solr

0%

当使用Solr来构建搜索引擎的时候,你可能经常会遇到这样的场景:你有一个同义词列表,并且你想用户查询也能够命中到同义词。听起来很简单不是吗?为什么搜索“dog”的时候,不能命中包含“hound(猎犬)”或者“pooch(狗)”的文档呢?甚至包含“Rover(流浪者)”和“canis familiaris(犬)”?

solr plugin 小狗

叫Rover或者其他名字,可能只是为了让小狗听起来很可爱。

事实证明,Solr的同义词扩展没有你想象的那么简单。但是我们有很多好的方法来搬石头砸自己的脚。

Read more »

软件版本

  • Ubuntu Linux
  • mahout-0.9,本文写作的时候的最新版本
  • Sogou语料库精简版
  • ik-analyzer, 这个版本是专门为了在mahout中进行分词而单独做的版本,源码从官方拿来。只更改了停用词,以及适配lucene4.6.1版本。maven化更方便使用。

Sogou语料库处理

下载后的预料库,文档都是GB2312编码的。虽然mahout支持不同的编码方式,但是为了更方便的放到Hadoop里跑,还是建议先转化为标准的UTF-8.
语料库解压后,是sogou目录。我们执行以下代码进行转化,转换后的在utf/sogou目录下:

1
2
find sogou -type d -exec mkdir -p utf/{} \;
find sogou -type f -exec iconv -f GB2312 -t UTF-8 {} -o utf/{} \;

使用mahout生成sequence file

进入utf/sogou目录,执行:

1
mahout seqdirectory -i sogou -o sogou-seq -c UTF-8 -ow

生成的sequence file存放在sogou-seq目录内。
可以通过seqdumper命令查看:

Read more »

 在工作中,经常会遇到使用操作系统不一样的环境,从而导致在不同环境下的文件编辑的编码是不一样的,Windows默认是GBK编码格式,Linux默认是UTF-8的格式,这样就会出现把GBK编码的文件拷贝到Linux下出现乱码情况,很是让人头疼,下面给大家介绍下GBK->UTF-8文件编码批量转换。

Linux命令-enca 查看文件的编码

Enca语法

1
2
3
Usage:  enca [-L LANGUAGE] [OPTION]... [FILE]...
enconv [-L LANGUAGE] [OPTION]... [FILE]...
Detect encoding of text files and convert them if required.

Enca用法

1
2
3
$ enca -L zh_CN file 检查文件的编码
$ enca -L zh_CN -x UTF-8 file 将文件编码转换为"UTF-8"编码
$ enca -L zh_CN -x UTF-8 file1 file2 如果不想覆盖原文件可以这样

除了有检查文件编码的功能以外,”enca”还有一个好处就是如果文件本来就是你要转换的那种编码,它不会报错,还是会print出结果来, 而”iconv”则会报错。这对于脚本编写是比较方便的事情。

Read more »

安装需求

  • Java 1.6
  • ssh,sshd正常安装

确保可以ssh到localhost,并且不需要密码

1
ssh localhost

如果报错,connect to host localhost port 22:Connection refused。说明ssh-server未安装或者未启动。
运行:

1
ps -ef | grep sshd

查看sshd进程是否存在,如果不存在,说明没有安装。那么进行安装。

1
sudo apt-get install openssh-server

然后再执行ssh localhost,如果不能无密码登陆,需要做一下操作:

1
2
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
Read more »

Hadoop软件供应商Cloudera去年收购了一家总部位于伦敦的新兴企业Myrrix——但在此之后无论是买家还是卖家在机器学习技术方面都开始归于沉寂。不过无论如何,Myrrix公司的技术方案加上其创始人Sean Owen可能已经足以值回票价。

  Owen目前的正式头衔为数据科学部门主管,目前他正专注投身于名为Oryx的开源机器学习项目当中。(Oryx意思是剑羚、属于非洲羚羊的一类分支,Cloudera在售的产品中则有一款名为Impala——即黑斑羚)。Oryx的开发意图在于帮助Hadoop用户构建机器学习模式并将其加以部署,这样我们就能够以实时方式查询并获取其结果——例如将其作为垃圾邮件过滤器或者推荐引擎的组成部分。在理想状态下,Oryx能够在接纳输入数据流的同时对自身进行更新。

Read more »

solr 查询参数中有tie这样的一个参数,下面是它的官方解释:

The tie (Tie Breaker) Parameter

1
2
3
The tie parameter specifies a float value (which should be something much less than 1) to use as tiebreaker in DisMax queries.
When a term from the user's input is tested against multiple fields, more than one field may match. If so, each field will generate a different score based on how common that word is in that field (for each document relative to all other documents). The tie parameter lets you control how much the final score of the query will be influenced by the scores of the lower scoring fields compared to the highest scoring field.
A value of "0.0" makes the query a pure "disjunction max query": that is, only the maximum scoring subquery contributes to the final score. A value of "1.0" makes the query a pure "disjunction sum query" where it doesn't matter what the maximum scoring sub query is, because the final score will be the sum of the subquery scores. Typically a low value, such as 0.1, is useful.

读起来比较令人费解。

简单解释就是:

这个tie参数通常是一个小于1的浮点数,用于defType=disMax的solr查询。当查询命中多个field的时候,最终的score获得多少将由这个tie参数来进行调节。比如命中了field1,field2这2个field。

如果field1.score= 10,field2.score=3。那么 score = 10 + tie * 3.

也就是说,如果tie=1的话,最终的score就相当于多个字段得分总和;如果tie=0,那么最终的score就相当于是命中的field的最高分。

通常情况下呢,官方推荐tie=0.1。

Java7新特性

Java7语法特性

根据JSR 334,Java7添加了数个语法方面的新特性:

1. switch可以消化String

比如:

1
2
3
4
5
6
7
8
9
10
public static void switchString(String s){
switch (s){
case "db": ...
case "wls": ...
case "ibm": ...
case "soa": ...
case "fa": ...
default: ...
}
}
Read more »

常用的excel操作工具

  • Apache POI
  • jexcelApi

它们都提供了完善的API来支持EXCEL的读写。

jXLS是什么?

jXLS是基于apache poi的一个扩展。它的功能就类似于jstl在servlet中的作用,你可以自定义一个模板,然后往里面放数据就OK了。

jXLS的基本功能:

  • 支持Excel 95-2000的所有版本
  • 生成Excel 2000标准格式
  • 支持字体、数字、日期操作
  • 能够修饰单元格属性
  • 支持图像和图表
1
2
3
4
5
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-core</artifactId>
<version>1.0.5</version>
</dependency>
Read more »

为什么使用quartz集群?

在服务部署一个节点的时候,quartz任务是可以正常运行的。但是如果你业务上需要部署2个或者以上的集群时,就需要处理集群之间的定时任务执行问题了。而quartz集群就是为了解决这个问题的。前提是集群的时间同步,以及共用同一个数据库。
quartz集群在spring中的配置

1.导入数据库表

以mysql为例,下载quartz发行版,在/docs/dbTables下找到tables_mysql_innodb.sql。导入数据结构到数据库内。 使用tables_mysql.sql的话,由于没有指定使用innodB引擎,在一些默认使用MYISAM的数据库实例内可能会报错。

注意事项:

修改SQL: TYPE=InnoDB –> ENGINE=InnoDB

Read more »

velocity在spring项目中的使用

本文,不是讲velocityResolver来渲染页面的只从最原始的使用方式如何使用。
首先,可以交给Spring来初始化velocityEngine:

1
2
3
4
5
6
7
8
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="configLocation">
<value>classpath:velocity.properties</value>
</property>
<property name="resourceLoaderPath">
<value>/WEB-INF/velocity/</value>
</property>
</bean>

其中的configLocation指明了velocity的配置文件路径。也就是说一些个性化的配置都可以直接在velocity.properties进行操作了。比如下面的例子:

1
2
3
4
5
6
7
8
9
resource.loader  =  file

file.resource.loader.description = Velocity File Resource Loader
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.cache = true
file.resource.loader.modificationCheckInterval = 100

input.encoding = utf-8
output.encoding = utf-8

需要注意的是,resource.loader可能有多种选择,最常用的是file,class.当然也有webapp,jar等类型。file要求指明具体的路径,而在WEB应用里这块常常就会出现问题。因此,我们倾向于认为从classpath来加载模板。但是,为什么此处仍然推荐使用file而不是class呢。那是因为:

  • spring增强了file加载的能力,推荐使用resourceLoaderPath来指明路径,而不是交给file.resource.loader.path进行处理。如果使用这个可能会跑NullPointerException;
  • class加载存在弊端,在生产环境classpath里的内容一旦加载就被缓存起来了,这导致velocity模板加载的cache机制失效。

关于Velocity使用的坑

  • 关于减号(-)的问题

    请注意下面的2中写法
    #set($maxIndex=$DOC_COUNT-1)报错
    #set($maxIndex=$DOC_COUNT - 1)正确,区别仅在于-两侧的空格

  • 关于Range类型的问题

    #set($array = [0..$maxIndex]) 这个里面$maxIndex应该只是一个变量,不能是一个表达式。比如这样#set($array = [0..$maxIndex+1])也是错误的。