本文地址,需转载请注明出处:
http://blog.csdn.net/hereiskxm/article/details/47441911
当我们使用中文分词器的时候,其实也希望它能够支持对于英文的分词。试想,任何一个存储文字的字段都有可能是中英文夹杂的。
我们的项目中使用IKAnalyzer作为中文分词器,它在处理文档过程中遇到英文时,利用空格和标点将英文单词取出来,同时也会对其转全小写处理。其实这和真正的英文分词已经很接近了,只有一墙之隔:词干提取。一个真正的英文分词器除了分割提取单词和全小写处理以外,还会把单词回溯成词根。
比如说有一个句子:
I like cats!
它的正确分词为:
[i, like, cat]
词根化是一个英文分词器需要具备的功能。IKAnalyzer正是缺少了这点,它对例句的处理结果会是:[i, like, cats],这显然不是我们想要的:我们希望用 “cat” 和“cats” 都能搜索出这个句子,而不是非得用“cats” 才能搜到。
分析一下analyzer的内部逻辑:
Analyzer 的内部就是一条流水线 Step 1 字符过滤(Character filter) Step 2 分词 (Tokenization) Step 3 Token 过滤(Token filtering) ElasticSearch:为中文分词器增加对英文的支持(让中文分词器可以处理中英文混合文档)
Elasticsearch 已经默认构造了 8个 Analyzer。若无法满足我们的需求,可以通过「Setting API」构造 Analyzer。
通过构造analyzer,我们可以对IK中文分词器做一些修改,让它实现回溯词根。
{
"settings": {
"analysis": {
"analyzer": {
"optimizeIK": {
"type": "custom",
"tokenizer": "ik",
"filter": [
"stemmer"
]
}
}
}
}
}
我们新建了一个分析器,它使用ik作为分词器,使用stemmer作为过滤器。stemmer是elasticsearch自带的一个提取词干的算法,类似的还有snowball,都支持多种语言,有兴趣可以作比较。它将在ik对文档完成分词之后,将其中的英文单词做提取词干处理。
测试一下:
-POST {index_name}/_analyze?pretty&analyzer=optimizeIK
“I like cats”
返回结果:
{ “tokens”: [ { “token”: “i”, “start_offset”: 1, “end_offset”: 2, “type”: “ENGLISH”, “position”: 1 }, { “token”: “like”, “start_offset”: 3, “end_offset”: 7, “type”: “ENGLISH”, “position”: 2 }, { “token”: “cat”, “start_offset”: 8, “end_offset”: 12, “type”: “ENGLISH”, “position”: 3 } ] }
至此,optimizeIK分析器同时拥有了中文+外文分词的功能。
如果你想把这个分析器设成该index的默认分析器,给它的命名叫default即可。