es默认的语言分析器standard只能对英语语言进行简单处理,无法将变形后的单词还原为词干。
es中提供了很多词干提取器:
譬如基于算法的 Porter stemmer,基于算法和内置词典的kstem和基于外置词典的hunspell
在使用language analyzers的英语分析器时默认就是使用的porter stemmer。不过该词干提取器效果并不是很好。
有两种方案修改:
使用kstem
token filter
PUT /my_index
{
"settings": {
"analysis": {
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
},
"light_english_stemmer": {
"type": "stemmer",
"language": "light_english"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
}
},
"analyzer": {
"english": {
"tokenizer": "standard",
"filter": [
"english_possessive_stemmer",
"lowercase",
"english_stop",
"light_english_stemmer",
"asciifolding"
]
}
}
}
}
}
上面的词干提取器快速,但还是无法解决特殊单词的问题。譬如flies->fly
如果要精确就可以使用hunpell词干提取器,改提取器可以自定义变形单词
1,去下载相关的语言处理包
http://download.services.openoffice.org/contrib/dictionaries/
2:将语言处理包配置在es的config目录下
config/ └ hunspell/ └ en_US/ ├ en_US.dic ├ en_US.aff └ settings.yml
settings.yms:
ignore_case: true strict_affix_parsing: true
3:自定义分词器
PUT /my_index3
{
"settings": {
"analysis": {
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
},
"hunspell_en_US": {
"type": "hunspell",
"language": "en_US"
}
},
"analyzer": {
"english": {
"tokenizer": "standard",
"filter": [
"lowercase",
"english_stop",
"hunspell_en_US",
"asciifolding"
]
}
}
}
}
}
asciifolding是去除特殊字符
kstem
token filter
测试一下新的分析器
POST my_index3/_analyze
{
"analyzer": "english",
"text": "flies"
}
分词之后的结果
{
"tokens": [
{
"token": "fly",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
}
]
}
还可以编辑en_US.dic进行自定义单词转换