您的位置:首页 > 其它

矩阵的坐标变换

2013-02-20 16:12 197 查看

前言

由于elasticsearch基于lucene,所以天然地就多了许多lucene上的中文分词的支持,比如 IK, Paoding, MMSEG4J等lucene中文分词原理上都能在elasticsearch上使用。当然前提是有elasticsearch的插件。 至于插件怎么开发,这里有一片文章介绍:

http://log.medcl.net/item/2011/07/diving-into-elasticsearch-3-custom-analysis-plugin/

暂时还没时间看,留在以后仔细研究, 这里只记录本人使用medcl提供的IK分词插件的集成步骤。

 

一、插件准备

网上有介绍说可以直接用plugin -install medcl/elasticsearch-analysis-ik的办法,但是我执行下来的效果只是将插件的源码下载下来,elasticsearch只是将其作为一个_site插件看待。

所以只有执行maven并将打包后的jar文件拷贝到上级目录。

(否则在定义mapping的analyzer的时候会提示找不到类的错误)。

由于IK是基于字典的分词,所以还要下载IK的字典文件,在medcl的elasticsearch-RTF中有,可以通过这个地址下载:
http://github.com/downloads/medcl/elasticsearch-analysis-ik/ik.zip
下载之后解压缩到config目录下。

 到这里,你可能需要重新启动下elasticsearch,好让下一部定义的分词器能立即生效。

 

二、分词定义

分词插件准备好之后就可以在elasticsearch里定义(声明)这个分词类型了(自带的几个类型,比如standred则不需要特别定义)。

跟其他设置一样,分词的定义也可以在系统级(elasticsearch全局范围),也可以在索引级(只在当前index内部可见)。系统级的定义当然是指在conf目录下的elasticsearch.yml文件里定义,内容大致如下:

index:
analysis:
analyzer:
ikAnalyzer:
alias: [ik]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider

因为个人喜好,我并没有这么做, 而是定义在了需要使用中文分词的index中,这样定义更灵活,也不会影响其他index。

在定义analyze之前,先关闭index。其实并不需要关闭也可以生效,但是为了数据一致性考虑,还是先执行关闭。(如果是线上的系统需要三思)

 

curl -XPOST http://localhost:9400/application/_close[/code]  (很显然,这里的application是我的一个index)

 

然后执行:

 

curl -XPUT localhost:9400/application/_settings -d '
{
"analysis": {
"analyzer":{
"ikAnalyzer":{
"type":"org.elasticsearch.index.analysis.IkAnalyzerProvider",
"alias":"ik"
}
}
}
}
'

 打开index:

 

curl -XPOST http://localhost:9400/application/_open[/code]  

到此为止一个新的类型的分词器就定义好了,接下来就是要如何使用了

 

三、使用分词器

在将分词器使用到实际数据之前,可以先测验下分词效果:

http://localhost:9400/application/_analyze?analyzer=ik&text=中文分词

 分词结果是:

{
"tokens" : [ {
"token" : "中文",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 1
}, {
"token" : "分词",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 2
} ]
}

 与使用standard分词器的效果更合理了:

{
"tokens" : [ {
"token" : "中",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 1
}, {
"token" : "文",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 2
}, {
"token" : "分",
"start_offset" : 2,
"end_offset" : 3,
"type" : "<IDEOGRAPHIC>",
"position" : 3
}, {
"token" : "词",
"start_offset" : 3,
"end_offset" : 4,
"type" : "<IDEOGRAPHIC>",
"position" : 4
} ]
}

 新的分词器定义完成,工作正常后就可以在mapping的定义中引用了,比如我定义这样的type:

curl localhost:9400/application/article/_mapping -d '
{
"article": {
"properties": {
"description": {
"type": "string",
"indexAnalyzer":"ikAnalyzer",
"searchAnalyzer":"ikAnalyzer"
},
"title": {
"type": "string",
"indexAnalyzer":"ik",
"searchAnalyzer":"ik"
}
}
}
}
'

 很遗憾,对于已经存在的index来说,要将一个string类型的field从standard的分词器改成别的分词器通常都是失败的:

{
"error": "MergeMappingException[Merge failed with failures {[mapper [description] has different index_analyzer, mapper [description] has different search_analyzer]}]",
"status": 400
}

 而且没有办法解决冲突,唯一的办法是新建一个索引,并制定mapping使用新的分词器(注意要在数据插入之前,否则会使用elasticsearch默认的分词器)

curl -XPUT localhost:9400/application/article/_mapping -d '
{
"article" : {
"properties" : {
"description": {
"type": "string",
"indexAnalyzer":"ikAnalyzer",
"searchAnalyzer":"ikAnalyzer"
},
"title": {
"type": "string",
"indexAnalyzer":"ik",
"searchAnalyzer":"ik"
}
}
}
}

 至此,一个带中文分词的elasticsearch就算搭建完成。 想偷懒的可以下载medcl的elasticsearch-RTF直接使用,里面需要的插件和配置基本都已经设置好。

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: